如何通过CE(C++)获取汇编指令的静态地址
解决内存值被自动恢复及获取写入指令静态地址的方法
一、定位写入目标地址的动态指令
- 打开Cheat Engine并附加到目标进程,定位到你已通过
playerBase特征扫描+偏移得到的目标值静态地址 - 右键该地址,选择
查找写入该地址的代码,CE会暂停进程,此时触发会导致值被恢复的操作(比如触发player::update或player::reset) - 操作触发后,CE会列出所有写入该地址的指令,选中对应
player::update/reset的那条写入指令
二、从动态指令地址推导静态地址
- 右键选中的指令,选择
查看内存中的地址,记录下该指令的动态虚拟地址(例:0x7FF6A1234567) - 打开CE的
内存视图,跳转到该动态地址,查看指令所属的模块(如游戏主程序Game.exe或某个Game.dll) - 从内存视图的模块列表中获取该模块的基地址(例:
0x7FF6A1000000),计算静态偏移:
(例:静态偏移 = 动态指令地址 - 模块基地址0x7FF6A1234567 - 0x7FF6A1000000 = 0x234567) - 该偏移即为指令的静态相对地址,后续只需获取模块当前基地址,通过
模块基地址 + 静态偏移即可得到实时动态指令地址
三、将写入指令替换为NOP的实操
- 每次启动游戏后,先获取目标模块的基地址(可通过CE模块列表查看,或读取PE头自行计算)
- 计算出当前指令地址后,将对应长度的指令替换为
NOP字节(如4字节指令替换为0x90 0x90 0x90 0x90) - 也可直接使用CE的
代码注入功能,CE会自动处理ASLR带来的基地址随机化问题,直接完成NOP替换
补充技巧
- 若指令所在模块无强壳,可提取该指令的机器码作为特征,用CE的
特征扫描直接定位静态偏移(例:mov [rax+0x123], edx对应的机器码48 89 90 23 01 00 00) - 若游戏加壳(如VMProtect、VMP),需先脱壳再进行上述操作,否则模块基地址会被壳干扰
内容的提问来源于stack exchange,提问作者elementalpossession
相关产品推荐
相关产品推荐

