文章目录
Hook(Windows系统机制)
Hook定义
Hook是Windows中提供的一种用以替换DOS下“中断”的系统机制,中文译为“挂钩”或 “钩子” 。
在对特定的系统事件进行hook后,一旦发生已hook事件,对该事件进行hook的程 序就会收到系统的通知,这时程序就能在第一时间对该事件做出响应。
钩子(Hook) ,是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定 窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处 理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出, 在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函 数即可以加工处理(改变) 该消息,也可以不作处理而继续传递该消息,还可以强制结束消息 的传递。
Hook原理
• 每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定 的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程序。当与指定的Hook类 型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息, 或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始, 而最早安装的钩子放在最后,也就是后加入的先获得控制权。
• Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放 其占用的内存,并更新整个Hook链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系 统会自动为它做卸载钩子的操作。
• 钩子子程是一个应用程序定义的回调函数(CALLBACK Function) ,不能定义成某个类的成员函数,只能定 义为普通的C函数。用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可 以是系统中所有线程的事件。
系统钩子与线程钩子
SetWindowsHookEx()
函数的最后一个参数决定了此钩子是系统钩子还是线程钩子。
线程钩子用于监视指定线程的事件消息。线程钩子一般在当前线程或者当前线 程派生的线程内。
系统钩子 监视系统中的所有线程的事件消息。因为系统钩子会影响系统中所有 的应用程序,所以钩子函数必须放在独立的动态链接库(DLL) 中。系统自动将 包含“钩子回调函数”的DLL映射到受钩子函数影响的所有进程的地址空间中, 即将这个DLL注入了那些进程。
钩子函数
我师父说:就研究明白这三个函数,钩子基本就会了。
设置钩子: SetWindowsHookEx
函数功能:该函数将一个应用程序定义的挂钩处理过程安装到挂钩链中去,您可以通过安装挂钩处理过程来对系统的某些类型事件进行监控,这些事件与某个特定的线程或系统中的所有事件相关.
函数原形:
HHOOK SetWindowsHookEx( int idHook, HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId );
参数:
idHook
:指示欲被安装的挂钩处理过程之类型,此参数可以是以下值之一:
参数 | 功能说明 |
---|---|
WH_CALLWNDPROC(4) | 安装一个挂钩处理过程,在系统将消息发送至目标窗口处理过程之前,对该消息进行监视,详情参见CallWndProc挂钩处理过程. |
WH_CALLWNDPROCRET(12) | 安装一个挂钩处理过程,它对已被目标窗口处理过程处理过了的消息进行监视,详情参见 CallWndRetProc 挂钩处理过程. |
WH_CBT(5) | 安装一个挂钩处理过程,接受对CBT应用程序有用的消息 ,详情参见 CBTProc 挂钩处理过程. |
WH_DEBUG(9) | 安装一个挂钩处理过程以便对其他挂钩处理过程进行调试, 详情参见DebugProc挂钩处理过程. |
WH_FOREGROUNDIDLE(11) | 安装一个挂钩处理过程,该挂钩处理过程当应用程序的前台线程即将进入空闲状态时被调用,它有助于在空闲时间内执行低优先级的任务. |
WH_GETMESSAGE(3) | 安装一个挂钩处理过程对寄送至消息队列的消息进行监视,详情参见 GetMsgProc 挂钩处理过程. |
WH_JOURNALPLAYBACK(1) | 安装一个挂钩处理过程,对此前由WH_JOURNALRECORD 挂钩处理过程纪录的消息进行寄送.详情参见 JournalPlaybackProc挂钩处理过程. |
WH_JOURNALRECORD(0) | 安装一个挂钩处理过程,对寄送至系统消息队列的输入消息进行纪录.详情参见JournalRe |