我有这个项目,我将一些 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
现在,当我使用这种方法注入我的 Dll 时,CreateRemoteThread
它工作得很好,但是当我想使用LoadAppInit_DLLs
机制设置系统范围的钩子时,我的钩子不起作用。经过几个小时的调试,我发现原因是我的Dll在之前加载comdlg32.dll
(这是这些函数所在的模块),然后语句[1]
返回false,然后我的Dll没有加载。
到目前为止,我的解决方案是调用LoadLibrary
if[1]
返回 false。
HMODULE hModule = GetModuleHandleA(Function[i].ModuleName);
//[2]
if( !hModule )
{
LoadLibraryA(Function[i].ModuleName);
hModule = GetModuleHandleA(Function[i].ModuleName);
}
我发现很多网站都说这是邪恶的,我同意(即使工作正常)。此外,如果一个进程根本不使用通用对话框,我将挂钩永远不会被调用的函数。
如果有人可以提供帮助,也许是解决方法或解释另一种设置全局挂钩的方法,我们将不胜感激。提前致谢