【问题标题】:How to insert a LC_LOAD_DYLIB command into a Mach-O binary (OSX)如何将 LC_LOAD_DYLIB 命令插入 Mach-O 二进制文件 (OSX)
【发布时间】:2010-09-21 08:23:52
【问题描述】:

我希望用一些代码修补一个废弃软件。

该软件是基于碳的,所以我不能使用 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 部分...

有人有什么想法吗?

【问题讨论】:

    标签: macos dylib mach-o dyld otool


    【解决方案1】:

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

    您应该注意的一些警告:

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

    【讨论】:

    • 太棒了。这是一个很好的提示。回答你,不,我不是在分发应用程序。我正在修补它以供我个人使用,以便我可以使用备用 HID(我几乎放弃了对应用程序分发商和 HID 驱动程序制造商的希望)。
    • 是的,我刚刚阅读了您的另一个问题... mach_inject 可能是您最好、最简单的选择。
    【解决方案2】:

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

    set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多