如何拦截dll方法调用?

时间:2008-10-21 01:49:31

标签: windows dll

如何拦截dll方法调用?

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

4 个答案:

答案 0 :(得分:10)

我可以通过两种标准方式来实现这个目标

  • DLL导入表挂钩。
    为此,您需要解析DLL的PE标头,找到导入表并写入您自己的函数的地址,而不是已经写入的地址。您可以保存原始功能的地址,以便以后调用它。此wikipedia article的外部链接中的引用应该为您提供执行此操作所需的所有信息。

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

一种方法的优点是另一种方法的缺点。第一种方法允许您将所有其他DLL以非挂钩方式完全添加到您想要的DLL的外科挂钩。第二种方法允许你使用最全局的钩子拦截所有调用函数。

答案 1 :(得分:7)

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

答案 2 :(得分:3)

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

答案 3 :(得分:0)

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

相关问题