Windows下的对话框应用软件是根据消息推动的,可是在某种情形下必须捕获或是改动消息,进而进行一些独特的作用。针对捕获消息来讲,没法应用IAT或Inline Hook之类的形式去开展捕获,但是Windows给予了专业用来解决消息的钩子函数。
01 钩子基本原理
Windows下的应用软件绝大多数是根据消息方式体制的,一些CUI的流程并不是根据消息的。Windows下的应用软件都是有一个消息全过程函数,依据不一样的消息来进行不一样的作用。Windows电脑操作系统给予的钩子体制的功能是用于捕获、监控系统中的消息。Windows电脑操作系统给予了许多不一样品种的钩子,可以解决差异的消息。
Windows系统给予的钩子依照挂勾范畴分成部分钩子和全局性钩子。部分钩子是对于一个进程的,而全局性钩子则是对于全部电脑操作系统内根据消息体制的手机应用程序的。全局性钩子必须应用DLL文件,DLL文件里储放了钩子函数的编码。
在系统中安裝全局性钩子之后,只需进程接受到可以传出钩子的消息后,全局性钩子的DLL文件会被电脑操作系统全自动或强制地载入到该进程中。不难看出,设定消息钩子也是一种可以开展DLL引入的方式。
02 钩子函数
钩子函数关键有3个,分别是SetWindowsHookEx()、CallNextHookEx()和UnhookWindowsHookEx()。下边详细介绍这种函数的操作方法。
SetWindowsHookEx()函数的界定如下所示:
该函数的传参为一个钩子句柄。这一函数有4个主要参数,下边各自开展详细介绍。
lpfn:该主要参数特定为 Hook 函数的详细地址。假如 dwThreadId 主要参数被取值为 0,或是被设定为一个别的进程中的进程 ID,那麼 lpfn 则归属于 DLL 中的函数全过程。假如 dwThreadId 为现阶段进程中的进程 ID,那麼 lpfn 可以是偏向现阶段进程中的函数全过程,还可以是归属于 DLL 中的函数全过程。
hMod:该主要参数特定钩子函数所属控制模块的模块句柄。该控制模块句柄便是 lpfn 所属的控制模块的句柄。假如 dwThreadId 为现阶段进程中的进程 ID,并且 lpfn 所对准的函数在现阶段进程中,那麼 hMod 将被设定为 NULL。
dwThreadId:该基本参数为必须被挂勾的进程的 ID 号。假如设定为 0,表明在任何的进程中挂勾(这儿的“全部的进程”表明根据消息体制的任何的进程)。假如特定为详细的进程的 ID 号,表明要在规定的进程中开展挂勾。该主要参数危害上边2个主要参数的选值。该主要参数的选值决策了该钩子归属于全局性钩子,或是部分钩子。
idHook:该主要参数表明钩子的种类。因为钩子的种类十分多,因而放到任何的主要参数后边开展详细介绍。下边详细介绍好多个常见到的钩子,也可能是大伙儿非常关心的一些种类。
1. WH_GETMESSAGE
安裝该钩子的功能是监控被递送到消息序列中的消息。也就是当启用GetMessage()或PeekMessage()函数时,函数从程序流程的消息序列中获得一个消息后启用该钩子。
WH_GETMESSAGE钩子函数的界定如下所示:
2. WH_MOUSE
安裝该钩子的功能是监控电脑鼠标消息。该钩子函数的界定如下所示:
3. WH_KEYBOARD
安裝该钩子的功能是监控电脑键盘消息。该钩子函数的界定如下所示:
4. WH_DEBUG
安裝该钩子的功能是调节别的钩子的钩子函数。该钩子函数的界定如下所示:
从以上的这种钩子函数界定可以看得出,每一个钩子函数的界定全是一样的。每一种类别的钩子监控、捕获的消息不一样。尽管他们的界定基本都是同样的,可是函数主要参数的实际意义是不一样的。
然后详细介绍跟钩子相关的此外一个函数:UnhookWindowsHookEx(),其界定如下所示:
这一函数是用于清除此前用SetWindowsHookEx()安裝的钩子。该函数只有一个主要参数,是钩子句柄,也就是启用该函数根据特定的钩子句柄来清除与其说相对应的钩子。
在系统中,可以多次不断地应用SetWindowsHookEx()函数来安裝钩子,并且可以安裝好几个一样种类的钩子。那样,钩子便会产生一条钩子链,最终安裝的钩子会最先捕获到消息。当该钩子对消息处理完毕之后,会挑选回到,或是挑选把消息再次传送下来。在一般来说,假如为了更好地屏蔽掉消息,则立即在钩子函数中回到一个非零值。例如要在自身程序流程中屏蔽掉电脑鼠标消息,则在组装的电脑鼠标钩子函数中立即回到非零值就可以。假如为了更好地消息在通过钩子函数后可以再次传实现目标对话框,务必挑选将消息再次传送。使消息能再次传送的函数的界定如下所示:
该函数有4个主要参数。第一个参数是钩子句柄,便是启用SetWindowsHookEx()函数的传参;后边3个主要参数是钩子函数的参数,立即先后抄过来就可以。例如:
03 钩子案例
Windows钩子的使用较为广。不论是网络安全产品或是恶意程序,乃至是基本手机软件,都是会使用Windows给予的钩子作用。
1. 全局性键盘钩子
下边来写一个可以截获键盘消息的钩子程序流程,其作用比较简单,便是把按住的键相匹配的字符串表明出去。即然要截获键盘消息,那麼肯定是截获系统软件范畴内的键盘消息,因而必须安裝全局性钩子,那样就必须DLL文件的适用。先来新创建一个DLL文件,在该DLL文件中必须界定2个导出来函数公式和2个局部变量,界定如下所示:
在DllMain()函数公式中,必须储存该DLL控制模块的句柄,以便捷安裝全局性钩子。编码如下所示:
安裝与卸载掉钩子的函数公式如下所示:
针对Windows钩子而言,上边的这种流程大部分全是需要的,或是是区别并不大,重点在于钩子函数公式的完成。这儿是为了更好地获得键盘按住的键,钩子函数公式如下所示:
有关钩子函数公式,这儿简易地解释一下,最先是进到钩子函数公式的第一个分辨。
假如code的值低于0,则务必启用CallNextHookEx(),将消息再次传送下来,不对该消息开展解决,并回到CallNextHookEx()函数公式的传参。这一点是MSDN上规定那么做的。
假如code等于HC_ACTION,表明消息中包括功能键消息;假如为WM_KEYDOWN,则表明功能键相匹配的文字。
将该DLL文件编译程序联接。为了更好地检测该DLL文件,新创建一个MFC的Dialog工程项目,加上2个按键,如下图1所显示。
图1 键盘钩子的测试代码
各自对这两个按键添加编码,详细如下:
立即启用DLL文件导出来这两个函数,但是在应用前要先对这两个函数开展申明,不然c语言编译器因无法找到这两个函数的原形而造成连接失败。界定如下所示:
开展编译程序联接,提醒出差错,內容如下所示:
从得出的提醒可以看得出是联接不正确,找不着外界的标记。将DLL编译程序联接后形成的DLL文件和LIB文档都拷贝到测试工程的文件目录下,并将LIB文档添加到工程项目中。在编码中添加如下所示句子:
再度联接,取得成功!
运作测试代码,并点击“HookOn”按键,随意按住键盘上的任何一个键,会发生提醒提示框,如下图2所显示。
图2 捕获到的数字键盘
从图2中可以看得出,当按住键盘上的功能键时,程序流程将捕获到功能键。到此,键盘钩子的事例程序流程就完成了。
2. 低等键盘钩子
数据信息防泄漏手机软件通常会严禁PrintScreen键,避免根据手机截图将数据信息保留为照片而造成泄密事件。这类手机软件要想完成是非常简单的,可是需要将作用做得强劲些,或是要狠下功夫的。数据信息防外泄的手机软件除开要有兼容模式好的最底层驱动程序的设计方案,还需要有健全的规范设定。除此之外便是必须软件平台工作人员对它进行各式各样的进攻,防止数据信息防泄漏手机软件由于各式各样的缘故而被心怀恶意者提升。
这儿详细介绍怎样严禁PrintScreen键。其实不是很难,只需安裝低等键盘钩子(WH_KEYBO ARD_LL)就可以解决。一般的键盘钩子(WH_KEYBOARD)是不能过虑一些系统软件功能键的。在低等键盘钩子的调整函数中,分辨是不是为PrintScreen键,如果是,则立即回到TRUE(前边提及,假如想屏蔽掉某一信息得话,那麼在勾子函数中对该信息开展加工处理后,立即回到一个非零值),要不是,则传送给勾子链的下一处。
编码如下所示:
代码量十分短,殊不知,便是这短短代码阻拦了数据信息的泄漏。自然,针对一个攻击者而言,这一代码没法保护数据信息,这类保护也就很敏感了。一切的保护都是有提升的方法,进攻无所不在,攻击者会试着一切方式提升全部的保护。
3. 应用钩子开展DLL注入
Windows给予的钩子种类十分多,在其中一种类别的钩子十分好用,那便是WH_GETME SSAGE钩子。它可以很便捷地将DLL文件注入到全部的根据信息体制的流程中。
在很多状况下,必须DLL文件进行一些作用,可是进行作用时必须DLL在总体目标过程的区域中。这时,就要应用WH_GETMESSAGE信息把DLL注入到方向的过程中。代码比较简单,这儿立即得出DLL文件的代码,详细如下:
全部代码就这样。只需了解,在必须DLL大范畴地注入到根据信息的过程里时,可以采用这些方式。