【问题标题】:Dynamic load of object file to execute要执行的目标文件的动态加载
【发布时间】:2018-04-13 01:52:51
【问题描述】:

我想知道加载目标文件(由 msvc 编译器从单个源文件生成),将其加载到我已经运行的程序的内存中(例如在缓冲区中)然后运行代码的步骤是什么在里面。

用例是我有一个需要一分钟加载的大型程序,并且想要从源代码进行实时修改。就像只是加载目标文件,修复这个目标文件中的一些地址,使用 -hotpatch 函数拦截我已经运行的进程中的调用并重定向到我的目标文件。

在我看来,我应该只解析目标文件的导入表以指向我已经加载的程序并拦截已修改函数的调用。

我错过了什么吗?我想在尝试之前先问一下,不要把时间浪费在可能不可能的事情上!

谢谢!

【问题讨论】:

  • 我的理解是对象文件是一种中间表示,不一定是可执行的。目标文件中可能包含未解析的符号,这些符号由链接器解析。您是否将目标文件与静态或动态库混淆了?
  • 听起来你需要使用动态库。操作系统可以根据需要或在启动时将这些加载到您的程序中。这些库可以包含可执行代码,并且它们通常没有未解析的外部引用。
  • 事实上,我想解决那些对我程序中已经加载的地址的引用。我不想重新链接整个可执行文件。而且我不想使用 LoadLibrary 函数。
  • 绝对应该可以,快速谷歌搜索显示this Windows dll 示例。
  • 是的,除了我想加载 .obj 文件而不是 .dll。所以也许有一些我不知道的差异?

标签: c++ visual-c++ dynamic linker loader


【解决方案1】:

回答直接问题(关于加载和执行 obj 文件):这基本上相当于重新编写链接器。这几乎是不可能的。

至于(我能想到的)您的预期用途:动态加载和执行 obj 文件不会让您更接近拦截已经运行的进程中的调用。您想要的可能是挂钩。有很多(不,说真的,很多)方法可以做到这一点。 Detours 或多或少是实现这一目标的官方方式,这里有一个 presentation 来自光谱的异国情调方面的几种方式。

【讨论】:

  • 对于钩子来说似乎很简单,从未尝试过,但似乎只是在旧函数中将 jmp 写入新函数。我有一些名为 InterceptAPI 的代码似乎可以解决问题。但再次从未测试过它,所以我希望它有效:D
  • 只有当您不打算从您的补丁程序(或从其他地方)调用原始函数时,这很容易。如果你这样做了,你可能应该阅读更多关于这个主题的内容
  • 我见过一些称为蹦床的技术,但我不打算使用这些技术,因为我只想用更新的代码替换旧功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 2011-01-20
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多