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

Nor*_*ray 5 macos linker code-signing racket

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

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

-sectcreate __TEXT __info_plist Info.plist_path
Run Code Online (Sandbox Code Playgroud)

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

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

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

% ld -arch i386 -sectcreate __TEXT __info_plist ./hello.txt racket-executable
ld: in racket-executable, can't link with a main executable
%
Run Code Online (Sandbox Code Playgroud)

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

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

Nor*_*ray 3

我认为这是不可行的。

似乎没有编辑 Mach-O 目标文件(包括可执行文件)的常用命令。该otool命令允许您查看此类文件的结构(使用otool -l),但仅此而已。

Mach-O 目标文件的结构记录在 Apple 参考站点上。总之,Mach-O 目标文件具有以下结构:

  • 一个标题,后面跟着
  • 一系列“加载命令”,后跟
  • 一系列“段”(某些加载命令负责指向文件内段的偏移量)

这些段包含零个或多个“部分”。标头和加载命令被视为位于文件的第一个段中,位于该段的任何部分之前。记录了几十个加载命令,以及相关头文件中定义的其他命令,因此显然是私有的。

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

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

那好吧。我想是时候寻找B计划了。