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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 亲测解决 :Navigation cancelled from “xxx“ to “xxx“ with a new navigation

    亲测解决 :Navigation cancelled from “xxx“ to “xxx“ with a new navigation使用vue3.0写了一个登入页面,再点击登入的时候,第一次点击会没有反应,F12查看接口都调用了但是没有跳转,控制台打印出错:错误说有异常没有捕获;这个错误是vue-router内部的错误,没有进行catch处理导致的;再vue-router3.0以上的版本新增功能:push和replace方法会返回一个promise;解决方案:在vue的router的js中添加下面代码constoriginalPush=VueRouter.prototype.pushconstorigin

    2022年7月26日
    11
  • spring的配置文件-applicationContext.xml

    spring的配置文件-applicationContext.xml1.<beans>标签是spring的配置文件的根标签,其包含相关的命名空间,用于约束子标签的标识<?xmlversion=”1.0″encoding=”UTF-8″?><beansxmlns=”http://www.springframework.org/schema/beans”xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”xmlns:aop=”http://www.s

    2022年7月13日
    16
  • 2023考研高数接力题典1800习题讲解

    2023考研高数接力题典1800习题讲解第一部分(函数、极限、连续)极限求法:①直接代入数值②约去不能代入的零因子③分子分母同除最高次幂④分子分母有理化⑤公式法⑥等价无穷小量的代换⑦洛必达法则⑧换底公式(对数)入门练习填空题讲解(1~4):第一题:我们通过观察,发现是0/0型的,自然想到了洛必达法则。百度百科:洛必达法则是在一定条件下通过分子分母分别求导再求极限来确定未定式值的方法。众所周知,两个无穷小之比或两个无穷大之比的极限可能存在,也可能不存在。因此,求这类极限时往往需要适当的变形,转化成可利用极限运算法则或重要

    2022年8月11日
    7
  • 初探粒子群优化算法(PSO)[通俗易懂]

    初探粒子群优化算法(PSO)[通俗易懂]初探粒子群优化算法(PSO)粒子群优化算法简介PSO的优点PSO的缺点PSO的原理及基本概念算法描述参数分析粒子群的拓扑结构初始化时的前人经验粒子群优化算法简介粒子群优化算法(PSO)最初是由Kennedy和Eberhart博士于1995年受人工生命研究的结果启发,在模拟鸟群觅食过程中的迁徙和群集行为时提出的一种基于群体智能的演化计算技术。PSO是一种随机全局优化技术,通过粒子间的相互作用发现复杂搜索空间中的最优区域。由于PSO算法独特的优势,在工程领域中收到研究者的广泛关注。PSO算法归根到底是一

    2022年10月11日
    3
  • list数组遍历时能不能使用remove()方法,要注意什么

    list数组遍历时能不能使用remove()方法,要注意什么list数组遍历时能不能使用remove()方法,要注意什么

    2022年4月23日
    68
  • 动态数组

    动态数组什么是数据结构?线性表数组动态数组设计项目结构代码实现CybArrayList.javapackagecom.cyb;/***自定义ArrayList数组**@author

    2022年7月2日
    36

发表回复

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

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