钩子教程 - 原理(二)

原文地址:http://www.zdexe.com/program/201004/576.htmlhtml

比较专业的对钩子的技术性理解函数

钩子(Hook),是Windows消息处理机制的一个平台,应用程序能够在上面设置子程以监视指定窗口的某种消息,并且所监视的窗口能够是其余进程所创 建的。当消息到达后,在目标窗口处理函数以前处理它。钩子机制容许应用程序截获处理window消息或特定事件。spa

Windows系统是创建在事件驱动的机制上的,说穿了就是整个系统都是经过消息的传递来实现的。而钩子是Windows系统中很是重要的系统接 口,用它能够截获并处理送给其余应用程序的消息,来完成普通应用程序难以实现的功能。钩子能够监视系统或进程中的各类事件消息,截获发往目标窗口的消息并 进行处理。这样,咱们就能够在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,好比截获键盘、鼠标的输入,屏幕取词,日志监视等等。 可见,利用钩子能够实现许多特殊而有用的功能。线程

钩子其实是一个处理消息的程序段,经过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得 到控制权。这时钩子函数便可以加工处理(改变)该消息,也能够不做处理而继续传递该消息,还能够强制结束消息的传递。指针

一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函 数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程能够只监视消息,或者 修改消息,或者中止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最先安装的钩子放在最后,也就是后加 入的先得到控制权。日志

 Windows 并不要求钩子子程的卸载顺序必定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。若是程序安装了钩子,可是在还没有卸载钩子以前就结束了,那么系统会自动为它作卸载钩子的操做。htm

大多数人或者网上文章认为全局钩子都要依赖于一个DLL才能正常工做的,经常会看到不少人在论坛上长期争论一个话题:“全局钩子必定要在DLL里面吗?”。实际上这里有一个概念的问题,究竟上面提到的全局钩子是指什么。经过对上面各类钩子的做用域的理解就会发现这个问题的答案。进程

上面一共提到了15种钩子,他们的做用域请看下表:事件

Hook内存

Scope

WH_CALLWNDPROC

Thread or global

WH_CALLWNDPROCRET

Thread or global

WH_CBT

Thread or global

WH_DEBUG

Thread or global

WH_FOREGROUNDIDLE

Thread or global

WH_GETMESSAGE

Thread or global

WH_JOURNALPLAYBACK

Global only

WH_JOURNALRECORD

Global only

WH_KEYBOARD

Thread or global

WH_KEYBOARD_LL

Global only

WH_MOUSE

Thread or global

WH_MOUSE_LL

Global only

WH_MSGFILTER

Thread or global

WH_SHELL

Thread or global

WH_SYSMSGFILTER

Global only

表一:钩子做用域

WH_JOURNALPLAYBACK,WH_JOURNALRECORD,WH_KEYBOARD_LL,WH_MOUSE_LL、WH_SYSMSGFILTER这5种钩子自己的做用域就是全局的,无论钩子是直接写在应用程序的代码里仍是放在DLL中,他们都可以钩住系统的消息。剩下的10种钩子,他们的做用域既能够是线程的又能够是全局的,当将相应的钩子直接写在应用程序的代码中时,他们只能捕获当前线程上下文的消息。那么他们如何实现捕获全局消息的功能呢?当把钩子写入到一个单独的DLL中再引用后,系统自动将该DLL映射到受钩子函数影响的全部进程的地址空间中,即将这个DLL注入了那些进程,从而达到捕获全局消息的目的。相对来讲,前面5种钩子自己就是全局的,是不须要注入的。

所以,对于前面问题的答案就是:要实现捕获全局消息功能的钩子,是否要写在单独的DLL里面,取决于钩子的类型以及相应的做用域。

若是对于同一事件既安装了线程勾子又安装了全局勾子,那么系统会自动先调用线程勾子,而后调用全局勾子。

相关文章
相关标签/搜索