您的位置:首页 > 其它

关于Windows消息钩子的理解与测试项目

2018-02-11 16:47 537 查看

前奏

近来一直在自学Windows Hook相关的知识,已经尝试多种注入方式。尤其对消息钩子方式很感兴趣,因为看到Spy++能够截获系统中绝大多数应用的消息流,就很想知道它的工作原理,打算制作属于自己的Spy++。

消息钩子简介

消息钩子简言之就是Windows处理消息的一个平台,用户可以在此平台获取或过滤所需应用的消息(例如某鼠标位置,键盘击下等),这些被监控的消息都会在目标窗口处理函数之前被截获。系统在拿到消息后会问你:这是不是你想要的消息?如果是,则恭喜你,你可以在回调函数里做相应操作了。

消息钩子函数背景

消息钩子主要由三部分组成:钩子安装函数
钩子回调函数
钩子卸载函数
钩子安装函数原型
参数1-idHook:这个函数代表了你要安装钩子的种类,比如键盘钩子,鼠标钩子,窗体钩子等等。以下我列了一张表,结合MSDN供大家参考。


参数2-HOOKPROC lpfn:此参数是钩子回调函数的地址,对应上述不同种类的钩子类型,其钩子回调函数原型基本是一致的。请见下(需要注意的是,wParam和lParam针对不同类型的钩子,传递参数所代表意义不同,因种类繁多,请各位查阅MSDN):
nCode:int,此参数指示Hook例程是否需要处理消息,如果nCode为HC_ACTION,则需要处理;如果小于0,不予处理,须调用CallNextHookEx函数返回。 wParam与lParam:针对不同类型的钩子,代表的意义不同,但总体是针对当前类型钩子的消息。后面以例子做出验证。 参数3-HINSTANCE hMod:包含Hook例程的Dll所在模块基址。 参数4-DWORD dwThreadId:所要注入程序的主线程ID。如果此项填0,则代表钩子为系统钩子,基本所有在运行的进程都会被注入。如果此项指定线程ID,则是有针对性的线程钩子。返回值:HHOOK类型的句柄。钩子回调函数
请见上钩子卸载函数
参数:SetWindowsHookEx的返回值。

键盘消息钩子及CBT钩子程序代码

首先我们要明确下,钩子从安装到回显的流程编写Dll,在Dll中实现我们所需要的钩子回调函数及安装函数。
Dll中除了要编写与钩子相关的处理函数,也要编写与显示程序通信的模块,以便验证钩子消息的正确性。
Dll需要导出钩子启动函数与卸载函数。
回显程序处理已安装钩子发送的信息。
至此,框架已经明了,我们分步拆解完成这个小项目。(整体代码请见附件,VS2013编译)结构体及枚举的定义
CBT钩子的回调函数
键盘钩子的回调函数
与回显程序通讯的函数
钩子初始化函数
钩子安装及卸载函数
线程遍历函数
函数导出
至此DLL部分结束,开始回显程序的消息处理
注入器部分代码:
效果演示:(以注入notepad++为例)安装消息钩子前


安装消息钩子后


由于钩子种类繁多,我暂时没有全部实现,有兴趣的各位可以在我的基础上试试其他的,代码写的不好,让各位见笑了,如有错误,也恳请各位指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: