c++ - 防止 DLL 文件通过 MS Detours 加载到我的进程中

标签 c++ windows hook dll-injection detours

我想阻止特定的第三方 DLL 文件在运行时加载到我的应用程序进程中。我最初的尝试是使用 MS Detours 产品。

我有一个 32 位 MFC在 Windows 10 64 位上运行的应用程序。我使用免费的 MS Detours 3.0 版本进行了测试,作为可行性检查。

在我的 MFC 应用程序类构造函数中,我调用 Detours 来拦截“加载库”API(LoadLibraryW、LoadLibraryExW、LoadLibraryA 和 LoadLibraryExA)。这让我可以拦截库加载,目前我只是注销正在加载的库的名称,然后调用原始 API,以便它继续加载库。最终的计划是寻找特定的第三方 DLL 文件名,在这种情况下返回失败,阻止加载 DLL 文件。

这类作品。当我运行我的测试应用程序,关闭它,然后检查日志时,我看到一堆从我的拦截函数中记录的库加载消息。

但是,我的代码从未看到我正在寻找的特定第三方 DLL 文件。发生的事情是,当我到达我的应用程序类构造函数时,第三方 DLL 文件已经加载。所以我来晚了!

我怎样才能让一些代码更早地执行,并希望在注入(inject)第三方库之前安装绕行的东西?

最佳答案

听起来像是:

  • 您的应用是直接静态链接到目标 DLL

  • 您应用的一个依赖 DLL 静态链接到目标 DLL,或者以其他方式在加载自身时加载它。

  • 目标 DLL 列在 AppInit_DLLs 注册表项中。

  • 另一个进程已通过 SetWindowsHookEx() 将 DLL 作为全局 Hook 加载,使用将 DLL 注入(inject)所有正在运行的进程的 Hook 类型。

如果目标 DLL 在您的应用程序代码开始运行之前加载,您无法拦截目标 DLL。静态链接的 DLL 在 EXE 的代码开始运行之前由操作系统加载。因此只有动态加载的 DLL 才能被绕道拦截,并且只有在安装后加载才能绕道。

您需要找到目标 DLL 的实际加载位置。

如果您的 EXE 是直接静态链接到它的,请改为动态加载它,或者通过代码中的 LoadLibrary() 显式加载,或者通过链接器的延迟加载功能(如果有),它在内部使用 LoadLibrary()

如果另一个 DLL 正在加载它,动态加载该 DLL 而不是静态链接到它。

关于c++ - 防止 DLL 文件通过 MS Detours 加载到我的进程中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34189349/

相关文章:

c++ - Poco - 设置无限套接字接收超时

c++ - 我可以遍历仅相差一个整数的文件名吗?

java - md时cmd是否总是打开一个新窗口

git - 如何启用 gerrit 钩子(Hook)?

c++ - 低级键盘钩子(Hook) : differentiate between key codes

c++ - 使用python作为服务器

c++ - 在不同浮点精度之间切换时使用我自己的 std::mersenne_twister_engine 模板参数

android - Android SDK 的 Windows 和 Linux 版本之间是否存在差异?

c++ - 如何写入文件然后读回以验证其内容,确保您获得的是磁盘上的内容而不是缓存

php - 从 GIT post-update hook 执行 PHP