《Windows核心编程系列》谈谈Windows钩子

发表于:2012-8-31 14:30

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:ithzhang    来源:51Testing软件测试网采编

  Windows应用程序是基于消息驱动的。各种应用程序对各种消息作出响应从而实现各种功能。

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

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

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

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

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

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

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

  安装钩子:

  1:

SetWindowsHookEx(

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

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

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

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

         );

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

  WH_CALLWNDPROC           //目标线程调用SendMessage发送消息时,钩子函数被调用。
  WH_CALLWNDPROCRET   //当SendMessage返回时,钩子函数被调用。
  WH_KEYBOARD                 //从消息队列中查询WM_KEYUP或WM_KEYDOWN时。
  WH_GETMESSAGE           //目标线程调用GetMessage或PeekMessage时
  WH_MOUSE                      //查询消息队列中鼠标事件消息时。
  WH_MSGFILTER              //以下请参考MSDN。
  WH_SYSMSGFILTER
  WH_JORNALRECORD
  WHJORNALPLAYBACK
  WH_SHELL
  WH_CBT
  WH_FOREGROUNDIDLE
  WH_DEBUG

  2:

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

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

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号