如何截取dll方法调用?

如何截取dll方法调用?

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

有两种标准的方法我可以考虑这样做

  • DLL导入表钩子。
    为此,您需要解析DLL的PE头,找到导入表并写入您自己的函数的地址,而不是写在那里的地址。 您可以保存原始功能的地址以便稍后调用。 在这个维基百科文章的外部链接中的参考应该给你所有的信息,你需要能够做到这一点。

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

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

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

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

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