探究一下无敌功能是怎么实现的。知己知彼百战不殆,懂得它的实现,能够更好地找出禁止作弊的对策。这篇文章先解析实现,后续文章补充对策。
一、整体思路
1、使用CE工具找出血量条,读取数值
2、CE工具首次搜索数值,找到内存中具有该数值的地址群
3、当血条下降,再次搜索下降后的数值,通过二次搜索,确定地址群中真正的写入数据的地址。这个地址通常是基址+xxxx的表现形式。此时锁住地址,游戏中实验一下,若不扣血,则对。
4、通过该地址查询到所在的扣血执行函数
5、区分锁血的是否是自己想要锁血的对象,因为扣血函数会处理所有对象的扣血。
6、考虑区分扣血对象的实现方式。1)通过对字符串的比较区分 2)通过形成一个枚举,不同数值比较来确定对象。基本可以确定是第2种
7、分析完扣血函数,对其改造,将sub xx,xx的第二个数值换为0
8、在CE中改造汇编指令并验证,若验证成功则转入代码实现
9、通过FindWindowA、GetWindowThreadProcessId、OpenProcess等函数确定进程
10、VirtualAllocEx申请内存空间
11、VirtualProtectEx,赋权
12、将之前的汇编代码对应的二进制指令,通过WriteProcessMemory hook。需要非常注意的是jmp,call,jnz,jne之类的转移指令,对应对 的二进制指令是偏移地址,一定需要转化
13、使用OD工具分析注入后的功能代码对应的汇编指令是否符合预期,这非常重要
14、功能验证
二、实现中需要注意的点