【问题标题】:System-wide hooks with MHook使用 MHook 的系统范围挂钩
【发布时间】:2013-09-17 20:17:20
【问题描述】:

我有这个项目,我将一些 Windows 函数 (GetOpenFileNameA, GetOpenFileNameW, GetSaveFileNameA, GetSaveFileNameW) 与 MHook 库挂钩。这是我用来安装挂钩的代码。

for(size_t i = 0; i < FunctionsCount; ++i)
{
    HMODULE hModule = GetModuleHandleA(Function[i].ModuleName);

    //[1]
    if( !hModule )
        return FALSE;

    *Function[i].Original = GetProcAddress(hModule, Function[i].Name);

    if(*Function[i].Original == NULL)
        return FALSE;

    if(!Mhook_SetHook(Function[i].Original, Function[i].Hooked))
        return FALSE;
}

在DLL_PROCESS_ATTACH原因上从DllMain调用。

现在,当我使用 CreateRemoteThread 方法注入我的 Dll 时,它工作得很好,但是当我想使用 LoadAppInit_DLLs 机制设置系统范围的挂钩时,我的挂钩不起作用。经过几个小时的调试,我发现原因是我的Dll在comdlg32.dll(这是这些函数所在的模块)之前加载,然后语句[1]返回false,那么我的Dll没有加载。

到目前为止,我的解决方案是在 [1] 返回 false 时调用 LoadLibrary。

HMODULE hModule = GetModuleHandleA(Function[i].ModuleName);

//[2]
if( !hModule )
{
    LoadLibraryA(Function[i].ModuleName);
    hModule = GetModuleHandleA(Function[i].ModuleName);
}

我发现很多网站都说这是邪恶的,我同意(即使工作正常)。此外,如果一个进程根本不使用通用对话框,我将挂钩永远不会被调用的函数。

如果有人可以提供帮助,也许是解决方法或解释另一种设置全局挂钩的方法,我们将不胜感激。提前致谢

【问题讨论】:

    标签: c++ winapi dll hook


    【解决方案1】:

    您需要挂钩LoadLibraryXXX函数,并在成功执行后检查您的模块是否已加载(调用GetModuleHandle),如果已加载则挂钩。

    另外,固定挂钩的 dll 是个好主意,这样它们就不会再被卸载了。

    【讨论】:

    • 好答案,我会尽快尝试。 it is a good idea to pin hooked dlls so they are not unloaded anymore是什么意思
    • 你的钩子算法可能不会期望一个 dll 被卸载并再次加载。因此,使 dll 可卸载要简单得多。见msdn.microsoft.com/en-us/library/windows/desktop/…
    • 问题是我发现dll卸载是因为操作系统加载进程的dll的顺序(LoadAppInit_DLLs中的dll不是最后一个),所以在进程空间@987654326 @ 返回NULL。如果我从错误的角度看待它,请纠正我。
    • 您需要在每次LoadLibraryXXX 调用后调用GetModuleHandle,直到获得目标dll。
    猜你喜欢
    • 1970-01-01
    • 2010-12-08
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多