奕奕平台检测那点事
上回说到,我们找到了11平台第一个反作弊程序段:调用WriteProcessMemory()重写Game.dll代码。
这里介绍一种常用的过检测方法。
找到检测函数,修改代码头直接返回,不执行此函数。
从WriteProcessMemory这个断点我们能得到很多信息,看堆栈,寻找函数调用流程。[esp]里通常装的是call WriteProcessMemory()的下一条指令,这里我们在堆栈区esp位置右键,反汇编窗口跟随,会跟到如下代码段。

我们看到了GetCurrentProcess(),紧接着就是WriteProcessMemory(),很明显就是这段代码还原了Game.dll.
我们往上一直寻找,直到找到
mov edi,edi
push ebp
mov ebp,esp
代码,这是通常的代码头。也有可能没有mov edi,edi这一句(这里就没有)。
有关mov edi,edi这一句其作用等同于nop,nop,目的是和push ebp mov ebp,esp在一起凑成5字节可以写HOOK跳转。而之所以不用nop,nop据说是因为其代码执行效率比nop,nop快。
找到代码头先不能简单的写ret。为了维护栈平衡,我们要找到函数本身的代码尾巴,找到函数正常返回是返回多少。
具体找的过程我就不赘述了,实在找不到就在函数里下个断点,一直F8步过跟踪,或者Ctrl+F9执行到返回。总之,这里应该ret 8.
下面我们再开一局测试一下,验证我们的修改有没有效。
(开发辅助就是要有耐心,有了新的想法就一定要及时测试,好知道下一步是接着这个思路还是另辟蹊径。另外,测试时会被“囚”好多好多账号,所以提前一定要申请大量小号。申请小号如果申请一定数量之后就会总结一些小技巧,比如申请的账号不必验证邮箱,申请账号的邮箱不必是真的,随便写一个没注册过的就可以,姓名和身份证是不会验证的。。。我是不是说的有点多了。如果你还嫌麻烦可以自己写个小程序申请。)
测试时因为这个函数是在游戏开局1min以内就执行了,所以我们修改时一定要快。OD在等待游戏开局时最好就附加上,然后定位到刚才的代码头。
(OD是有断点记忆功能的,如果上次退出时在函数头下F2断,下次进入游戏OD会自动定位代码头并下断。该定位应该是模块地址+偏移找到的,因为每次魔兽11xp.dll加载的地址可能不同,在xp系统下有可能相同,但win7X64上一定不会相同,所以以后我们所有要修改的位置都要记住代码的相对位置,就是相对于11xp.dll的位置。)
当函数断下来时,看OD标题栏提示的信息,代表断点所在代码位于什么模块内(行话叫“领空”)。
至于相对位置怎么记,可以记下当前代码位置,再打开OD的可执行模块列表,找到该模块的起始位置(基地址,也就是模块句柄,用GetmoduleHandle("11xp.dll")获取的值),用十六进制计算器计算差就是偏移。我更喜欢在CE中找,因为CE的“视图”中有“显示模块地址”,直接显示的就是现对于某模块的地址。此处代码头相对位置是11xp.dll+6cd60.
测试结果:好消息和坏消息。
好消息是:对WriteProcessMemory下断会发现确实不调用了,这意味着我们对于6f361f7c写0不会被还原了。
坏消息:当不对6f361f7c修改,单纯只测试函数代码头ret 8进行游戏时,到4分半左右就会提示“作弊嫌疑”,被T下线了。
我们没修改6f361f7c,也就是说我们没“开图”,但是还是检测到了,什么原因?
假如我们是奕奕公司的,我们除了对Game.dll校验之外,还比较关心游戏哪里会被修改?
肯定是检测Game.dll的那一部分代码。
就是CRC之上的CRC,用来校验11xp.dll的代码是否被修改。
这个问题就有点棘手了。这里的代码只要一动,就会被T,更别说开图了。
欲知后事如何,且看奕奕平台全图制作第四弹之山人自有妙计。