如何将段添加到现有(OS X)可执行文件中?

时间:2010-10-26 09:49:01

标签: macos linker code-signing racket

有没有办法向已链接的可执行文件添加部分?

我正在尝试基于Apple instructions对OS X可执行文件进行代码签名。这些包括通过向链接器选项添加参数来在要签名的二进制文件中创建合适部分的指令:

-sectcreate __TEXT __info_plist Info.plist_path

但是:我正在尝试签名的可执行文件是使用Racket(一种Scheme实现)生成的,它通过克隆“真实”来组装来自Racket / scheme代码的独立可执行文件球拍可执行并直接编辑Mach-O文件。

所以问题是:有没有办法可以进一步编辑这个可执行文件,添加代码签名所需的部分?

当以明显的方式使用时,使用ld不起作用:

% ld -arch i386 -sectcreate __TEXT __info_plist ./hello.txt racket-executable
ld: in racket-executable, can't link with a main executable
%

我认为这看起来很公平。 Libtool没有任何可能看起来的选项,redo_prebinding命令(至少是编辑可执行文件的命令)也没有。

相关球拍列表建议的两种可能性是(i)扩展球拍编译工具以调整在可执行文件上完成的手术(可行但可怕),或(ii)创建自定义球拍可执行文件已经有了所需的部分。两者看起来像是大锤和坚果的解决方案。 macosx-dev列表没有提出任何建议。

2 个答案:

答案 0 :(得分:1)

我认为这是不可行的。

似乎没有编辑Mach-O目标文件(包括可执行文件)的stock命令。 otool命令允许您查看此类文件的结构(使用otool -l),但这是关于它的。

记录了Mach-O目标文件的结构on the Apple reference site。总之,Mach-O目标文件具有以下结构:

  • 标题,然后是
  • 一系列'加载命令',后跟
  • 一系列'segment'(一些加载命令负责指向文件中段的偏移量)

段包含零个或多个“部分”。 header和load命令被认为是在该段的任何部分之前的文件的第一段中。记录了几十个加载命令,并在相关的头文件中定义了其他命令,因此显然是私有的。

添加部分意味着更改细分的长度。除非该部分非常小,否则这将需要将以下段进一步推入文件中。这是禁忌,因为加载命令的 lot 引用文件中的数据,并且从文件的开头有绝对偏移(相反,例如,段或部分的开头,包含它们),因此在推定的Mach-O编辑器中重新定位段将涉及修补大量偏移。这看起来并不容易。

网上有一两个Mach-O文件查看器,但没有一个与otool有很大不同,据我所知(这并不是特别难:我今天下午写了大部分内容)同时试图理解格式)。至少有一个Mach-O编辑器,但它似乎没有做lipo没有做的任何事情(称为'moatool',但来源似乎已经从谷歌代码中消失了。)

好吧,好吧。我想是时候找到B计划了。

答案 1 :(得分:0)

gimmedebugah工具能够修改现有二进制文件的__info_plist TEXT部分。见https://reverse.put.as/2013/05/28/gimmedebugah-how-to-embedded-a-info-plist-into-arbitrary-binaries/

可在此处找到:https://github.com/gdbinit/gimmedebugah