从mac app可执行文件中删除代码签名

时间:2017-07-02 14:51:25

标签: objective-c macos assembly

我有一个签名的mac app可执行文件。我用代码签名可执行文件的内容初始化NSMutableData。然后我修改了可执行文件的一部分,并保存了修改后的可执行文件。当我尝试使用此修改后的可执行文件运行原始应用程序时,应用程序崩溃了。

崩溃日志是,

 System Integrity Protection: disabled

 Crashed Thread:        0  Dispatch queue: com.apple.main-thread

 Exception Type:        EXC_CRASH (Code Signature Invalid)
 Exception Codes:       0x0000000000000001, 0x0000000000000000
 Exception Note:        EXC_CORPSE_NOTIFY

 Termination Reason:    Namespace CODESIGNING, Code 0x2 

从崩溃日志中可以清楚地看到它因代码签名无效而崩溃。 我没有应用程序的源代码,我只是想在别人的旧应用程序中修复一些错误。

所以我的问题是如何在目标c中删除二进制代码签名?

1 个答案:

答案 0 :(得分:5)

对于所有的道德传教士,感谢我的生活,并展示了生活的道德道路。

根据我所知,它根本没有完整记录,但您可以通过以下方式删除代码签名:

      codesign --remove-signature appName

替代方式:

修补解密文件(删除LC_CODE_SIGNATURE) ------------------------------

确保在继续之前已将文件缩小(ditto --arch i386)。

要删除代码签名,您需要执行以下步骤: 注意:Intel Mach-O二进制文件以0xCEFAEDFE开头              PPC Mach-O二进制文件以0xFEEDFACE

开头
    • 修改加载命令的数量(从偏移量0x10 / 16开始,4B大小)。

    • 如果加载命令是例如0x2C减去0x1 - > 0x2B访问。

    • 修改加载命令的大小(从偏移量0x14 / 20开始,4B大小)。
    • 记得英特尔你需要交换字节来获取值... 如果它读作FC 17 00 00,则实际上是0x000017FC
    • 从值中减去0x10或16。在上面的情况中 - > 0x000017EC
    • 再次交换字节(对于Intel)。因此,0x000017EC是EC 17 00 00
    • 修改LC_CODE_SIGNATURE的加载命令条目中的16个字节。 将它们替换为16 x 0x00。 此条目以Intel上的0x1D000000和PPC上的0x0000001D开头。
    • 这修改了加载命令(8B)和加载命令(8B)的内容。 在这种情况下,load命令总共应该是: 英特尔:0x1D00000010000000 PPC:0x0000001D00000010
    • 删除实际的代码签名。 这从Intel和PPC上的0xFADE0CC0开始。 用0x00字节替换整个代码签名。