在修改某游戏的时间碰到一修改游戏代码就崩溃的情况,缘故原由是游戏有完整性检测(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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |