文章目录
明文封包call的作用定位发包函数定位线程发包跳出线程发包定位喊话callTip
明文封包call的作用
在网络游戏中,客户端和服务器的通信基于一系列的数据包。每个数据包都类似于一条指令,客户端和服务器在这个系列指令中完成指定动作。
客户端要与服务器进行通信,必须调用下面的三个发包函数发送数据包
send();
sendto();
WSASend();
那么我们只要在这三个函数下断点,然后进行堆栈回溯分析,就能准确定位关键的函数调用链。在这条链上,快速排查出需要的功能call。
明文封包call的意义在于找到了这个call就相当于找到了百分之90的游戏功能。
但是找发包函数的时候经常会遇到两个问题,一个是重写发包函数,一个是线程发包;传奇永恒属于第二种情况,线程发包。
这里不细讲跳出线程发包的原理,如果这篇文章有某个步骤没有看懂可以去看我另外一篇博客
封包式游戏功能的原理与实现 https://blog.csdn.net/qq_38474570/article/details/105498820
定位发包函数
首先在send函数下断,断点断下,说明这个游戏是采用send函数进行发包
定位线程发包
走路让断点断下,此时堆栈最大的地址是0x1A98。由于x64dbg的调用堆栈看起来不方便,这里看堆栈地址是一样的。
然后喊话再让游戏断下,此时堆栈的最大地址还是0x1A98。两个功能调用时的堆栈地址一样。说明这个游戏采用了线程发包。
跳出线程发包
接着观察第二个参数rdx,rdx作为包内容,地址一直在发生改变。这里就要往上追到rdx的来源,不用追基地址,追到这个地址不发生改变即可。跳出线程发包的关键就是往包地址下写入断点。
往上追rdx
rdx等于rax+rdx,此时rdx为零,追rax
rax来源于rbx+rcx,但是rcx等于0,所以我们只要追rbx
rbx来源于rax
再进call内追rax就追到了一个数组
[[rcx+0xC]+[rcx+0x4]*8]
可以得到这样一个公式,rcx是数组首地址
下断观察,此时rcx的值不会发生改变
rcx这个数组+8的位置是数组大小,每次发包之后,数组大小都会递增。那么现在我们已经找到了包内容的固定地址了
[[rcx+0xC]+[rcx+0x4]*8]
只要在这个地址下访问断点就能跳出线程发包
[0xD80D3EC+0xC]+[0D80D3EC+0x4]*8
替换一下rcx的值
但是这里有一个问题,这个地址并不存在。这个地址不存在的原因是因为
[0D80D3EC+0x4]
这个地址原本想要取出来的是数组的大小也就是0x510的这个值,但是现在直接取出来的话,取出来的是整个QWORD的值,所以会提示这个地址不存在。这样我们就需要修改一下公式
[0xD80D3EC+0xC]+([0D80D3EC+0x4]&0xFFFFFFFF)*8
让[0D80D3EC+0x4]的值和0xFFFFFFFF进行与运算,这样取出来的就是DWORD的值
这样取出来的地址就是有效的
这个地址里面就是所有的包内容,在包内容随便一个位置下硬件写入断点。然后跑到人多的地方走路
由于这个数组的大小是0x800,当这个值等于800时,整个数组才会重置,所以我们要一直走路,走满0x800个封包,等待断下(确实很烦,这特么什么设计~)
等待完成之后,断点断下
接着执行到返回,记录下每层的返回地址。按照游戏的常规套路,一般第一层是封包加密call,第二层是明文封包call,第三层是功能call。
功能call->明文封包->加密封包->线程发包->send
定位喊话call
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ZEOw4W3-1645429671837)(007 定位明文封包call.assets/1641303351421.png)]
我们在第二层的头部下断,然后喊话,可以看到堆栈已经出现了喊话内容
观察此时的参数,rcx是一个字符串,rdx是基地址,r8是喊话的长度,而r9是喊话内容。这个就是我们要的喊话call。那么后续就可以通过这个明文封包call,来定位想要的功能call了。
Tip
这里整理两个找明文发包call的小技巧
避开干扰多的地方,比如玩家多的地方 心跳必然多尽可能找一个发包少的功能,比如创建角色
下一篇文章我们来通过明文发包call,定位一下释放技能call,然后开始写自动打怪的逻辑代码。
Github:https://github.com/TonyChen56/GameReverseNote
完整代码:https://download.csdn.net/download/qq_38474570/79498815