什么是钩子
钩子源于hook,即在消息过去之前先把消息钩住,不让消息执行,自己先优先处理。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
钩子列表
一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。
hook的应用
有一些技术时利用hook的,比如一些程序经常会校验自身签名,不允许你改动程序安装包,这个时候如果Hook住校验的函数,假装处理为校验通过(其实根本没通过,因为你能优先处理并返回,所以执行不到原始的代码了),这种情况下酒欺骗了原始程序,从而达到目的。
程序挂载全局钩子从而被360拦截的例子(其实360也有钩子,不然怎么知道别人要挂载钩子呢?即360可以拦截“挂载钩子”的消息。这个弹窗就是在360的钩子函数中创建的)
相关翻译
DDL: 动态链接库
Hook Chain : 钩子链表
hook procedures : 钩子子程(即得到消息后进行处理的程序段)