如何将LC_LOAD_DYLIB命令插入Mach-O二进制文件(OSX)

10

我想要给一个废弃的软件打补丁,加入一些代码。

这个软件是基于Carbon的,所以我不能使用InputManager(至少我认为我不能)。我的想法是在mach-o头文件中添加dylib引用,并在调用初始化例程时启动一个新线程。

我已经使用十六进制编辑器混淆了mach-o头文件,添加了适当的加载命令(LC_LOAD_DYLIB)。

otool报告了我期望看到的内容,所以我相当有信心文件格式正确。

Load command 63
          cmd LC_LOAD_DYLIB
      cmdsize 60
         name @executable_path/libAltInput.dylib (offset 24)
   time stamp 1183743291 Fri Jul  6 19:34:51 2007
      current version 0.0.0
compatibility version 0.0.0

然而,启动二进制文件后出现以下错误:

dyld: bad external relocation length

我唯一能猜测的是我需要修改LC_SYMTAB或LC_DYNSYMTAB部分...

有人有什么想法吗?

2个回答

5
我不太确定你想要实现什么,但最简单的方法可能是在mach任务启动后将线程注入其中。关于如何做到这一点(以及运行代码的方法),可以在此处找到大量信息:http://rentzsch.com/mach_inject/
以下是需要注意的一些事项:
  1. 获取到任务的mach端口所需的mach task_for_pid()调用现在需要特权和授权才能调用。这个原因非常明显,但如果你计划发布带有注入代码的东西,你应该意识到这一点。
  2. 你的代码将在与原始应用程序相同的进程空间中运行,但在一个单独的线程中。因此,你将完全访问应用程序,但是,如果它没有线程感知,请非常小心地使用和操作来自注入代码之外的数据。显然,所有多线程问题都会在这里放大,因为原始代码从未意识到你的添加。

太好了。这是一个很好的提示。回答你的问题,不,我没有分发这个应用程序。我正在为自己打补丁,以便我可以使用替代的HID(我已经放弃了应用程序的分发者和HID的驱动程序制造商)。 - Moe
是的,我刚刚看了你的另一个问题... mach_inject 可能是你最好、最容易的选择。 - Jason Coco

4
使用DYLD_INSERT_LIBRARIES环境变量并运行您的应用程序是不需要修补二进制文件的最简单解决方案。
set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib

我假设动态链接器报告错误的原因是因为Mach-O文件格式中的许多字段包含从文件开头指定的地址作为偏移量,因此添加另一个加载命令将使每个地址无效。例如,请参见Mac OS X ABI Mach-O 文件格式参考中的symoffstroff条目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接