基于VC平台的HOOK技术编程分析与实现

时间:2022-05-27 07:16:12

基于VC平台的HOOK技术编程分析与实现

摘要:本文讨论了如何在VC平台下实现hook技术编程,并重点分析了Windows应用程序中的HOOK技术对事件驱动机制的影响。

关键词:HOOK技术 VC 事件驱动

中图分类号:TP311 文献标识码:A 文章编号:1007-9416(2014)05-0167-01

Windows平台下应用程序运行是基于消息的传递机制的,事件驱动在应用程序与操作系统的交互扮演了重要的角色。应用程序通常按照消息机制系统中进程间和进程内Windows消息,编程的过程中,有时需要对特定的消息传递进行屏蔽,例如如果需要在某个安装程序中屏蔽用户的鼠标动作和键盘按键以避免影响软件安装过程,可以使用一种HOOK(钩子过程)技术达到目的。HOOK(钩子过程)是Windows平台应用程序中的一种操作系统API函数,借助钩子过程可以截获并处理我们感兴趣的消息。

1 钩子过程概述

借助系统调用把一段消息处理程序加载到应用程序中,称为钩子过程。在程序中钩子过程的主要功能是监控、截取并利用回调函数处理预先设定的消息。应用程序借助被称为HOOK的钩子过程就可以监控、截取处理程序员指定的事件和消息,针对消息作出屏蔽或其他操作。从钩子作用角度的范围来看主要有进程内钩子过程与全局性钩子过程。全局钩子过程的实现在动态链接库中才能使用。提前在程序中设定的钩子函数可以Windows消息传递到指定窗口之前截取并获得消息的控制处理权。在回调函数中就可以对修改处理截获的消息,也可以使消息不再继续传递。

当我们设计HOOK程序时,在操作系统的应用程序自动创建一个HOOK过程链,HOOK链的节点是各个消息的钩子过程函数。链首是最后一次安装的钩子函数,链尾是最初安装的钩子函数,钩子感兴趣的消息依次经过HOOK链的每个节点检查,连首的钩子首先获得控制权,其次是第二个,直至最后一个HOOK过程。钩子处理函数称为回调函数。

2 HOOK过程初始化和释放

链首的钩子过程作系统调用截取处理消息。这样,把回调函数放在链首就可以达到设置钩子过程的目的。Windows提供了一个系统API函数初始化HOOK过程函数到钩子链首SetWindowsH

ookEx()。SetWindowsHookEx()函数在MSDN中的说明:

第一个参数idHook指定了要初始化钩子过程函数的种类,例如鼠标钩子MouseProc,键盘钩子KeyBoardProc;第二个参数lpfn是钩子过程函数的函数指针;第三个参数hMod 则指向动态链接库的句柄,这个动态链接库包含了钩子函数;第四个参数dwThreadId 指定钩子过程监控的某个线程,该参数的取值为线程ID或为0,前者表示监视特定的线程,起到进程内部钩子的作用,后者起全局性钩子过程的作用,即监控当前运行的活动线程。如果返回值为NULL,说明调用失败,否则返回所安装钩子过程的句柄。

如果需要监视应用程序中的鼠标消息,就需要定义鼠标的钩子过程的回调函数,这个函数在MSDN中给出的原型是LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam);该函数返回值非0表示相应消息被屏蔽,一般用return 1表示。其中wParam和lParam参数中存放了鼠标消息的信息。nCode小于0时,将控制权交给HOOK链中的下一个钩子函数。HOOK链中的每个钩子或者处理消息或者将事件传递给下一个钩子。钩子之间传递消息借助CallNestHookEx()函数。钩子定义的末尾一般需要调用CallNextHookEx()函数以避免引起未知的系统错误。CallNextHookEx( )函数的返回值是HOOK链中的下一个钩子的地址。

值得注意的是,安装钩子会影响消息的正常传递,进而对系统本身的安全性造成破坏,因此在使用钩子过程结束后必须吧钩子过程从当前系统中释放。释放钩子的函数原型在MSDN中的声明如下。

BOOL UnhookWindowsHookEx(HHOOK hhk);参数hhk指向待卸载的钩子句柄,即先前钩子安装函数返回的钩子句柄。

3 鼠标钩子的简单示例

4 结语

通过钩子技术几乎可以拦截处理所有的Windows系统消息,钩子技术非常广泛。本文从实例角度讨论了钩子基本原理和设计方法。

上一篇:计算机网络安全问题及防护措施 下一篇:简易录播系统的设计与实现