繁体   English   中英

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

[英]Preventing a DLL file from loading into my process via MS Detours

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

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

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

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

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

我如何获得一些代码来执行EARLIER,并希望在注入第三方库之前安装绕行程序?

听起来像:

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

  • 应用程序的从属DLL之一是静态链接到目标DLL,或者以其他方式在自身加载时加载它。

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

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

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

您需要找到实际从何处加载目标DLL。

如果您的EXE是直接静态链接到它,则动态地加载它,或者通过代码中的LoadLibrary()显式加载,或者通过链接器的delay-load功能(如果有LoadLibrary()内部使用LoadLibrary()进行显式加载。

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

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

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

您甚至可以提供一个辅助函数来处理您的dll的加载,因此您无需重新浏览。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM