C++ 函数挂钩

Posted

技术标签:

【中文标题】C++ 函数挂钩【英文标题】:C++ function hook 【发布时间】:2011-07-10 09:24:39 【问题描述】:

我有一个 DLL 的源代码。编译后的 DLL 由应用程序加载。该应用程序还加载了其他几个 DLL。我已经从应用程序和所有 DLL 中反汇编了 asm 代码,但我只有一个 DLL 的源代码。应用程序和所有 DLL 是一个进程。

我想在我有源代码的 DLL 中编写一个函数挂钩。我想从其他 DLL 中挂钩函数。钩子函数应该被所有其他 DLL 和应用程序以及我编译的 DLL 调用(不应调用原始函数)。

问题是,我不能直接挂钩一个 DLL,因为它不是一个自己的进程。不知何故,我必须挂钩加载到应用程序的 DLL。怎么做?

作为参考,我不能用一个 DLL 的偏移量挂钩一个函数,因为该函数在应用程序的内存中,而不是在 DLL 进程本身的内存中!

【问题讨论】:

您能否给出一个想要这样做的正当理由,函数挂钩往往意味着您想要进行某种黑客攻击:\ 天哪,微软为什么要提供类似弯路的东西?附加 API 以获得更多可能性。我是服务器的管理员,我被黑了。我必须更好地处理传入的连接包。 在 Windows 上进行黑客攻击是有原因的,它为您提供了所需的所有功能:P WinHook API 是您可能想要阅读的内容,但我希望您正在做一些合法的事情. 我知道所有这些东西。我只需要知道我的问题的答案:/ SetWindowsHook 返回一个 HHOOK,使用句柄来获取正在运行该库的进程的句柄。 【参考方案1】:

作为参考,我不能挂钩 从一个 DLL 偏移的函数, 因为函数在里面 应用程序的内存,而不是 DLL进程本身的内存!

当一个 DLL 被一个进程加载时,它会被加载到该进程的地址空间中。 DLL 没有自己的进程。如果您想在远程进程中运行的 DLL 中挂钩函数,您可以将自己的 DLL注入到远程进程中。现在您注入的 DLL 共享目标进程的地址空间,以及您的目标 DLL。在您自己的 DLL 代码中,您可以调用 API(例如 GetModuleHandle)以获取目标 DLL 的基地址,并从您的 DLL 中处理所有挂钩代码,因为您的代码不是在“您的”应用程序中运行,而是在他们的,好像他们自己加载的一样。

【讨论】:

以上是关于C++ 函数挂钩的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法像在 C++ 中挂钩非托管函数一样在 C# 中挂钩托管函数?

C++ 函数挂钩

使用啥私有 c++ 函数返回类型来使用 mobilesubstrate 进行挂钩

C++ 函数挂钩(仅限内存地址)

如何正确使用 C++ 中的 Detour 库来实现具有已知内存地址的函数的简单挂钩?

C ++中的函数挂钩?