内容参考于:易道云信息技术研究院VIP课
上一个内容:测试需求与需求拆解
在开始之前要了解一个小知识,在逆向开始之前要很清楚知道要找的东西是什么,大概长什么样子,只有这样才能看到它第一眼发现它,现在我们要找的是它发送数据的明文函数,如果它要实现这个过程它这个函数是怎样的函数?要提供那些内容?第一明文的数据包肯定要提供,数据包本质上是一块内存,所以它看起来就会是内存的样子,执行过去之后内存里会有数据,数据是明文的,所以里面一定有我们可以辨识的内容,第二光有数据包不行,数据包它就是一块数据,一个指针,这个内存有多次必须要给出来,所以它会有长度,所以要关注两个参数的函数。
不过也有的数据的长度在数据包里,这样的就会只有一个参数。
所以在逆向的时候要关注两个参数的函数,一个参数是指针,一个参数是长度,或者一个参数的函数,参数是指针
首先观察它是用的什么ip,打开x96dbg,在connect、WSAConnect函数上下断点
connect上,下断点
WSAConnect函数上,下断点
然后会发现是通过 connect函数进行与服务器连接的
然后可以在栈里看到ip地址与端口
然后在调用connect函数的位置,调用玩connect函数之后我们就可以获取它的socket,所以记录一下调用connect的位置,0x10617E04
然后再按一次ctrl+f9,再按f8,来到下图位置
然后这个函数它的入参是ip地址与端口,这是一个虚函数,ecx是对象指针,这里记录一下位置0x10617048,这里的ecx的值可能有用也记录一下 0x3696AD00
现在连接的已经知道了,现在看发送的,在send、WSASend函数上下断点
根据函数名跳转的方式,按ctrl+g,然后再弹出的窗口输入函数名,然后点确定就可以了,如下弹框
send函数下断点
WSASend函数下断点
然后它在send函数里断下来的,所以它用的send函数
然后来到调用它的位置
然后下图红框里的代码,esi是一个对象指针,至于为什么不使用ecx而是使用esi,这说明用的不是Visual Studio的编译器编译的代码
然后下图红框位置直接告诉了我们下方是发送失败的处理
然后现在是处在发送的位置,然后往上找就能找到加密的位置了,然后按ctrl+f9再按f8来到上一层,现在位置:0x106180A5
由于现在看不出什么东西,所以再按ctrl+f9,再按f8,来到上一层,然后就来到下图红框位置,可以看出它有两个参数
然后断点看它的参数是什么,参数是一个指针,和一个数字,这个数字太符合长度的样子,然后内容现在看不懂,因为不知道现在是个什么样的数据包
这时需要搞一个我们认识的数据包,比如发送聊天数据,然后就看到了明文,在发送聊天数据时要注意,游戏会有心跳包,发送聊天数据的时候要快点,不要让心跳的数据包触发了断点
然后我们把这个数据更改一下,把2改成了8,然后记录一下这里的位置0x10615B97
然后发送的数据也被改了
然后再刚开始connect哪里有一个指针,但是游戏我退出过,上方的指针变了,所以为了验证猜测重新在connect位置打断点,然后再发送一个数据看看,它俩是不是一个东西
connect:现在是0x368B7C0
send位置:0x368CB7C0,它与connect哪里的ecx一模一样,也就是说它是一个很重要的东西
0x368CB7C0可以通过hook掉 connect哪里的函数也就是hook0x1061704B位置
经过在send函数位置看到的数据包,发现它未加密,数据包中也没有长度,然后数据包最后只拼接了一个EE防止粘包,由此可见这是一个有问题的数据包,现在的客户端应该是一个早期版本,功能不全,但是也不影响我们逆向
下图中备注处理数据的位置是在调用send函数之前,一般加密操作都会这样,但现在的客户端是一个早期版本它并没有加密操作,只把数据拼接到数据然后在最后拼接一个EE,就完了