×

windows消息钩子

windows消息钩子(消息钩子的简介)

admin admin 发表于2023-04-09 06:19:07 浏览85 评论0

抢沙发发表评论

本文目录

消息钩子的简介


若在dll中使用SetWindowsHookEx设置一全局钩子,系统会将其加载入使用user32的进程中,因而它也可被利用为无进程木马的进程注入手段。《/CA》 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。 每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。
Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。
钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。 SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是线程钩子。
线程钩子用于监视指定线程的事件消息。线程钩子一般在当前线程或者当前线程派生的线程内。
系统钩子监视系统中的所有线程的事件消息。因为系统钩子会影响系统中所有的应用程序,所以钩子函数必须放在独立的动态链接库(DLL) 中。系统自动将包含“钩子回调函数”的DLL映射到受钩子函数影响的所有进程的地址空间中,即将这个DLL注入了那些进程。 (1)如果对于同一事件(如鼠标消息)既安装了线程钩子又安装了系统钩子,那么系统会自动先调用线程钩子,然后调用系统钩子。
(2)对同一事件消息可安装多个钩子处理过程,这些钩子处理过程形成了钩子链。当前钩子处理结束后应把钩子信息传递给下一个钩子函数。
(3)钩子特别是系统钩子会消耗消息处理时间,降低系统性能。只有在必要的时候才安装钩子,在使用完毕后要及时卸载。


怎样对Windows消息进行拦截


首先来说说windows 消息Hook,这个消息Hook就是我们常用的通过SetWindowsHookEx来设置一个Hook,这个函数通过将这个Hook插入到Hook链的最前端,而发送给我们已经Hook了的窗口的消息首先会被我们的Hook函数截获,也就是我们优先于窗体捕获到消息。
Windows Message Hook 可以实现全局Hook和局部Hook。局部Hook是在自身进程中创建一个Hook,可以用来捕获自身进程中的消息;而全局Hook是可以捕获操作系统下所有的指定的消息,需要借助于DLL来实现。全局钩子必须要使用DLL,DLl存放了钩子函数的代码。在操作系统中安装了全局钩子后,只要进程收到可以发出钩子的消息后,全局钩子的DLl文件会被操作系统自动或强行地加载到该进程中。可以发现设置消息钩子也是一种导入DLl的方法。
一.钩子函数:
其实钩子函数也就3个:
(1)设置钩子:SetWindowsHookEx
(2)释放钩子:UnhookWindowsHookEx
(3)继续钩子:CallNextHookEx
在线程级的钩子中经常用到 GetCurrentThreadID 函数来获取当前线程的 ID
1. SetWindowsHookEx
HHOOK SetWindowsHookEx(
int idHook, // hook type(钩子类型,即它处理的消息类型)
HOOKPROC lpfn, // hook procedure(回调函数的地址)
HINSTANCE hMod, // handle to application instance(实例句柄,标识包含lpfn所指的子程的DLL)
DWORD dwThreadId // thread identifier(线程ID)
);
第一个参数为钩子的类型,钩子的类型一共还有14种,表示在什么时机调用钩子。下面会介绍。
第二个参数为钩子的子程,实际上就是一个回调函数的地址,当相应的事件发生时系统就会调用这个回调函数。
第三个参数为这个钩子绑定的进程的实例句柄,即包含回调函数的DLL的实例句柄,如果dwThreadId 标识当前进程创建的一个线程,而且子程代码位于当前进程,hMod必须为NULL。 可以很简单的设定其为本应用程序的实例句柄。
第四个参数为线程的ID,若为全局钩子这个参数设置为0,若是线程钩子可以使用GetCurrentThreadId来获得当前线程的ID
返回值:若调用成功,返回的是这个钩子过程的句柄;否则返回NULL
2.UnhookWindowsHookEx
钩子在使用完之后需要用UnhookWindowsHookEx()卸载,否则会造成麻烦。释放钩子比较简单,()只有一个参数。函数原型如下:
UnhookWindowsHookEx( HHOOK hhk );
函数成功返回TRUE,否则返回FALSE。
3.CallNextHookEx
在钩子子程中调用得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个 SDK中的API函数CallNextHookEx来传递它,以执行钩子链表所指的下一个钩子子程。这个函数成功时返回钩子链中下一个钩子过程的返回值, 返回值的类型依赖于钩子的类型。
LRESULT CallNextHookEx
(
HHOOK hhk;
int nCode;
WPARAM wParam;
LPARAM lParam;
);
hhk为当前钩子的句柄,由SetWindowsHookEx()函数返回。
NCode为传给钩子过程的事件代码。
wParam和lParam 分别是传给钩子子程的wParam值,其具体含义与钩子类型有关。
钩子函数也可以通过直接返回TRUE来丢弃该消息,并阻止该消息的传递。否则的话,其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果。

什么是消息钩子


钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之前处理它们。 钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可以截获键盘消息,鼠标钩子可以截获鼠标消息,外壳钩子可以截获启动和关闭应用程序的消息,日志钩子可以监视和记录输入事件。
若在dll中使用SetWindowsHookEx设置一全局钩子,系统会将其加载入使用user32的进程中,因而它也可被利用为无进程木马的进程注入手段。