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

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注入到所有的进程空间中。
也就是每个进程都将自动加载此动态库。调用钩子函数来处理捕获消息。
 
 

猜你喜欢

转载自blog.csdn.net/qq_20828983/article/details/74991902