您的位置  > 互联网

文档介绍:win32下全局钩子的实现的关键技术

从15年前开始,Win32全局钩子的实现一直是32位编程中最具挑战性的课题之一。 全局钩子可以捕获系统向应用程序发送的消息(如键盘鼠标操作、系统设置更改等),因此被广泛应用于各种商业应用软件中,其中金山词霸的“屏幕截图”功能最为中国人所熟知。 另一方面,黑客继续开发更隐蔽、更强大的手段来窃取他人的密码和隐私。 我们在网上很容易就能找到上百种不同写法的hook程序,但到目前为止,没有一个能同时在/Me和NT/2000/XP下正确运行,尤其是最常用的XP,大多数是全局的下的钩子例程,存在各种各样的问题,最终导致它们要么在运行时出错,要么只实现了本地钩子的功能。

本文将从Win32钩子的基本概念和Win32进程内存管理的特点出发,最终为读者提供一个可以在所有32位平台上运行的完整的全局鼠标钩子程序(托福报名防盲抢定时器) 。 通过这个例子我们会看到,在Win32全局钩子的实现中,正确理解和使用钩子本身只占一半左右的工作量。

让我们一起来揭开Hook的神秘面纱吧。 我们首先分析hooks的工作机制,然后在下面讨论各个实现方法和必要性。

什么是钩子? 钩子如何工作?

Win32 Hooks的英文名称是Win32 Hooks。 它是操作系统消息驱动(-)机制的重要应用,也是系统的一个重要特性。 当生成或接收到来自用户操作的事件时,将向应用程序发送一条消息 ()。 将接收此消息的应用程序串在一条链(Chain)上。 该链是一种类似于队列的数据结构(FIFO,先进先出)。 首先,队列头部的程序接收消息,然后将其逐一向后传递,直到队列末尾。 这就形成了消息处理。 优先事项。 这个思想实际上是从8086时代的中断优先思想发展而来的,具有很强的实用性和合理性。

现在我们希望在消息到达应用程序之前,也就是刚才提到的链头之前,“挂”一些“钩子”,来捕获、处理、甚至系统消息。 钩子就像一个插队应用程序。 它与普通应用程序的区别在于它可以在消息到达应用程序之前捕获消息。 这个功能也是 hooks 最有用的方面之一。 想象一下,当用户按下键盘上的一个键时,我们可以在它到达应用程序时将其更改为另一个键,或者干脆不让应用程序知道这一点。

当然,可以挂多个挂钩。 我们一致认为最后挂的钩子总是在最前面(即最先获取并处理系统消息的)。

如何安装和卸载钩子

刚才我们提到了钩子。 其实应该说,安装一个钩子(a hook)是比较标准的。 在我们的程序或任务结束时,我们还应该“解耦”,即卸载钩子(一个钩子)。 这两个任务都是通过调用API函数(API Call)来完成的。 在Win32中,我们应该使用and。 他们在我们程序中的调用方法是:

:= (,,,0);

();

为此,我们需要提供钩子的类型(如)、钩子的过滤函数的地址(如)、调用钩子的应用程序实例句柄(如)以及钩子需要的作用域的句柄采取行动(本例中的 0 代表整个世界)。

首先让我们了解一下钩子的类型及其范围。 不同类型的钩子支持不同的范围。 总共提供了12种类型的hook来捕获12种不同类型的消息。 具体的钩子及其类型限制请参考MSDN中的“Win32 Hooks”。 在本例中,我们使用类型钩子,它用于捕获鼠标操作。 它支持线程和全局范围。 为了使其作用域全局,我们可以将第四个参数设置为0。如果我们希望这个钩子作用于一个线程,我们需要提供线程句柄。

安装钩子时会返回一个句柄,卸载时可以使用。 卸载钩子的方法很简单,将句柄作为参数调用即可。

过滤函数 ( ) 或回调函数 ( Func