windows技术----HOOK技术学习

xiaoxiao2021-02-28  84

windows钩子函数 关于钩子的理解: windows应用程序是基于消息驱动的。 windows钩子可以监视指定窗口的某种类型的消息。 当监视的消息到达该指定的窗口时,在该窗口处理消息前,钩子函数将截获此消息。 钩子函数既可以拦截处理此消息,也可以不做任何处理将该消息传递下去。 相关函数: HHOOK hHook = NULL; LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) //钩子函数 {     if (code == HC_ACTION)     {         PKBDLLHOOKSTRUCT param = (PKBDLLHOOKSTRUCT)lParam;         int x = 1;     }     return CallNextHookEx(hHook, HC_ACTION, wParam, lParam); } DLL_HOOK_GETKEYBOARD_API bool KeyboardDll::initKeyboardHook() //加载钩子 {     hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);          if (hHook == NULL)     {         printf("SetWindowsHookEx() error :%d\n", GetLastError());         return false;     }     return true; } DLL_HOOK_GETKEYBOARD_API bool KeyboardDll::stopHook() //卸载钩子 {     if (UnhookWindowsHookEx(hHook) == FALSE)     {         printf("UnhookWindowsHookEx() error :%d\n");         return false;     }     fclose(fp);     return true; } SetWindowsHookEx函数介绍: SetWindowsHookEx(           int idHook,             //要安装的钩子的类型。           HOOKPROC lpfn,          //钩子函数的地址。            HINSTANCE hMode,        //钩子函数DLL在进程内的地址。当前进程中,此参数应被指定为NULL.             DWORD     dwThread,     //要安装钩子的线程。如为0,则为所有线程安装钩子。                                         //如果只检测本进程,可用GetCurrentThreadId()   ); BOOL UnhookWindowsHookEx(HHOOK hhk); 问题:为什么钩子函数必须在动态库中实现???写在主程序内时只可以在主程序内安装钩子。   HOOK技术 可以只hook本进程的消息,这样不需要全局钩子,不用写在dll中。 但如果需要hook其他进程或者全部进程,就需要全局钩子,必须利用dll实现。 因为每个进程有自己独立的进程内存空间,捕获其消息,需要windows将hook加载到其进程空间中, 而实现这个最好的方法,就是用DLL来实现。系统会自动把该DLL注入到所有的进程空间中。 也就是每个进程都将自动加载此动态库。调用钩子函数来处理捕获消息。    
转载请注明原文地址: https://www.6miu.com/read-77276.html

最新回复(0)