如何将LC_LOAD_DYLIB命令插入Mach-O二进制文件(OSX)
题
我正在寻找使用一些代码修补一件弃用软件。
该软件是基于碳的,所以我不能使用InputManager(至少,我认为我不能)。我的想法是在mach-o标头中添加一个dylib引用,并在调用初始化例程时启动一个新线程。
我使用hexeditor添加了相应的加载命令(LC_ LOAD_DYLIB),并使用mach-o标头。
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部分......
有人有什么想法吗?
解决方案
我并不完全确定你要完成什么,但最简单的方法是在启动后将一个线程注入到mach任务中。这里有一个很好的信息来源(以及运行代码),可以在这里找到: http:// rentzsch的.com / mach_inject / 。
您应该注意的一些警告:
- 使机器端口完成任务所需的mach task_for_pid()调用现在是特权,需要授权才能调用。这样做的原因非常明显,但如果您计划发布带注入代码的内容,您应该知道这一点。
- 您的代码将在与原始应用程序相同的进程空间中运行,但在单独的线程上运行。因此,您将拥有对应用程序的完全访问权限,但是,如果它不是线程感知的,那么在注入代码之外使用和操作数据时要非常小心。显然,所有多线程问题都会在这里放大,因为原始代码从未意识到您的添加内容。 醇>
其他提示
不涉及修补二进制文件的最简单的解决方案是简单地使用DYLD_INSERT_LIBRARIES环境变量,然后运行您的应用程序。
set DYLD_INSERT_LIBRARIES to /my/path/libAltInput.dylib
我假设动态链接器报告错误的原因是因为Mach-O文件格式中的许多字段包含指定为从文件开头的偏移量的地址,因此添加另一个加载命令将使每个地址无效。例如,请参阅 symoff 和 stroff
条目。 MachORuntime / Reference / reference.html#// apple_ref / c / tag / symtab_command“rel =”nofollow noreferrer“> Mac OS X ABI Mach-O文件格式参考。
不隶属于 StackOverflow