揭秘封包辅助外G:处理游戏重写发包函数(二)

上回我们说到,怎么使用三大系统发包函数,无脑 Ctrl+F9 定位游戏的功能函数(Call),
只需要我们找到游戏使用哪一个发包函数与服务端通信,就相当于得到了游戏的全套功能。

揭秘封包辅助外G:处理游戏重写发包函数(二)
太容易了,肯定不会让我们这么轻易的快乐~ 所以一般都对发包函数做了一些处理。

揭秘封包辅助外G:处理游戏重写发包函数(二)
比如,我们通常喜欢在发包函数头部下断,可能厂商会在头部做一些处理,加一些CRC检测啊,让我们下断就崩溃。因为F2断点实际上是修改了程序代码了——把选中的一段指令替换成 int3,所以程序执行到断点处才会断下,自然也有可能被检测到。

揭秘封包辅助外G:处理游戏重写发包函数(二)
解决也简单,大不了…我们不下F2断点了呗。右键选中代码处——》断点——》硬件执行,效果差不多但是硬件断点不修改代码。

揭秘封包辅助外G:处理游戏重写发包函数(二)
但是硬件断点只能同时存在四个,使用完不要忘记及时清除。

揭秘封包辅助外G:处理游戏重写发包函数(二)
揭秘封包辅助外G:处理游戏重写发包函数(二)
或者让我们在头部下断 断不下来,遇见这种情况可以先试试往下面一点的代码处下断,看看它断不断。

但是如果咱们怎么折腾三个系统发包函数,就是没啥反应。那很可能是游戏重写了发包函数,不走那三个系统API了,自然我们就断不到了。

哇靠,它重写了发包函数诶。那我们怎么知道它的发包函数是啥,怎么去找到它?怎么去下断?不能再愉快的Ctrl+F9了,难受~!

揭秘封包辅助外G:处理游戏重写发包函数(二)
听起来好像很牛X的样子,其实也就那样。其实发包函数里面代码写法90%都是固定的,我们自己也能玩,无非就是把send或者其他系统发包函数代码重新抄了一份,想发包的时候我不调用send了,我调用我自己的发包函数,基本上某鹅的游戏都喜欢玩这一招。

揭秘封包辅助外G:处理游戏重写发包函数(二)
既然我们知道了原理,自然就有了**之法。其实WSASend send sendTo这三大发包函数,都需要调用一个更底层的系统函数WSPSend,那么重新实现的发包函数必然也要调用WSPSend,所以我们只要定位到WSPSend,在其头部下断,使用我们的老朋友Ctrl+F9就可以返回到调用它的发包函数,管它是自己实现的 还是 调用系统的。

那么如何定位?Ctrl+G WSPSend?没用,因为这个函数本来就不是给我们调用的,我们应该调用WSASend send sendTo。

揭秘封包辅助外G:处理游戏重写发包函数(二)
很简单,随便找一个能发包的程序(三大发包函数能断下的那种),去它的发包函数里面找一找就OK了,因为WSPSend在同一台电脑上的地址是相同的, 并不会因为进程的不同就变化无常。

下面我们以口袋西游为例,OD工具附加,Ctrl+G跳到send函数区域,我们可以看到里面调用了非常多的系统函数,其中一个Call 寄存器的函数就是WSPSend。系统不同可能略有不同,win7可能是 call dword ptr [eax+64]

揭秘封包辅助外G:处理游戏重写发包函数(二)
在上面call指令上下断点,按F7单步步入,来到了WSPSend函数内部,同理不同系统可能略有不同。

揭秘封包辅助外G:处理游戏重写发包函数(二)
然后我们把函数地址复制下来。
7269DE70 6A 3C push 0x3C
7269DE72 68 C0196B72 push mswsock.726B19C0
7269DE77 E8 30D3FEFF call mswsock.7268B1AC
7269DE7C 33DB xor ebx,ebx
7269DE7E 895D D8 mov dword ptr ss:[ebp-0x28],ebx
7269DE81 8D45 C4 lea eax,dword ptr ss:[ebp-0x3C]

后面寻找游戏使用的发包函数,只需要Ctrl+G 填入WSPSend地址,跳入在其头部下断,Ctrl+F9就可以返回到游戏使用的发包函数,不管它是不是自己重新实现了发包函数。

揭秘封包辅助外G:处理游戏重写发包函数(二)
这样我们又能愉快的Ctrl+F9啦,是不是很简单?你可能说这有啥?这算个啥?厂商程序员都是吃干饭的么?

所以就有了更绝的处理方式——线程发包,有可能和重新实现发包函数混合使用,老千层饼了~ o( ̄▽ ̄)ブ

线程发包处理方式,略有些复杂咱们下回见分晓~!

揭秘封包辅助外G:处理游戏重写发包函数(二)