我想用一些代码修补一段废弃软件。

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

我已经使用hexeditor添加了适当的加载命令(LC_ LOAD_DYLIB)来处理mach-o header 。

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

加载命令63
指令LC_LOAD_DYLIB
指令大小60
名称@ executable_path/libAltInput.dylib(偏移量24)
时间戳记1183743291 2007年7月6日星期五19:34:51
当前版本0.0.0
兼容版本0.0.0

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

dyld:外部重定位长度错误

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

有人有主意吗?

最佳答案

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

您需要注意的一些注意事项:

  • 获得任务的mach端口所需的mach task_for_pid()调用现在已获得特权,并且需要授权才能进行调用。这样做的原因是不言而喻的,但是如果您打算使用注入(inject)的代码发布某些内容,则应该意识到这一点。
  • 您的代码将在与原始应用程序相同的进程空间中运行,但在单独的线程上运行。因此,您将拥有对该应用程序的完全访问权限,但是,如果该应用程序不是线程感知的,则应非常小心地使用和操作来自所注入(inject)代码之外的数据。显然,这里所有的多线程问题都会被放大,因为原始代码永远不会意识到您所添加的内容。
  • 10-08 20:17