2024年4月26日发(作者:)

关于Hook

一、基本概念:

钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以

监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,

在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事

件。

钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消

息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。

这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可

以强制结束消息的传递。

二、运行机制:

1、钩子链表和钩子子程:

每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这

个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩

子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到

Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避

免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最

早安装的钩子放在最后,也就是后加入的先获得控制权。

Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被

卸载,Windows 便释放其占用的内存,并更新整个Hook链表。如果程序安装了钩子,

但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。

钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类

的成员函数,只能定义为普通的C函数。用以监视系统或某一特定类型的事件,这些事件

可以是与某一特定线程关联的,也可以是系统中所有线程的事件。

钩子子程必须按照以下的语法:

LRESULT CALLBACK HookProc

(

int nCode,

WPARAM wParam,

LPARAM lParam

);

HookProc是应用程序定义的名字。

nCode参数是Hook代码,Hook子程使用这个参数来确定任务。这个参数的值依赖

于Hook类型,每一种Hook都有自己的Hook代码特征字符集。