void SetHook()
{
MessageHook=SetWindowsHookEx(WH_KEYBOARD,GetMsgProc,GetModuleHandle("HOOK.dll"),(DWORD)thwd);
}把上面的SetHook做成导出函数,使用程序A静态加载DLL,然后调用SetHook挂到计算器上,HOOK成功但是如果把SetHook写在DLL_PROCESS_ATTACH中,用LoadLibrary把DLL注入目标进程,让DLL自身调用SetHook对自身进程HOOK(确认SetWindowsHookEx第4参数thwd正确),却一直无法成功被LoadLibrary加载的DLL不能直接HOOK自身进程吗?
{
MessageHook=SetWindowsHookEx(WH_KEYBOARD,GetMsgProc,GetModuleHandle("HOOK.dll"),(DWORD)thwd);
}把上面的SetHook做成导出函数,使用程序A静态加载DLL,然后调用SetHook挂到计算器上,HOOK成功但是如果把SetHook写在DLL_PROCESS_ATTACH中,用LoadLibrary把DLL注入目标进程,让DLL自身调用SetHook对自身进程HOOK(确认SetWindowsHookEx第4参数thwd正确),却一直无法成功被LoadLibrary加载的DLL不能直接HOOK自身进程吗?
// 如果dwThreadId 标识当前进程创建的一个线程,
// 而且子程代码位于当前进程,hMod必须为NULL。
// 可以很简单的设定其为本应用程序的实例句柄。
SetWindowsHookEx(WH_KEYBOARD,&GetMsgProc,GetModuleHandle(NULL),(DWORD)thwd);
或者
SetWindowsHookEx(WH_KEYBOARD,&GetMsgProc,GetModuleHandle(NULL),(DWORD)GetCurrentThread());也都没有成功...
其实就是是说:DLL中并不导出SetHook,而把SetHook写在DLL_PROCESS_ATTACH中,谁加载DLL就自动HOOK
使用程序A调用LoadLibrary把DLL注入程序A(自身)
如果DLL中的SetWindowsHookEx执行成功的话,程序A在LoadLibrary之后就DLL应该已经可以拦截WH_KEYBOARD了吧?
{
SetWindowsHookEx();
}
这样你在你的Dll以DLL_PROCESS_ATTACH调用时,由于调用了::SetWindowsHookEx,这样这个线程又以DLL_PROCESS_ATTACH调用了DllMain(两次调用LoadLibrary虽然不会加载两个dll模块,却会使DllMain被两次调用),这样就陷入了死循环,如果这是系统钩子,那么系统中所有线程都陷入了死循环,机器就死掉了。SetWindowsHookEx 是不能写在DLL_PROCESS_ATTACH里面的
{
MEMORY_BASIC_INFORMATION mbi;
if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
{
return (HMODULE)mbi.AllocationBase;
}
else
{
return NULL;
}
}
SetWindowsHookEx(WH_KEYBOARD,&KeyHookProc,ModuleFromAddress(KeyHookProc),(DWORD)GetCurrentThreadID());lz的GetMsgProc我这里改成了KeyHookProc,因为你是锁定键盘,所以命名应该合理些
BOOL FirstG = FALSE;
void SetOn()
{
MessageHook=SetWindowsHookEx(WH_KEYBOARD,&GetMsgProc,NULL,(DWORD)GetCurrentThread());
//MessageHook=SetWindowsHookEx(WH_KEYBOARD,&GetMsgProc,NULL,tid);
}
BOOL APIENTRY DllMain(..)
{
if (FirstG==FALSE)
{
//MessageBoxA(NULL,"FirstG","FirstG",MB_OK);
SetHook();
FirstG = TRUE;
}
.........
}
但是把代码改成这样也不行,快晕死了...