现在的位置: 首页 > web前端 > 正文

hook编程是什么

2020年07月21日 web前端 ⁄ 共 1117字 ⁄ 字号 评论关闭

  Hook是Windows下的一个机制,Hook的中文意思是钩子的意思,顾名思义,钩子就是用来钩东西的,就好像钓鱼一样,你把鱼钩放入鱼塘里,钓到了某条鱼,即便我们不把鱼钓上来,我们可以通过鱼钩知道鱼在做什么,比如鱼飞速游动,鱼钩上的鱼线会做出反应,或者鱼原地不动,我们都可以通过鱼钩知道鱼在做什么!


  hook编程是什么


  Windows就像一个鱼塘,而程序,就是鱼塘里的鱼,而用来监视这些鱼的鱼钩就是Hook!


  众所周知,Windows平台上的程序是以事件驱动和消息为基础工作的,事件与消息是关联的,消息的触发来响应事件,比如我单击了一个应用程序上的按钮,那么此时这个应用程序会触发一个消息即为MK_LBUTTON消息被发送到系统的消息队列里(触发过程是由操作系统根据鼠标点击某个窗口上某个控件来触发的,原理上是由操作系统触发的消息),这些消息都是以数据结构形式存储的,每个队列里不仅存储消息还有触发的窗口句柄等参数信息,Windows会把这些消息在转发给指定窗口进程下的消息队列,然后由消息队列来处理或者由操作系统来默认处理,学过Win32编程和MFC编程的应该比较熟悉,这里的消息流程只是仅限于Windows提供的WindowsSDK库下的API接口开发的程序!


  就好像控件一样,控件其实就相当于一个窗口,只是一个需要容器的窗口,也有自己的消息循环,学过COM组件开发的都知道基于COM组件开发ActiveX控件里也有一套消息循环机制和对应的响应事件,比如按钮的获取焦点对应的绘图函数!


  其它框架不一定使用此方法,比如QT的信号和槽,但QT内部封装了Windows消息和事件驱动模型,原理上来说,你单击QT上的一个按钮还是会产生MK_LBUTTON消息并返回给对应的QT程序,还是会返回到程序的消息循环队列里去,只是QT用了信号和槽的方式来代替消息与事件,比如你用第三方软件给QT程序上的某个按钮发送MK_LBUTTON消息还是会响应对应的事件,因为QT上的控件都是基于Windows下的SDK接口来实现完成的,QT的核心还是:触发消息>系统消息>应用消息,和Windows一样,只是内部封装起来了!


  hook编程运行机制


  钩子是Windows平台下的一个用于截获消息的程序段,Windows内部也在用它,当我们使用特定函数来安装一个钩子时,操作系统会给这个钩子分配一个钩子链表,并且这个钩子就相当于一小段程序,称为钩子子程序,这段程序会根据钩子类型的不同,来实现不同程度的消息截获,并且这个钩子链表里包含了这个钩子程序的地址,类型,回调函数的地址!


  总之,hook编程给大家简单的介绍了一些,希望大家多看看。


  

抱歉!评论已关闭.