C/C++语言拾遗(五)--Windows钩子

windows钩子是windows消息处理机制的一个监视点,通过安装钩子可以达到监视指定窗口某种类型的消息的功能。所谓的指定窗口并不局限于当前进程的窗口,也可以是其他进程的窗口。当监视的某一消息到达指定的窗口时,在指定的窗口处理消息之前,钩子函数将截获此消息,钩子函数既可以加工处理该消息,也可以不作任何处理继续传递该消息。使用钩子是实现dll注入的方法之一。其他常用的方法有:注册表注入,远程线程注入。

​  钩子函数是一个处理消息的程序段。是在安装钩子的时候向系统注册的。

关于windows钩子要清楚以下三点:

     1:钩子是用来截获系统中的消息流的。利用钩子可以处理任何我们感兴趣的消息,当然包括其他进程的消息。

    2:截获该消息后,用于处理该消息的程序叫做钩子函数。它是自定义的函数,在安装钩子时将此函数的地址告诉windows。

3:系统同一时间可能有多个进程安装钩子,多个钩子构成钩子链。所以截获消息并处理后,应该将此消息继续传递下去(CallNextHookEx),以便其他钩子处理这一消息。

      注意:使用钩子会使系统变慢,因为它增加了系统对每个消息的处理量。所以要仅在必要的时候才安装钩子。不需要时要及时卸载。

SetWindowsHookEx

(

 int idHook,                  //要安装的钩子的类型。

 HOOKPROC lpfn,                  //钩子函数的地址。

  HINSTANCE hMode,               //钩子函数所在DLL在进程内的地址

DWORD     dwThread,            //要安装钩子的线程。如为0,则为所有线程安装钩子。

 );

​1、idHook指定要安装钩子的类型,他可以是下面的值:

     WH_CALLWNDPROC   //目标线程调用SendMessage发送消息时,钩子函数被调用。

     WH_CALLWNDPROCRET   //当SendMessage返回时,钩子函数被调用。

     WH_KEYBOARD                 //从消息队列中查询WM_KEYUP或WM_KEYDOWN时。

     WH_GETMESSAGE           //目标线程调用GetMessage或PeekMessage时

     WH_MOUSE                      //查询消息队列中鼠标事件消息时。

     WH_MSGFILTER              //以下请参考MSDN。

​2、lpfn是钩子函数的地址

钩子安装后如果有相应的消息发生,windows将调用此参数指向的函数。一般钩子函数都是位于一个DLL中。当为其他进程内的线程安装钩子时,如果钩子函数在DLL中,系统会把DLL映射到那个进程内,使他能在该进程内被调用。

注意:钩子函数多是被其他进程内的线程调用,而不一定是安装钩子的线程。

​钩子函数被调用的过程:

      当进程A一个线程准备向一个窗口发送一个消息,系统检查该线程是否被安装了钩子,如果该线程被安装了钩子且该消息与钩子要截获的消息类型一致,此消息将被截获。系统检查该钩子的钩子函数所在的DLL是否已经被映射进程A的地址空间中。如果尚未映射,系统会强制将该DLL映射到进程A的地址空间。然后获得钩子函数在进程A的虚拟地址,并调用钩子函数。我们可以在钩子函数内定义我们对该消息处理的过程。

      注意:当系统把钩子函数所在的DLL映射到某个进程地址空间时,会映射整个DLL,而不仅仅是钩子函数,这也就说我们可以使用该DLL中的所有导出函数。

     3:hmod参数是钩子函数所在dll的实例句柄,也是该dll在进程内的虚拟地址。如果钩子函数在当前进程中,此参数应被指定为NULL.

    4:dwThreadid指定要被安装钩子的线程的ID号。如果被设为0,就会为系统内的所有GUI线程安装钩子。

   5:钩子函数

   钩子被安装后,如果有相应的消息发生,windows将调用钩子函数。以下为钩子函数的原型:

 

 


   LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)

   {

 //处理消息的代码。

  return CallNextHookEx(hHook,nCode,wParam,lParam);

 }//HookProc为钩子函数的名称。

    nCode指定是否必须处理该消息。如果它为HC_ACTION,那么钩子函数就必须处理该消息。如果小于0,钩子函数就必须将该消息传递给CallNextHookEx,不对该消息进行处理,并返回CallNextHookEx的返回值。  CallNextHookEx用于把消息传递到钩子链中下一个钩子函数。wParam和lParam的值依赖于具体的钩子类型。请参考MSDN。 

    卸载钩子。

     BOOL UnhookWindowsHookEx(HHOOK hhk);// hhk为要卸载的钩子句柄。


https://blog.csdn.net/ithzhang/article/details/7031587

https://blog.csdn.net/u012842205/article/details/44860051

​https://blog.csdn.net/wzxq123/article/details/52153605

21.5 Windows钩子

http://www.cnblogs.com/5iedu/p/4715166.html


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值