Hook原理分析

来源:互联网 发布:mysql 删除表某个字段 编辑:程序博客网 时间:2024/06/05 11:47
首先说说这个技术的实现环境,大家都知道windows的近几个版本都是使用了消息循环机制的,所谓的消息循环机制就是在windows上跑的各种程序之间和windows 之间的交互都是通过消息实现的,这里特指的是windows 和应用程序之间而不是各个程序之间,既然提到了消息,那就说可以截获消息,这里截获消息处理消息的过程就是消息钩子。

简单说下windows消息队列,其实每一个IO操作,控制操作都可以看作是一种消息,这在DOS系统中是采用中断的形式来处理的(现在部分交互改成windows消息机制了),应用程序发出消息->由Windows消息队列接受消息->根据已有注册的消息处理函数,分发给对应的消息处理函数(如果有的消息找不到处理函数,就会由系统接管该消息)->返回消息处理或者结束一次消息通讯,但是这个整个过程中windows做的就是始终监听是否有消息需要转发,确保消息转发和处理的及时性。

实现原理:
每一个Hook程序都有一个索引指针,这个指针是被串在一个由系统来维护的钩子链表上,这样系统就是可以把获得的消息和回调函数对应起来(注册Hook处理程序的时候都指定了要处理的消息类型)。当有对应的消息过来的时,系统我就把该消息传递当对应的Hook程序,由Hook 处理该消息,也可以修改消息,最后可以把消息传递下去也可以结束消息循环,当然一个程序可以被注册多个消息处理函数,这些函数会根据调用哪呢?其实是最早挂载的钩子会在最晚执行(队列结构),每一次销毁一个Hook程序,就会更新一下钩子链表(这里不要求按顺序删除钩子),还有就是具有消息钩子的程序结束了但是还没卸载对应的钩子,这个会由系统来帮着卸载。

根据钩子程序的性质,决定了他有一些编码要求,要是保证在程序运行的时候随时可以被系统调用,要注册成回调函数(Callback),也不能定义为类的成员函数,只能定义为一般的的函数,不然被回调不了的,记住所有的callback函数都是一类被动触发的函数,一般监控这某个事件的发生,在Windows API 中实现的函数是setWindowHookEx(),其中最后一个参数来表示他是系统钩子还是线程钩子,当然在两个钩子都安装的情况下,会优先调用自己的线程钩子,多个钩子处理过程可以形成钩子链条来传递处理消息。

Hook的应用:
很多windows的正规程序都是使用了Hook技术,说下对二进制DLL的注入,也是一种Hook,这里可以实现对原来函数功能的修改,很多插件就是这样工作的,如有道的屏幕取词划词功能就是Hook了鼠标的LeftMouseUp事件。
在说下诡异的应用,替换模式,windows 更新的热补丁就是替换了函数调用前的四个无用字节,使内存代码的执行流程修改,达到立即生效的目的,还有要是对于加了互斥锁的DLL,本来是不允许两个线程或进程同时访问的,这里直接在内存修改调用该DLL的导出表就直接跳过限制DLL,执行自己任意功能,然后也可以再跳回到正确的DLL执行,这样在不影响程序功能的情况下完成了Hook。
0 0
原创粉丝点击