修改Mach-O可执行文件后触发SIGKILL,如何正常执行?
问题分析
你遇到的核心问题是Apple Silicon macOS的AMFI(Apple Mobile File Integrity)机制在严格校验代码签名:修改二进制后原签名的完整性被破坏,而手动替换哈希无法修复签名——因为Mach-O的代码签名是一个完整的加密签名块,不是单个可替换的哈希值,它包含了文件各段的哈希摘要,且由私钥签名,单纯修改哈希字段根本过不了加密校验。
解决方法
以下两种路径可解决问题,根据你的实验场景选择:
方法一:临时禁用AMFI(快速测试用)
这是最快让修改后的二进制运行的方式,仅适合本地学习实验:
- 重启Mac,按住电源键直到进入恢复模式
- 打开终端,执行命令:
csrutil disable --no-internal - 重启系统后,修改后的
c.out即可正常执行 - 实验完成后务必恢复安全机制,重新启用AMFI:
csrutil enable
方法二:重新签名二进制(合规方式)
如果不想关闭系统安全校验,可给修改后的二进制重新签名:
- 创建自签名代码签名证书:
- 打开「钥匙串访问」→ 顶部菜单「证书助理」→「创建证书」
- 名称填
MyTestSigner,证书类型选「代码签名」,勾选「让我覆盖这些默认值」,按引导完成创建
- 用
codesign工具重新签名c.out:codesign -s "MyTestSigner" --force --deep c.out - 执行签名后的
c.out即可正常运行
为什么替换哈希没用?
Mach-O的LC_CODE_SIGNATURE加载命令对应的签名数据块包含:
- 文件各代码段、数据段的哈希摘要
- 签名者的证书链
- 用私钥对上述内容生成的数字签名
你手动替换的只是其中一个片段,无法匹配整个签名块的加密校验逻辑,AMFI依然会判定签名无效。
内容的提问来源于stack exchange,提问作者Kirkland
相关产品推荐
相关产品推荐

