我想阻止特定的第三方 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/