好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 yyltwin 于 2020-5-28 17:05 编辑
在修改某游戏的时候遇到一修改游戏代码就崩溃的情况,原因是游戏有完整性检测(integrity checks),找到一个过检测的方法, 给大家分享下.
思路: hook时修改EIP 寄存器的值来执行自己的代码
例子程序:CE自带的新手教程程序
这里使用CRC算法来举例子
.
1.先看下常用的hook方式如何触发检测,
直接跳到第二关,用CE找到修改health值的代码是Tutorial-i386.exe+2578F - 29 83 AC040000 - sub [ebx+000004AC],eax
用ce的自动汇编进行代码注入生成脚本来尝试修改 [ebx+000004AC]的值
1
2.在论坛找了一段crc检测的代码, 来检查 Tutorial-i386.exe+2578F 开始,向后20个字节的内存
2
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.上码,
|
免费评分
-
查看全部评分
本帖被以下淘专辑推荐:
- · 学习及教程|主题: 1131, 订阅: 1123
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|