内容参考于:易道云信息技术研究院VIP课
上一个内容:通过逆向分析确定游戏明文发送数据过程
上一个内容中得出它是使用的send函数发送的数据包,所以接收数据它指定用的是recv函数接收的数据
然后在跳转recv函数分析时发现跳转到了wsock32.dll里的recv,recv是Windows api,应该是跳进 Ws2_32.dll里才对
微软文档写的recv函数:recv 函数 (winsock2.h) - Win32 apps | Microsoft Learn
通过百度wsock32.dll和ws2_32.dll区别,发现:http://t.csdnimg.cn/U7Dgl
如果上方我百度的东西看不懂,自行百度 wsock32.dll和ws2_32.dll区别 这个关键字找
然后x96dbg按ctrl+g跳转时,可以加模块名,如下图
然后它就断下来了
然后按ctrl+f9,再按f8,来到下图位置,然后下图中call的函数时0Rdinal#16它没有写调用的recv,这个原因是没有fxnet2.dll的符号表,这个符号表是游戏的,我们没法下载,自己备注一下这个函数名也一样
recv函数的返回值是长度,下图中可以看出它返回了800个字节,这说明,不只有一个数据包,一个数据包不可能这么哒
然后它的入参有一个0x800,这个应该是接收数据的内存大小
然后往下滑,看到esp+edi+0x37C,也就是esp+0x37C位置就是接收数据的内存空间,它有800个大小
然后函数头部,进行了压栈B78
然后b78-37c=7FC,7FC+4=800,正好是内存大小
然后往下滑可以看到,现在处于循环中,就是遍历的接收的数据包
然后当数据循环到0xEE位置,就来到了下图函数里,这说明,这个函数是处理一个数据包的函数
然后按f7进入函数,看到下图红框位置的函数是一个俩参数的函数,然后从栈里可以看出它的一个参数满足数据长度条件
现在的数据包我们不知道是什么,所以接下来我们发送一个聊天数据,看看它的数据包结构,然后还由于此处函数干扰很重,就是会频繁断下来,所以要下一个条件断点,发送一个很长的数据,然后用esi>0x50这样的条件,就可以断到我们认识的数据上了
输入条件:然后发现0x50还是干扰很大,我所在的地图有很多npc与怪物,所以搞这个的时候要找一个无人的地方,最终加到0x70(esi>0x70)还有所好转
然后断下来了
然后把下图的位置由原本的4改成9
然后把我名字改了,所以它就是明文数据包所在位置
现在记录关键点0x10617FD7,然后现在查看它与发送数据的位置用的是不是一个连接,接收数据的ebx是0x3687B658
发送数据的位置是0x106180A5,然后它的值也是0x3687B658
所以现在已经清楚知道,游戏在建立网络连接的时候会创建一个结构体一个类,它的指针在网络连接的时候就能够截取到,截取到以后发送数据接收数据就能用得到,然后现在之所以分析的过程很简单是因为要少逆向找功能,要利用封包把功能做起来,尽量往脱机的角度走。