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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值