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自身进程吗?

解决方案 »

  1.   

    把GetModuleHandle("HOOK.dll")改为GetModuleHandle(NULL)。
      

  2.   

    HINSTANCE hMod, // 应用程序实例的句柄。标识包含lpfn所指的子程的DLL。
      // 如果dwThreadId 标识当前进程创建的一个线程
      // 而且子程代码位于当前进程,hMod必须为NULL。
      // 可以很简单的设定其为本应用程序的实例句柄。
      

  3.   

    改成
    SetWindowsHookEx(WH_KEYBOARD,&GetMsgProc,GetModuleHandle(NULL),(DWORD)thwd);
    或者
    SetWindowsHookEx(WH_KEYBOARD,&GetMsgProc,GetModuleHandle(NULL),(DWORD)GetCurrentThread());也都没有成功...
      

  4.   

    改成SetWindowsHookEx(WH_KEYBOARD,&GetMsgProc,NULL,(DWORD)GetCurrentThread()); 
      

  5.   

    让DLL自身调用SetHook对自身进程HOOK?????啥意思,没看懂
      

  6.   

    改成SetWindowsHookEx(WH_KEYBOARD,&GetMsgProc,NULL,(DWORD)GetCurrentThread());也还是不行"让DLL自身调用SetHook对自身进程HOOK"
    其实就是是说:DLL中并不导出SetHook,而把SetHook写在DLL_PROCESS_ATTACH中,谁加载DLL就自动HOOK
    使用程序A调用LoadLibrary把DLL注入程序A(自身)
    如果DLL中的SetWindowsHookEx执行成功的话,程序A在LoadLibrary之后就DLL应该已经可以拦截WH_KEYBOARD了吧?
      

  7.   

    哈哈if(dwReason   ==   DLL_PROCESS_ATTACH)   
      {   
      SetWindowsHookEx();   
      }   
      这样你在你的Dll以DLL_PROCESS_ATTACH调用时,由于调用了::SetWindowsHookEx,这样这个线程又以DLL_PROCESS_ATTACH调用了DllMain(两次调用LoadLibrary虽然不会加载两个dll模块,却会使DllMain被两次调用),这样就陷入了死循环,如果这是系统钩子,那么系统中所有线程都陷入了死循环,机器就死掉了。SetWindowsHookEx  是不能写在DLL_PROCESS_ATTACH里面的
      

  8.   

    HMODULE WINAPI ModuleFromAddress(PVOID pv) 
    {
    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,因为你是锁定键盘,所以命名应该合理些
      

  9.   

    倒。。没想到SwtWindowsHookEx居然还会再调用一次DLL_PROCESS_ATTACH
    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;
    }
    .........
    }
    但是把代码改成这样也不行,快晕死了...