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

Jaf*_*iff 2 macos assembly objective-c

我有一个签名的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 
Run Code Online (Sandbox Code Playgroud)

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

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

Jaf*_*iff 6

对于所有道德传教士来说,感谢能够彰显我的生活并展现生命的道德道路.

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

      codesign --remove-signature appName
Run Code Online (Sandbox Code Playgroud)

替代方式:

修补解密文件(删除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)的内容.在这种情况下,总计负载命令应该是:Intel:0x1D00000010000000 PPC:0x0000001D00000010
    • 删除实际的代码签名.这从Intel和PPC上的0xFADE0CC0开始.用0x00字节替换整个代码签名.