记踩上codesign的一个仍未修复的远古bug

tl;dr

codesign --remove-signature 在删除代码签名之后没有修复MachO Header的偏移,导致生成的MachO文件畸形。我很确定应该有无数人踩过这个坑,自己研究一遍权当练习

正文

以Dash为例,操作之后的app打开直接crash,以lldb file后报warning:


warning: (x86_64) /Applications/Dash.app/Contents/MacOS/Dash load command 3 LC_SEGMENT_64 has a fileoff + filesize (0x335ed0) that extends beyond the end of the file (0x335ec4), the segment will be truncated to match Current executable set to '/Applications/Dash.app/Contents/MacOS/Dash' (x86_64).

用MachOView打开可执行文件,定位到最后一个LC_SEGMENT:


简单的做下数学验证: 0x31D000+0x18ED0=0x335ED0,比文件实际大小0x335ec4大出0x335ED0-0x335ec4=0xC

将原来的File Size 减少0xC,改为0x18ec4,保存

这里正确的做法是根据原版的LC_CODE_SIGNATURE计算正确的新大小而不是无脑修改到文件末尾, 只不过对于我们的使用需求而言这么做足够了

结论

1 Like

强势点赞

原来是这么一回事

我完全米有看懂张总在说什么……想发一个微博,又不知道该发点什么,我的心好累……

泥潭作为 iOSRE应该用不到这些,我就做个笔记留给未来遇到同样问题的人

https://blog.0xbbc.com/2017/05/codesign-remove-signature-generates-malformed-macho/

啊,不想编辑md了_(: 」∠)_

简单来说就是有可能是 LLVM 的 LTO 支持导致的,细节和解决方案在上面的链接中。

update:
今天用找来了LLVM的LTO,编译之后可以用,于是又是谜一般的bug。所以解决办法——自己编译一下codesign_allocate

https://blog.0xbbc.com/2017/05/the-reason-that-codesign-remove-signature-generates-malformed-macho-still-remains-mystery/

2 Likes