上回我们说到,怎么使用三大系统发包函数,无脑 Ctrl+F9 定位游戏的功能函数(Call),
只需要我们找到游戏使用哪一个发包函数与服务端通信,就相当于得到了游戏的全套功能。
太容易了,肯定不会让我们这么轻易的快乐~ 所以一般都对发包函数做了一些处理。
比如,我们通常喜欢在发包函数头部下断,可能厂商会在头部做一些处理,加一些 CRC
检测啊,让我们下断就崩溃。因为 F2 断点实际上是修改了程序代码了——把选中的一段指
令替换成 int3,所以程序执行到断点处才会断下,自然也有可能被检测到。
解决也简单,大不了…我们不下 F2 断点了呗。
右键选中代码处——》断点——》硬件执行,效果差不多但是硬件断点不修改代码。
但是硬件断点只能同时存在四个,使用完不要忘记及时清除。
或者让我们在头部下断 断不下来,遇见这种情况可以先试试往下面一点的代码处下断,
看看它断不断。
但是如果咱们怎么折腾三个系统发包函数,就是没啥反应。那很可能是游戏重写了发包
函数,不走那三个系统 API 了,自然我们就断不到了。
哇靠,它重写了发包函数诶。那我们怎么知道它的发包函数是啥,怎么去找到它?怎么
去下断?不能再愉快的 Ctrl+F9 了,难受~!
听起来好像很牛 X 的样子,其实也就那样。其实发包函数里面代码写法 90%都是固定的,
我们自己也能玩,无非就是把 send 或者其他系统发包函数代码重新抄了一份,想发包的时
候我不调用 send 了,我调用我自己的发包函数,基本上某鹅的游戏都喜欢玩这一招。
既然我们知道了原理,自然就有了破解之法。其实 WSASend send sendTo 这三大发包函
数,都需要调用一个更底层的系统函数 WSPSend,那么重新实现的发包函数必然也要调用
WSPSend,所以我们只要定位到 WSPSend,在其头部下断,使用我们的老朋友 Ctrl+F9 就可
以返回到调用它的发包函数,管它是自己实现的 还是 调用系统的。
那么如何定位?Ctrl+G WSPSend?没用,因为这个函数本来就不是给我们调用的,我们
应该调用 WSASend send sendTo。
很简单,随便找一个能发包的程序(三大发包函数能断下的那种),去它的发包函数里面
找一找就 OK 了,因为 WSPSend 在同一台电脑上的地址是相同的, 并不会因为进程的不同就
变化无常。
下面我们以口袋西游为例,OD 工具附加,Ctrl+G 跳到 send 函数区域,我们可以看到里
面调用了非常多的系统函数,其中一个 Call 寄存器的函数就是 WSPSend。系统不同可能略
有不同,win7 可能是 call dword ptr [eax+64]
在上面 call 指令上下断点,按 F7 单步步入,来到了 WSPSend 函数内部,同理不同系统
可能略有不同。
然后我们把函数地址复制下来。
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 就可以返回到游戏使用的发包函数,不管它是不是自己重新实现了发包函数。
这样我们又能愉快的 Ctrl+F9 啦,是不是很简单?你可能说这有啥?这算个啥?厂商程
序员都是吃干饭的么?
所以就有了更绝的处理方式——线程发包,有可能和重新实现发包函数混合使用,老千
层饼了~ o( ̄▽ ̄)ブ
线程发包处理方式,略有些复杂咱们下回见分晓~!
转载:https://blog.csdn.net/qq_36553941/article/details/112284671