2008-10-21 101 views
11

如何拦截dll方法调用?如何拦截dll方法调用?

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

拦截来自加载DLL的应用程序内部还是外部?在特定流程或所有流程外部?你可以做更好的表达你的问题的工作! ;) – TheSoftwareJedi 2008-10-21 01:58:16

+0

您希望定位哪种语言和Windows平台? – 2008-10-21 01:58:58

回答

0

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

6

假设您事先知道所有的DLL函数,一种技巧是编写自己的包装器DLL,它将所有的函数调用转发给真正的DLL。这个DLL不必用C/C++编写。所有你需要做的就是匹配原始DLL的函数调用约定。

+0

好吧...但是,如何强制运行进程调用我的dll而不是原来的? – 2008-10-21 02:40:42

9

有两种标准方法,我能想到的这样做

  • DLL导入表挂钩。
    为此,您需要解析DLL的PE Header,找到导入表并写入自己的函数的地址,而不是写在那里的地址。您可以保存原始功能的地址以便稍后调用它。在这个wikipedia article的外部链接中的参考资料应该能够提供你所需的所有信息。

  • 直接修改代码。找到你想挂钩的函数的实际代码,并修改它的第一个操作码以跳转到你自己的代码。你需要保存那里的操作码,以便它们最终被执行。这比听起来更简单,主要是因为它已经以不低于微软本身的形式以Detours library的形式实现。
    这是一件非常干净的事情。只需几行代码,您就可以将所有调用从所说的outlook.exe中替换为GetSystemMetrics(),并观察发生的奇迹。

一种方法的优点是另一种方法的缺点。第一种方法允许您正确添加一个手术钩给您想要的所有其他DLL通过解除挂钩的DLL。第二种方法允许你最全局的钩子拦截所有调用函数。

2

有关使用C/C++ API的库,请参阅Microsoft Detours。将其注入到所有其他程序中并不会触发病毒扫描程序/恶意软件检测程序,这有点不重要。但是你自己的过程是公平的游戏。