前言
Hook,中文里常常被译作“钩子”或者“挂钩”,其实是Windows操作系统里的一种中断消息机制。
可以把Hook理解为Windows操作系统消息处理机制的一个平台;应用程序可以通过设置Hook对某个进程或窗口进行监视,即:对特定事件“挂钩”;一旦预定义特定事件发生,Windows操作系统即会向钩子hook发送通知消息,这时,应用程序可进行响应。
消息Hook
Hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程前得到处理。
HOOK链 WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。例如,WH_MOUSE HOOK用来监视鼠标消息。
WINDOWS为这几种HOOKS维护着各自的HOOK链。HOOK链是一个由应用程序定义的回调函数队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息)
HOOK过程 为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK链中安装你自己的HOOK函数。
SetWindowsHookEx()
WINAPI Hook
API Hook,就是利用某种技术将API的调用转为我们自己定义的函数的调用。
API Hook有这么几种方法:
- 改写函数的首地址。
- 改写导入表
- 改写虚函数表。
驱动层Hook
用HOOK来修改API函数的功能(5)-EXE和WDM驱动通信
类似的做过远程投屏的相关的就知道,有一种获取屏幕画面的方法就是通过驱动hook拿到显示器画面。