钩子学习笔记

1.参考、学习《Micrsoft 的Hook专题》
2.重点内容:
(1)钩子实际上一个处理消息程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递

(a)钩子是程序段(处理消息的程序段);
(b)钩子由操作系统挂入操作系统中;
(c)钩子在消息传送以目标前被钩子程序段拦截;
(d)钩子用途:改变消息、知晓但不处理、中止。

(2)每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函 数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者 修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加 入的先获得控制权。
Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。
钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。

(a)每一种Hook,而不是每一个(钩子的类型,即它处理的消息类型 ),都有一个指针列表,即钩子链表;系统来维护的。
(b)列表指针指向Hook回调函数.
(c)回调函数,不能是类的成员函数,但不知道能不能支持class function/procedure 或 static.
(d)钩子卸载,便释放内存,更新整个Hook链表。
(e)被安装钩子的程序结束,则系统会自已卸载钩子。
(f)分系统钩子和线程钩子。

(3)略

 
原文地址:https://www.cnblogs.com/ZhouXiHong/p/646019.html