在修改某游戏的时候遇到一修改游戏代码就崩溃的情况,原因是游戏有完整性检测(integrity checks),找到一个过检测的方法, 给大家分享下.
思路: hook时修改EIP寄存器的值来实行自己的代码
例子程序:CE自带的新手教程程序
这里使用CRC算法来举例子
.
1.先看下常用的hook方式怎样触发检测,
直接跳到第二关,用CE找到修改health值的代码是Tutorial-i386.exe+2578F - 29 83 AC040000 - sub [ebx+000004AC],eax
用ce的主动汇编进行代码注入天生脚本来实验修改 [ebx+000004AC]的值
2.在论坛找了一段crc检测的代码, 来查抄 Tutorial-i386.exe+2578F 开始,向后20个字节的内存
3.启动第一步的脚本, 发现脚本会修改 Tutorial-i386.exe+2578F 处的字节码 , jmp到自己申请的内存, 实行后再跳回被hook地址的下一条,
因为这里修改了被检测的处的内存, 以是会触发检测,控制台输出;
手动修改EIP
1. 我们先将自己的汇编代码注入到进程中, 但是不改变 Tutorial-i386.exe+2578F 地址处的字节码, 将脚本稍作修改;
2.手动在 Tutorial-i386.exe+2578F 下断点, 修改EIP到申请到的地址(newmem, 我这里是 `001a0000` )
修改完实行, [ebx+000004AC] 的值乐成被修改为 9999。并且未触发检测
明确了思路, 每次手动操作显然不方便, 下面看下主动化
主动化
方法一、
1.首先还是要将自己的代码注入到进程中, 不修改Tutorial-i386.exe+2578F 地址处的字节码, 直接实行这段脚本申请地址
2.在Tutorial-i386.exe+2578F 地址上右键 -> Change register at this location -> 把EIP的值修改成上面申请的地址(001A0000)
这里主动化了手动修改EIP的操作, ce会在此处下断点,然后修改EIP的值到目标地址, 也可改变其他寄存器和标志位的值,
这样功能实现了, 但每次重开还是要手动操作一遍步骤
方法二、使用主动汇编脚本实现整个流程
1. 先看下几个用到的CEAA函数, 在帮助文档或wiki可以找到具体使用方法
- getAddress - 获取符号(使用registersymbol注册)地址
- reinitializeSymbolhandler - 重新加载符号, 可以避免一些符号找不到的错误
- debugProcess - 启动调试器
- debug_setBreakpoint - 设置断点
- debug_removeBreakpoint - 移除断点
- autoAssemble - 实行一段主动汇编文本
2.上码,
来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |