objective-c - 从 Mac 应用程序可执行文件中删除代码签名

标签 objective-c macos assembly

我有一个已签名的 Mac 应用程序可执行文件。我使用代码签名的可执行文件的内容初始化了 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 

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

所以我的问题是如何删除 Objective C 中二进制文件的代码签名?

最佳答案

感谢所有道德传道者,感谢你们照亮了我的人生,展示了人生的道德之路。 😏

据我所知,这根本没有很好的记录,但您也许可以通过以下方式删除代码签名:

      codesign --remove-signature appName

替代方式:

修补解密的文件(删除 LC_CODE_SIGNATURE) —————————————————————————————

在继续之前,请确保您已精简文件(同上 --arch i386)。

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

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

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

    • 修改加载命令的大小(从偏移 0x14/20 开始,4B 大小)。
    • 请记住,对于 Intel,您需要交换字节才能获取值... 如果它读作 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) 的内容。 在这种情况下,总共的加载命令应该始终是: 英特尔:0x1D00000010000000 PPC:0x0000001D00000010
    • 删除实际的代码签名。 在 Intel 和 PPC 上均以 0xFADE0CC0 开头。 将整个代码签名替换为 0x00 字节。

关于objective-c - 从 Mac 应用程序可执行文件中删除代码签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44872071/

相关文章:

assembly - 如何在 ARM 汇编中屏蔽字节?

iphone - 如何在 iOS 中实现这一点?

python文件输入输出添加最后三个字符

c - 声明一个结构并定义包含在 {} 中的值是否有效?

c - 用 C 语言编程 Arduino,中断 vector 会起作用吗?

c - 是否可以在 C 中创建 pow(double a, double b) 函数而无需汇编?

iphone - 如何识别屏幕上的对角线滑动?

ios - 什么时候使用 NSString stringWithFormat;

ios - 应用程序启动结束时的 Root View Controller

macos - 通过 cocoalibspotify 添加或删除播放列表时收到通知