首先说说这个技术的实现环境,大家都知道windows的近几个版本都是使用了消息循环机制的,所谓的消息循环机制就是在windows上跑的各种程序之间和windows 之间的交互都是通过消息实现的,这里特指的是windows 和应用程序之间而不是各个程序之间,既然提到了消息,那就说可以截获消息,这里截获消息处理消息的过程就是消息钩子。
简单说下windows消息队列,其实每一个IO操作,控制操作都可以看作是一种消息,这在DOS系统中是采用中断的形式来处理的(现在部分交互改成windows消息机制了),应用程序发出消息->由Windows消息队列接受消息->根据已有注册的消息处理函数,分发给对应的消息处理函数(如果有的消息找不到处理函数,就会由系统接管该消息)->返回消息处理或者结束一次消息通讯,但是这个整个过程中windows做的就是始终监听是否有消息需要转发,确保消息转发和处理的及时性。
实现原理:
每一个Hook程序都有一个索引指针,这个指针是被串在一个由系统来维护的钩子链表上,这样系统就是可以把获得的消息和回调函数对应起来(注册Hook处理程序的时候都指定了要处理的消息类型)。当有对应的消息过来的时,系统我就把该消息传递当对应的Hook程序,由Hook 处理该消息,也可以修改消息,最后可以把消息传递下去也可以结束消息循环,当然一个程序可以被注册多个消息处理函数,这些函数会根据调用哪呢?其实是最早挂载的钩子会在最晚执行(队列结构),每一次销毁一个Hook程序,就会更新一下钩子链表(这里不要求按顺序删除钩子)
简单说下windows消息队列,其实每一个IO操作,控制操作都可以看作是一种消息,这在DOS系统中是采用中断的形式来处理的(现在部分交互改成windows消息机制了),应用程序发出消息->由Windows消息队列接受消息->根据已有注册的消息处理函数,分发给对应的消息处理函数(如果有的消息找不到处理函数,就会由系统接管该消息)->返回消息处理或者结束一次消息通讯,但是这个整个过程中windows做的就是始终监听是否有消息需要转发,确保消息转发和处理的及时性。
实现原理:
每一个Hook程序都有一个索引指针,这个指针是被串在一个由系统来维护的钩子链表上,这样系统就是可以把获得的消息和回调函数对应起来(注册Hook处理程序的时候都指定了要处理的消息类型)。当有对应的消息过来的时,系统我就把该消息传递当对应的Hook程序,由Hook 处理该消息,也可以修改消息,最后可以把消息传递下去也可以结束消息循环,当然一个程序可以被注册多个消息处理函数,这些函数会根据调用哪呢?其实是最早挂载的钩子会在最晚执行(队列结构),每一次销毁一个Hook程序,就会更新一下钩子链表(这里不要求按顺序删除钩子)