10

我正在寻找用一些代码修补一块废弃软件。

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

我已经使用 hexeditor 添加适当的加载命令 (LC_LOAD_DYLIB) 来处理 mach-o 标头。

otool 报告了我希望看到的内容,因此我相当有信心该文件的格式正确。

加载命令 63
          命令 LC_LOAD_DYLIB
      cmdsize 60
         名称 @executable_path/libAltInput.dylib(偏移量 24)
   时间戳 1183743291 Fri Jul 6 19:34:51 2007
      当前版本 0.0.0
兼容版本 0.0.0

但是,启动二进制文件会给我以下错误

dyld:外部重定位长度错误

我能猜到这意味着我需要修改 LC_ SYMTAB 或 LC_ DYNSYMTAB 部分......

有人有想法么?

4

2 回答 2

5

我不完全确定您要完成什么,但最简单的方法可能是在启动后将线程注入到 mach 任务中。可以在此处找到有关执行此操作(以及执行此操作的代码)的重要信息来源:http ://rentzsch.com/mach_inject/ 。

您应该注意的一些警告:

  1. 获取任务的 mach 端口所需的 mach task_for_pid() 调用现在已获得特权,并且需要授权才能调用。这样做的原因是不言而喻的,但如果你打算发布带有注入代码的东西,你应该意识到这一点。
  2. 您的代码将在与原始应用程序相同的进程空间中运行,但在单独的线程上。因此,您将拥有对应用程序的完全访问权限,但是,如果它不是线程感知的,则在使用和操作来自注入代码之外的数据时要非常小心。显然,所有多线程问题都会在这里被放大,因为原始代码从未意识到您的添加。
于 2008-11-07T19:03:38.497 回答
3

不涉及修补二进制文件的最简单的解决方案是简单地使用 DYLD_INSERT_LIBRARIES 环境变量,然后运行您的应用程序。

set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib

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

于 2010-01-02T07:04:58.920 回答