Hook(钩子技术)基本知识讲解,原理

一、什么是HOOK(钩子)      对于Windows系统,它是建立在事件驱动机制上的,说白了就是整个系统都是通过消息传递实现的。hook(钩子)是一种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往目标窗口的消息并进行处理。所以说,我们可以在系统中自定义钩子,用来监视系统中特定事件的发生,完成特定功能,如屏幕取词,监视日志,截获键盘、鼠标输入等等。     钩子…

大家好,又见面了,我是你们的朋友全栈君。

一、什么是HOOK(钩子) 

        对于Windows系统,它是建立在事件驱动机制上的,说白了就是整个系统都是通过消息传递实现的。hook(钩子)是一种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往目标窗口的消息并进行处理。所以说,我们可以在系统中自定义钩子,用来监视系统中特定事件的发生,完成特定功能,如屏幕取词,监视日志,截获键盘、鼠标输入等等。
        钩子的种类很多,每种钩子可以截获相应的消息,如键盘钩子可以截获键盘消息,外壳钩子可以截取、启动和关闭应用程序的消息等。钩子可以分为线程钩子和系统钩子,线程钩子可以监视指定线程的事件消息,系统钩子监视系统中的所有线程的事件消息。因为系统钩子会影响系统中所有的应用程序,所以钩子函数必须放在独立的动态链接库(DLL) 中。
       所以说,hook(钩子)就是一个Windows消息的拦截机制,可以拦截单个进程的消息(线程钩子),也可以拦截所有进程的消息(系统钩子),也可以对拦截的消息进行自定义的处理。Windows消息带了一些程序有用的信息,比如Mouse类信息,就带有鼠标所在窗体句柄、鼠标位置等信息,拦截了这些消息,就可以做出例如金山词霸一类的屏幕取词功能。

二、Hook 分类

 (1) 线程钩子监视指定线程的事件消息。
(2) 系统钩子监视系统中的所有线程的事件消息。因为系统钩子会影响系统中所有的应用程序,所以钩子函数必须放在独立的动态链接库(DLL)中。这是系统钩子和线程钩子很大的不同之处。

三、HOOK(钩子)的工作原理

       正确使用钩子函数前,我们先讲解钩子函数的工作原理。当您创建一个钩子时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。新的钩子将加到老的前面。当一个事件发生时,如果您安装的是一个线程钩子,您进程中的钩子函数将被调用。如果是一个系统钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库中,所以如果您想要使用系统钩子,就必须把该钩子函数放到动态链接库中去。

      当然有两个例外:工作日志钩子和工作日志回放钩子。这两个钩子的钩子函数必须在安装钩子的线程中。原因是:这两个钩子是用来监控比较底层的硬件事件的,既然是记录和回放,所有的事件就当然都是有先后次序的。所以如果把回调函数放在DLL中,输入的事件被放在几个线程中记录,所以我们无法保证得到正确的次序。故解决的办法是:把钩子函数放到单个的线程中,譬如安装钩子的线程。
       几点需要说明的地方: 
  (1) 如果对于同一事件(如鼠标消息)既安装了线程钩子又安装了系统钩子,那么系统会自动先调用线程钩子,然后调用系统钩子。 
  (2) 对同一事件消息可安装多个钩子处理过程,这些钩子处理过程形成了钩子链。当前钩子处理结束后应把钩子信息传递给下一个钩子函数。而且最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。 
  (3) 钩子特别是系统钩子会消耗消息处理时间,降低系统性能。只有在必要的时候才安装钩子,在使用完毕后要及时卸载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/124601.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月3日 下午12:35
下一篇 2022年4月3日 下午12:35


相关推荐

  • badboy设置中文_录制脚本badboy工具使用手册

    badboy设置中文_录制脚本badboy工具使用手册开源测试工具 badboy 使用手册一 Badboy 下载安装这里介绍的是 BadboyInstal 2 0 5 下载安装后 打开后 界面如下 图 1 二 Badboy 按钮功能讲解图 2 三 Badboy 使用大概分为以下步骤 1 录制脚本 2 参数化 3 检查点 4 脚本回放 录制脚本 打开界面 在界面 url 处填写录制地址 图 3 默认情况下 badboy 在双击打开的时候就自动开启录制 不过我们最好在一切准

    2026年3月16日
    1
  • 【转】使用Chrome Frame,彻底解决浏览器兼容问题「建议收藏」

    【转】使用Chrome Frame,彻底解决浏览器兼容问题「建议收藏」本文转自http://www.ryanbay.com/?p=269,感谢该作者的总结 X-UA-Compatible是自从IE8新加的一个设置,对于IE8以下的浏览器是不识别的。通过在meta中设置X-UA-Compatible的值,可以指定网页的兼容性模式设置。在网页中指定的模式优先权高于服务器中(通过HTTPHeader)所指定的模式。兼容性模式设置优先级: metatag>…

    2022年7月16日
    31
  • Vue 修饰符使用总结

    Vue 修饰符使用总结修饰符是 Vue 的重要组成部分 利用好修饰符可以大大地提高开发的效率 v modellazy 修饰符 改变输入框的值时 v model 绑定的值 value 不会改变 当光标离开输入框时才会改变 inputtype text v model lazy value trim 修饰符 类似于 JavaScript 中的 trim 方法 把 v model 绑定的值的首尾空格给过滤掉 inputtype text v model lazy value

    2026年3月17日
    2
  • UV Mapping(UV贴图)

    UV Mapping(UV贴图)当映射一个 2D 纹理到一个 3D 模型上 要设定循环模式 平铺方式 这就是三维建模程序中 被称为 UV 贴图 在 Unity 可以使用 Materials 缩放移动纹理 缩放法线和地形细节贴图尤其有用 UV 这里是指 u v 纹理贴图坐标的简称 它和空间模型的 X Y Z 轴是类似的 它定义了图片上每个点的位置的信息 这些点与 3D 模型是相互联系的 以决定表面纹理贴图的位置 UV 就是将图像上每一个点精确对应到模型物体的表面 在点与点之间的间隙位置由软件进行图像光滑插值处理 这就是所谓的 UV 贴图

    2026年3月18日
    3
  • 【mykit-data】 数据库同步工具

    【mykit-data】 数据库同步工具mykit data 数据库同步工具

    2026年3月18日
    1
  • OSSIM开源安全信息管理系统(一)

    OSSIM开源安全信息管理系统(一)2021SC SDUSC 一 OSSIM 简介 OSSIM 即开源安全信息管理系统 OPENSOURCESE 由美国的 AlienVault 公司开发 是一个非常流行和完整的开源安全架构体系 OSSIM 通过将开源产品进行集成 从而提供一种能够实现安全监控功能的基础平台 它的目的是提供一种集中式 有组织的 能够更好地进行监测和显示的框架式系统 OSSIM 定位于一个集成解决方案 其目标并不是要开发一个新的系统 而是利用丰富的 强大的各种程序 包括

    2026年3月17日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号