智动软件 - 站长优化推广网站好帮手
帐号: 密码: 注册会员
模糊 标题

钩子(HOOK)函数教程(二)

时间:2010-04-21 Tag: HOOK 钩子 教程 点击:统计中..

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

本文来自智动软件zdwork.cn

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

zdwork.cn

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

copyright 智动软件

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

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

 Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。 本文来自智动软件zdwork.cn

大多数人或者网上文章认为全局钩子都要依赖于一个DLL才能正常工作的,常常会看到很多人在论坛上长期争论一个话题:“全局钩子一定要在DLL里面吗?”。实际上这里有一个概念的问题,究竟上面提到的全局钩子是指什么。通过对上面各种钩子的作用域的理解就会发现这个问题的答案。 本文来自智动软件zdwork.cn

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

copyright 智动软件

Hook www.zdwork.cn

Scope

www.zdwork.cn

WH_CALLWNDPROC zdwork.cn

Thread or global

copyright 智动软件

WH_CALLWNDPROCRET

内容来自zdwork.cn

Thread or global copyright 智动软件

WH_CBT 智动软件

Thread or global

内容来自zdwork.cn

WH_DEBUG www.zdwork.cn

Thread or global

zdwork.cn

WH_FOREGROUNDIDLE www.zdwork.cn

Thread or global

www.zdwork.cn

WH_GETMESSAGE 本文来自智动软件zdwork.cn

Thread or global 内容来自zdwork.cn

WH_JOURNALPLAYBACK

zdwork.cn

Global only

内容来自zdwork.cn

WH_JOURNALRECORD 内容来自zdwork.cn

Global only 内容来自zdwork.cn

WH_KEYBOARD zdwork.cn

Thread or global

智动软件

WH_KEYBOARD_LL 内容来自zdwork.cn

Global only www.zdwork.cn

WH_MOUSE copyright 智动软件

Thread or global copyright 智动软件

WH_MOUSE_LL

www.zdwork.cn

Global only

www.zdwork.cn

WH_MSGFILTER copyright 智动软件

Thread or global

智动软件

WH_SHELL 本文来自智动软件zdwork.cn

Thread or global 内容来自zdwork.cn

WH_SYSMSGFILTER

本文来自智动软件zdwork.cn

Global only

www.zdwork.cn

表一:钩子作用域

智动软件

WH_JOURNALPLAYBACKWH_JOURNALRECORDWH_KEYBOARD_LLWH_MOUSE_LLWH_SYSMSGFILTER5种钩子本身的作用域就是全局的,不管钩子是直接写在应用程序的代码里还是放在DLL中,他们都能够钩住系统的消息。剩下的10种钩子,他们的作用域既可以是线程的又可以是全局的,当将相应的钩子直接写在应用程序的代码中时,他们只能捕获当前线程上下文的消息。那么他们如何实现捕获全局消息的功能呢?当把钩子写入到一个单独的DLL中再引用后,系统自动将该DLL映射到受钩子函数影响的所有进程的地址空间中,即将这个DLL注入了那些进程,从而达到捕获全局消息的目的。相对来说,前面5种钩子本身就是全局的,是不需要注入的。 智动软件

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

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

zdwork.cn

                           2007-4-5  Helios www.zdwork.cn

  copyright 智动软件

(责任编辑:admin)
顶一下
(0)
0%
踩一下
(1)
100%

推荐内容

热门内容

相关内容


关于我们 | 联系我们 | 代理合作 | 意见及建议

本站免费提供刷IP软件,另有邮件搜索软件等,需要定制软件或有建议可联系我们。联系方式:QQ:896186342 Email:zdwork@qq.com 滇ICP备08001410号.