C程序执行期间能否修改自身的instruction segment(指令段)?
关于C程序修改Text段(指令段)的可行性说明
结论
默认情况下无法直接修改Text段改变程序执行逻辑,通过特殊系统操作可以实现该需求,具体如下:
- 默认限制原因
现代操作系统为了防范恶意代码篡改程序执行逻辑,默认会将Text段的内存权限设置为 只读+可执行,程序直接写入该区域会触发SIGSEGV段错误,被系统强制终止。 - 可实现修改的两种路径
- 编译期调整段权限:使用GCC编译程序时传入链接参数
-Wl,--omagic,链接器会将Text段设置为可写权限,程序运行时可直接修改该区域的指令内容。 - 运行期动态修改权限:类Unix系统下可以调用
mprotect系统调用,定位到Text段对应的内存页起始地址后,将页权限修改为PROT_READ | PROT_WRITE | PROT_EXEC,之后就可以对指令内容进行修改,操作完成后可将权限改回只读降低误写风险。
- 编译期调整段权限:使用GCC编译程序时传入链接参数
- 风险与限制
- 该操作完全不具备跨平台兼容性,不同操作系统、不同硬件架构的实现逻辑完全不同
- 现代系统普遍启用W^X保护、DEP(数据执行保护)等安全机制,会直接禁止内存页同时拥有可写和可执行权限,该操作大概率会被拦截
- 修改指令需要完全匹配目标平台的汇编指令规范,稍有偏差就会导致程序直接崩溃,属于风险极高的底层操作
内容的提问来源于stack exchange,提问作者Zaratruta
相关产品推荐
相关产品推荐

