浅谈 HOOK 技术在 VC 编程中的应用 选择自 lithe 的 Blog
关键字 浅谈 HOOK 技术在 VC 编程中的应用
出处
摘要: 本文针对 HOOK 技术在 VC 编程中的应用进行讨论,并着重对应用比较广泛的全
局 HOOK 做了阐述。
引言
Windows 操作系统是建立在事件驱动机制之上的,系统各部分之间的沟通也都是通过消
息的相互传递而实现的。但在通常情况下,应用程序只能处理来自进程内部的消息或是从其
他进程发过来的消息,如果需要对在进程外传递的消息进行拦截处理就必须采取一种被称为
HOOK(钩子)的技术。钩子是 Windows 操作系统中非常重要的一种系统接口,用它可以轻松
截获并处理在其他应用程序之间传递的消息,并 由此可以完成一些普通应用程序难以实现的
特殊功能。基于钩子在消息拦截处理中的强大功能,本文即以 VC++ 6.0 为编程背景对钩子
的基本概念及其实现过程展开讨论。为方便理解,在文章最后还给出了一个简单的有关鼠标
钩子的应用示例。
钩子的基本原理
钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入到系统。钩子的
种类有很多,每一种钩子负责截获并处理相应的消息。钩子机制允许应用程序截获并处理发
往指定窗口的消息或特定事件,其 监视的窗口即可以是本进程内的也可以是由其他进程所创
建的。在 特定的消息发出,并在到达目的窗口之前,钩子程序先行截获此消息并得到对其的
控制权。此时在钩子函数中就可以对截获的消息进行各种修改处理,甚至强行终止该消息的
继续传递。
任何一个钩子都由系统来维护一个指针列表(钩子链表),其 指 针 指 向 钩子的各个处理
函数。最近安装的钩子放在链的开始,最早安装的钩子则放在最后,当钩子监视的消息出现
时,操作系统调用链表开始处的第一个钩子处理函数进行处理,也 就 是 说 最后加入的钩子优
先获得控制权。在这里提到的钩子处理函数必须是一个回调函数(callback function),
而且不能定义为类成员函数,必须定义为普通的 C 函数。在 使 用 钩子时可以根据其监视范围
的不同将其分为全局钩子和线程钩子两大类,其中线程钩子只能监视某个线程,而全局钩子
则可对在当前系统下运行的所有线程进行监视。显然,线程钩子可以看作是全局钩子的一个
子集,全局钩子虽然功能强大但同时实现起来也比较烦琐:其 钩子函数的实现必须封装在动
态链接库中才可以使用。
钩子的安装与卸载
由于全局钩子具有相当的广泛性而且在功能上完全覆盖了线程钩子,因此下面就主要对
应用较多的全局钩子的安装与使用进行讨论。前面已经提过,操作系统是通过调用钩子链表
开始处的第一个钩子处理函数而进行消息拦截处理的。因此,为了设置钩子,只 需将回调函
数放置于链首即可,操作系统会使其首先被调用。在 具体实现时由函数 SetWindowsHookEx()
负责将回调函数放置于钩子链表的开始位置。SetWindowsHookEx()函数原型声明如下:
HHOOK SetWindowsHookEx(int idHook;
HOOKPROC lpfn;
评论0