【问题标题】:Preventing a DLL file from loading into my process via MS Detours防止 DLL 文件通过 MS Detours 加载到我的进程中
【发布时间】:2016-03-15 08:21:28
【问题描述】:

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

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

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

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

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

我怎样才能获得一些代码来执行 EARLIER 并希望在注入第三方库之前安装 detours 的东西?

【问题讨论】:

    标签: c++ windows hook dll-injection detours


    【解决方案1】:

    听起来像:

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

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

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

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

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

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

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

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

    【讨论】:

    • 我们的应用没有静态链接到目标 DLL,也没有任何依赖的 DLL。这是一个完全独立的第三方产品,一旦安装在系统上,就会将自己注入到正在运行的进程中。我希望防止它被注入我的体内。
    • 我所知道的 DLL 在开始运行代码之前将自身注入新进程的唯一方法是 1) DLL 列在 AppInit_DLLs 注册表项中,或 2) 另一个进程已通过SetWindowsHookEx() 将 DLL 注册为全局挂钩。
    • 如果您不知道注射是如何发生的,您就无法阻止注射。追踪它。注入的方式有很多种,但只有这么多,所以使用排除法。检查您的依赖项。检查注册表。使用 SysInternals ProcessMonitor 查看其他应用是否在您的应用之前加载 DLL。我的猜测是另一个应用程序可能正在使用SetWindowsHookEx() 将 DLL 全局注入所有进程。如果 DLL 在您的代码开始运行之前注入,则无法在您的代码中阻止/绕过注入...
    • 您可能必须移动/删除 DLL,或者杀死/卸载注入应用程序(如果有),或者自己挂钩注入应用程序以绕过 SetWindowsHookEx() 加载 DLL 等。
    • 是什么让您认为在您的应用程序开始运行代码后发生了注入? IF 是的,您可以尝试在全局内存中创建一个静态对象并让其构造函数安装绕行。这将在输入WinMain() 之前运行。但是,如果它真的在进程生命周期的早期,那仍然不能保证捕获注入。
    【解决方案2】:

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

    请参阅https://msdn.microsoft.com/en-us/library/151kt790.aspx 了解说明和要求。

    你甚至可以提供一个辅助函数来处理你的 dll 的加载,所以你不需要retour。

    【讨论】:

    • 不,这不是我的应用程序引用的库。它是一个完全独立的第三方产品,一旦安装在系统上,就会将自己注入到正在运行的进程中。目标是防止它注入我的体内。
    猜你喜欢
    • 2015-12-22
    • 2011-07-08
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    相关资源
    最近更新 更多