14

如何拦截dll方法调用?

  • 有哪些可用的技术?
  • 只能在 C/C++ 中完成吗?
  • 如何拦截所有正在运行的进程对给定dll的方法调用?
  • 如何拦截从给定进程到给定dll的方法调用?
4

4 回答 4

12

我可以想到两种标准方法来做到这一点

  • DLL 导入表挂钩。
    为此,您需要解析 DLL 的 PE Header,找到导入表并写入您自己的函数的地址,而不是那里已经写入的地址。您可以保存原始函数的地址以便以后调用它。这篇维基百科文章的外部链接中的引用应该为您提供执行此操作所需的所有信息。

  • 直接修改代码。找到您要挂钩的函数的实际代码并修改它的第一个操作码以跳转到您自己的代码。您需要保存那里的操作码,以便它们最终会被执行。这比听起来简单,主要是因为它已经由不少于 Microsoft 自己以Detours 库的形式实现。
    这是一件非常整洁的事情。例如,只需几行代码,您就可以替换 Outlook.exe 中对 GetSystemMetrics() 的所有调用,并观察发生的奇迹。

一种方法的优点是另一种方法的缺点。第一种方法允许您将手术钩子精确地添加到您想要的所有其他 DLL 未挂钩的 DLL 中。第二种方法允许你用最全局的钩子来拦截所有调用函数。

于 2008-10-21T02:51:35.557 回答
7

如果您事先知道所有 DLL 函数,一种技术是编写您自己的包装 DLL,它将所有函数调用转发到真正的 DLL。此 DLL 不必用 C/C++ 编写。您需要做的就是匹配原始 DLL 的函数调用约定。

于 2008-10-21T02:38:48.110 回答
3

有关具有 C/C++ API 的库,请参阅Microsoft Detours 。在不触发病毒扫描程序/恶意软件检测器的情况下将其注入所有其他程序有点不重要。但你自己的过程是公平的游戏。

于 2008-10-21T12:06:37.013 回答
0

在 Linux 上,这可以通过 LD_PRELOAD 环境变量来完成。将此变量设置为指向包含您要覆盖的符号的共享库,然后启动您的应用程序。

于 2008-10-21T01:55:30.663 回答