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

时间:2015-12-09 21:29:16

标签: 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文件已经加载。所以我来不及了!

如何获得执行EARLIER的代码,以便在第三方库被注入之前安装绕道东西?

2 个答案:

答案 0 :(得分:4)

听起来像是:

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

  • 您的某个应用依赖DLL是静态链接到目标DLL,或者在加载自身时加载它。

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

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

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

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

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

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

答案 1 :(得分:1)

您的代码可能正在引用第三方库的某些功能/导出 您可以尝试的一种方法是使用/ DELAYLOAD链接器选项为导入的函数创建存根函数。

有关说明和要求,请参阅https://msdn.microsoft.com/en-us/library/151kt790.aspx

您甚至可以提供辅助功能来处理您的dll加载,因此您不需要回收。