系统范围内与MHook挂钩

时间:2013-09-17 20:17:21

标签: c++ winapi dll hook

我有这个项目,我将一些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;
}

DllMain原因DLL_PROCESS_ATTACH开始调用。

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:4)

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

同样最好将钩住的dll固定,这样它们就不会被卸载了。