钩子程序
Hook是Windows消息处理机制的一个平台,应用程序可以在上面设置子程序以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理Windows消息或特定事件。
钩子的分类
线程钩子
监视指定线程的事件消息
系统钩子
监视系统中的所有线程的事件消息
二者最大区别:因为系统钩子会影响系统中所有的应用程序,所以钩子函数必须放在独立的动态链接库(DLL)中
工作原理
创建钩子时,Windows会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中,新的钩子加在老的钩子前面。
当一个事件发生时,如果安装的是一个线程钩子,那么线程中的钩子函数将被调用;如果是一个系统钩子,系统必须把钩子函数插入到其他进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库。
注:
1、对于同一事件既安装了线程钩子又安装了系统钩子,那么系统会先调用线程钩子,然后调用系统钩子。
2、对同一事件消息可安装多个钩子处理过程,这些钩子处理过程形成了钩子链,当前钩子处理结束后应把钩子信息传递给下一个钩子函数。最近安装的钩子放在链的开始,最早安装的钩子放在最后。
两种形式
修改函数代码
- Inline Hook
修改函数地址
- IAT HOOK
- SSDT HOOK
- IDT HOOK
- EAT HOOK
- IRP HOOK
Hook Api
Hook Api则是要把这个Api进行挂钩,让其执行我们的代码,然后再执行Api的代码。
注:在Hook时要注意预留五个字节空间,如果预留的空间还会影响后面的代码,那么就多于预留点空间。