无法重编译时直接修改C++二进制使Agent::check恒返回true是否可行
可行性结论
该操作完全可行,不需要重编译整个项目即可实现需求。C++编译后的函数对应二进制文件中一段连续的机器码,只要定位到Agent::check的函数位置,直接修改返回逻辑就能让该方法永远返回true。
操作步骤
- 定位函数入口:用反汇编工具加载目标二进制,优先通过符号表查找
Agent::check的函数偏移地址。如果是剥离了符号表的Release版本,可以借助你手上的源码做特征定位:该函数内部会调用checkCondition,通过交叉引用找调用checkCondition且返回值为bool的函数,很快就能锁定目标位置。 - 修改入口机器码:bool类型返回值在绝大多数平台调用约定下,都是通过特定寄存器存储的,你不需要管函数内部原有判断逻辑,直接在函数最开头写入固定返回true的指令、直接返回即可,不会破坏原有栈平衡——尤其你的
Agent::check是静态成员函数,没有隐式this指针参数,这种改法稳定性极高。不同架构对应写入的机器码如下:- x86 32位 / x86_64 64位平台:写入字节序列
B0 01 C3,对应汇编逻辑为mov al, 0x1; ret,即把返回值寄存器设为1(对应true)后直接返回 - ARM64平台:写入字节序列
20 00 80 52 C0 03 5F D6,对应汇编逻辑为mov w0, #1; ret
- x86 32位 / x86_64 64位平台:写入字节序列
- 保存修改后的二进制,备份原文件后测试运行即可。
注意事项
- 修改前务必备份原始二进制文件,改错偏移位置会直接导致程序运行崩溃。
- 如果目标二进制加了代码签名、内存校验、反篡改保护,修改后需要绕过对应校验逻辑,否则程序会出现闪退、校验失败报错等问题。
- 你持有全部源码,哪怕没法完成全量编译,也可以单独写个最小demo复现这个函数的逻辑编译,对比生成的机器码特征,能大幅提升函数定位效率,比盲翻反汇编代码快很多。
- 不要尝试修改函数内部的分支判断逻辑,直接在函数入口覆盖返回指令是容错率最高的改法,不会触发后续逻辑的栈异常、寄存器污染问题。
内容的提问来源于stack exchange,提问作者DevShark
相关产品推荐
相关产品推荐

