WINDOWS键盘事件的挂钩监控原理及其应用技术
windows钩子教程(hook)

Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。
而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。
钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。
这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
可见,利用钩子可以实现许多特殊而有用的功能。
因此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。
钩子的类型一.按事件分类,有如下的几种常用类型(1)键盘钩子和低级键盘钩子可以监视各种键盘消息。
(2)鼠标钩子和低级鼠标钩子可以监视各种鼠标消息。
(3)外壳钩子可以监视各种Shell事件消息。
比如启动和关闭应用程序。
(4)日志钩子可以记录从系统消息队列中取出的各种事件消息。
(5)窗口过程钩子监视所有从系统消息队列发往目标窗口的消息。
此外,还有一些特定事件的钩子提供给我们使用,不一一列举。
下面描述常用的Hook类型:1、WH_CALLWNDPROC和WH_CALLWNDPROCRET HooksWH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks使你可以监视发送到窗口过程的消息。
系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook子程,并且在窗口过程处理完消息之后调用WH_CALLWNDPROCRET Hook子程。
WH_CALLWNDPROCRET Hook传递指针到CWPRETSTRUCT结构,再传递到Hook子程。
CWPRETSTRUCT结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。
2、WH_CBT Hook在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括:1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;2. 完成系统指令;3. 来自系统消息队列中的移动鼠标,键盘事件;4. 设置输入焦点事件;5. 同步系统消息队列事件。
Windows系统钩子与键盘监控

从消息队列中查询 !A 2 .NPQL 或 !A 2 .NP5I!H 消息时; *; !+ 2 AIQ3N 当调用 O*8A*’’->* 或 L**,A*’’->* 来从 消息队列中查询鼠标事件消息时; 7; !+ 2 +KM5!KMN 当 调 用 O*8A*’’->* 或 L**,A*’’->* 来从消息队列中查询非鼠标、 键盘消息时; 菜单或滚动条要处理一 >; !+ 2 A3ORG6(NM 当对话框、
..................................................... 三种消息与键盘录入有关 . . 消息处理过程, . . >9 ? @;AB:有英文字母输入时产生此消息 .. .. ..
. . >9 ? C9D ? @;AB:通过输入法输入内容时产生此消息 . . 但在 >0*4 等字处理软件中无法产生 . . 在 >0*4 等字处理软件中会产生 . . >9 ? C9D ? @E9=E(C:CEF:复杂输入法输入时会产生 . . .. . . 在这儿只给出对 >9 ? @;AB 的处理过程
!"#$%&’$ ()* )%%, "’ %#* %7 8)* "94%18-#8 :%94%’"8"%#’ %7 !"#$%&’; </ =’"#> "8,9-#/ ’/’8*9 1*’%=1:* :-# 0* ’:%=8*$ %=8,’=:) -’ 9%#"8%1,#*8&%1,,,*/0%-1$ -#$ 9%=’*,*8:; ()"’ -18":?* ’)%&’ "8’ ’ 41"#:4?* -#$ )%& 8% :1*-8 "8 -#$ )%& 8% ’8%4 "8 &"8) -# *@-94?* -0%=8 ,*/0%-1$ 2 ’4/; ()*+,%-# +%%, A*’’->* .*/0%-1$ 2 ’4/ 566
C#dll之键盘钩子详解

C#dll之键盘钩子详解WINDOWS键盘事件的挂钩监控原理及其应用技术WINDOW的消息处理机制为了能在应用程序中监控系统的各种事件消息,提供了挂接各种反调函数(HOOK)的功能。
这种挂钩函数(HOOK)类似扩充中断驱动程序,挂钩上可以挂接多个反调函数构成一个挂接函数链。
系统产生的各种消息首先被送到各种挂接函数,挂接函数根据各自的功能对消息进行监视、修改和控制等,然后交还控制权或将消息传递给下一个挂接函数以致最终达到窗口函数。
WINDOW系统的这种反调函数挂接方法虽然会略加影响到系统的运行效率,但在很多场合下是非常有用的,通过合理有效地利用键盘事件的挂钩函数监控机制可以达到预想不到的良好效果。
一、在WINDOWS键盘事件上挂接监控函数的方法WINDOW下可进行挂接的过滤函数包括11种:WH_CALLWNDPROC 窗口函数的过滤函数WH_CBT 计算机培训过滤函数WH_DEBUG 调试过滤函数WH_GETMESSAGE 获取消息过滤函数WH_HARDWARE 硬件消息过滤函数WH_JOURNALPLAYBACK 消息重放过滤函数WH_JOURNALRECORD 消息记录过滤函数WH_MOUSE 鼠标过滤函数WH_MSGFILTER 消息过滤函数WH_SYSMSGFILTER 系统消息过滤函数WH_KEYBOARD 键盘过滤函数其中键盘过滤函数是最常用最有用的过滤函数类型,不管是哪一种类型的过滤函数,其挂接的基本方法都是相同的。
WINDOW调用挂接的反调函数时总是先调用挂接链首的那个函数,因此必须将键盘挂钩函数利用函数SetWindowsHookEx()将其挂接在函数链首。
至于消息是否传递给函数链的下一个函数是由每个具体函数功能确定的,如果消息需要传统给下一个函数,可调用API函数的CallNextHookEx()来实现,如果不传递直接返回即可。
挂接函数可以是用来监控所有线程消息的全局性函数,也可以是单独监控某一线程的局部性函数。
Windows消息机制及HOOK应用

先进软件开发技术与工具
Windows消息机制及HOOK
苏曙光
3
苏曙光.软件学院.华中科技大学
苏曙光.软件学院.华中科技大学
苏曙光.软件学院.华中科技大学9
出错时退出循环
//应用程序主函数
hwnd= CreateWindow(szAppName, //窗口类名称
TEXT (“The Hello Program”), //窗口标题
//消息循环
MSG msg;
while (GetMessage(&msg)) //从消息队列中取消息
{
TranslateMessage(&msg) ; //转换消息
DispatchMessage(&msg) ; //派发消息
}
return msg.wParam;
} //Winmain()函数结束
苏曙光.软件学院.华中科技大学
苏曙光.软件学院.华中科技大学17
自定义消息第2步:实现消息处理
苏曙光.软件学院.华中科技大学18
链向下端继续传递
STEP 3:HOOK程序(处理鼠标消息)
综合测试鼠标和键盘HOOK
苏曙光.软件学院.华中科技大学35
DLL:动态链接库中实现HOOK
苏曙光.软件学院.华中科技大学36
苏曙光.软件学院.华中科技大学39
苏曙光.软件学院.华中科技大学40。
WinCE系统鼠标键盘钩子使用方法

3/5
成都英创信息技术有限公司
WinCE 系统鼠标键盘钩子使用方法
添加 Beep 函数,通过 GPIO 句柄操作 GPIO15。 void Beep() {
创建需要挂入系统的消息处理函数 即钩子函数,钩子函数定义必须为制定的格式。 钩子函数根据实际应用需求,决定是否调用 CallNextHookEx,将消息传递给后面的钩子处理。 首位的钩子函数返回值决定该消息是丢弃,还是传给系统消息处理函数,再分发给各窗口。 以下为键盘及鼠标钩子函数的示例。
键盘钩子函数
1/5
成都英创信息技术有限公司
WinCE 系统鼠标键盘钩子使用方法
使用钩子需要用到函数,SetWindowsHookEx,UnhookWindowsHookEx,CallNextHookEx。 及键盘钩子鼠标钩子的定义,及键盘消息,鼠标消息的结构体定义,均定义在 pwinuser.h 中。
#include "pwinuser.h"
该键盘钩子示例函数中,当检测到按键‘1’按下时,调用 Beep 函数触发蜂鸣器。
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
这时,可以使用键盘鼠标钩子来实现这些功能。
钩子是 WINDOWS/WINCE 系统独有的消息处理机制。通过系统调用,将消息处理程序段挂入系统, 获得消息处理优先控制权,在消息达到目的窗口前进行处理。钩子函数可以通过判断决定是否加工处理 (改变)消息,或不做处理继续传递各消息,或强制结束消息传递。
深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解

深⼊分析C#键盘勾⼦(Hook)拦截器,屏蔽键盘活动的详解钩⼦(Hook),是Windows消息处理机制的⼀个平台,应⽤程序可以在上⾯设置⼦程以监视指定窗⼝的某种消息,⽽且所监视的窗⼝可以是其他进程所创建的。
当消息到达后,在⽬标窗⼝处理函数之前处理它。
钩⼦机制允许应⽤程序截获处理window消息或特定事件。
钩⼦实际上是⼀个处理消息的程序段,通过系统调⽤,把它挂⼊系统。
每当特定的消息发出,在没有到达⽬的窗⼝前,钩⼦程序就先捕获该消息,亦即钩⼦函数先得到控制权。
这时钩⼦函数即可以加⼯处理(改变)该消息,也可以不作处理⽽继续传递该消息,还可以强制结束消息的传递。
运⾏机制1、钩⼦链表和钩⼦⼦程:每⼀个Hook都有⼀个与之相关联的指针列表,称之为钩⼦链表,由系统来维护。
这个列表的指针指向指定的,应⽤程序定义的,被Hook⼦程调⽤的回调函数,也就是该钩⼦的各个处理⼦程。
当与指定的Hook类型关联的消息发⽣时,系统就把这个消息传递到Hook⼦程。
⼀些Hook⼦程可以只监视消息,或者修改消息,或者停⽌消息的前进,避免这些消息传递到下⼀个Hook⼦程或者⽬的窗⼝。
最近安装的钩⼦放在链的开始,⽽最早安装的钩⼦放在最后,也就是后加⼊的先获得控制权。
Windows 并不要求钩⼦⼦程的卸载顺序⼀定得和安装顺序相反。
每当有⼀个钩⼦被卸载,Windows 便释放其占⽤的内存,并更新整个Hook 链表。
如果程序安装了钩⼦,但是在尚未卸载钩⼦之前就结束了,那么系统会⾃动为它做卸载钩⼦的操作。
钩⼦⼦程是⼀个应⽤程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。
⽤以监视系统或某⼀特定类型的事件,这些事件可以是与某⼀特定线程关联的,也可以是系统中所有线程的事件。
钩⼦⼦程必须按照以下的语法:复制代码代码如下:LRESULT CALLBACKHookProc(int nCode,WPARAM wParam,LPARAM lParam);HookProc是应⽤程序定义的名字。
关于Hook技术以及Windows消息的研究

关于H ook 技术以及Windows 消息的研究向 辉1,沈建国2(1.华东师范大学电子系,上海市200062;2.上海商学院,上海市200235)【摘 要】 Windows 消息在系统及应用程序的运行中起着关键的作用,每一次键盘、鼠标的点击都会有消息的传递,应用程序通过对消息的响应来实现与用户的交互。
钩子(Hook )函数作为Win 2dows 编程中的一种强有力的工具,可以有效地截获Windows 系统内部传递的消息,在消息到达目标窗口的处理函数之前先对消息做出相应处理,从而实现对应用程序的监视与控制。
文中描述了Win 2dows 消息的构成,介绍了Hook 函数的安装、释放及类型,最后介绍了一个Hook 函数实现应用程序操作的捕捉的实例。
关键词:钩子(Hook )函数,Windows 消息,事件,按钮捕捉中图分类号:TP316.6收稿日期:2004209206;修回日期:20042102151 Windows 消息Windows 应用程序通过消息系统实现图形用户接口(GU I )界面。
系统把用户的任何动作都包装在消息中,然后把消息传递给恰当的窗口过程处理,这样就实现了基于事件的驱动。
Windows 操作系统中的消息可以分为系统定义的消息和应用程序定义的消息两大类。
消息是指Windows 发出的一个通知,告诉应用程序某个事情已经发生。
例如,对每一次输入事件、单击控件、按下键盘上的一个键都会使Windows 发送一个消息给应用程序。
应用程序通过响应这些消息来处理用户的动作,实现与用户的交互。
每一个系统定义的消息都有唯一的标志符常量。
在SD K 头文件中,这些常量被定义为32位整数。
标志符常量的字符分为前缀和后缀两部分。
前缀表示处理该信息的窗口的类别,后缀描述了该消息的目的。
例如,WM-PAIN T 的前缀WM 表示负责处理该消息的窗口为一般窗口,后缀PAIN T 表示请求窗口绘制其内容。
表1列出了系统定义消息的部分常用前缀及其含义。
什么是Windows钩子

什么是Windows钩子1. Windows钩子简介在DOS操作系统下编程的时候,如果想截获某种系统功能,可以采取截获中断的办法,比如要获取击键的动作可以截获9号中断,要获取应用程序对文件操作功能的调用可以截获21h号DOS中断,由于DOS是单任务系统,所以这些操作几乎全部是内存驻留程序做的。
DOS下截获中断的方法是这样的简单和随意,不管在驱动程序层次还是在应用程序层次都可以完成,以至于到最后大半的截获操作是由病毒使用的。
在Windows下就不同了,我们已经知道保护模式下的中断描述符表是受系统保护的,在应用程序层次是不可能再通过修改中断向量来截获系统中断了,但这样也对一些应用造成了不便,当做一种变通的措施,Windows提供了钩子来完成类似的功能。
那么,钩子是什么呢?Win32 API手册中是这样描述的:“A hook is a point in the Microsoft Windows message-handling mechanism where an application can install a subroutine to monitor the message traffic in the system and process certain types of messages before they reach the target window procedure.”翻译过来就是:“钩子是Windows的消息处理机制中的一个监视点,应用程序可以在这里安装一个监视子程序,这样就可以在系统中的消息流到达目的窗口过程前监控它们。
”也就是说,钩子可以用来截获系统中的消息流,显然,钩子不是像截获中断一样用来随心所欲地截获系统底层功能的,那么钩子能够用来做什么事情呢?(我仿佛听到了一些阴险的笑声……)不用笑得这么阴险嘛!大家想得没错,如果把钩子用在后台执行的程序中,就能够偷偷检查任何程序中发生的WM_CHAR消息,这样用户输入的任何内容:账号、密码、情书——不管是什么,不管是否显示在屏幕上——都可以被记录下来。
键盘事件的挂钩监控原理及其应用

20 O 8年 8月
宿 州 教 育 学 院 学 报
J m 1 f S zh dU t I t u Ou Ra O u 0U E Ca 1 On nS t te
V 1 1N . o. , o4 1
Au .0 8 g2 0
键盘事件的挂钩监控原理及其应用
—
指出该挂接 函数的类型 、函数的入 口地址 以及 函数是全局性
—
G T S A E 获取消息过滤函数 E ME S G
HA D R 硬件消息过滤 函数 R WA E AO R A R C R 消息记 录过滤 函数 FU N L E O D
的还 是局部性 的。 挂接 函数 的具体调用格式如下 :
( HOOK) 在很 多场合应 用广泛 , 本文就键盘事件 的挂钩 ( HooK) 监
【 关键词 】 函数 挂钩
动态链接
键盘事件 【 文章编 号]09 83 (080 — 13 0 10 — 5420 )4 03—3
【 中图分类号 】P 0 T 33
【 文献标识码 】 A
WI D WS的消息处理机制 为了能在应用程 序 中监控 系 下一个 函数 , NO 可调用 A I P 函数 的 C l et ok x ) 实现 , al xH oE (来 N 如 统 的各种事件 消息 。 提供 了挂 接各种 反调 函数 ( O 的功 果不传递直接返 回即可 。挂接 函数可 以是用来监控所有线程 HO K) 能。这种挂钩函数 ( O K) H O 类似扩充 中断驱动程序 . 挂钩 上可 消息 的全局性 函数 .也可 以是单 独监 控某一线程 的局部性 函
胡 秀建
( 安徽大 学
安徽 ・ 肥 合 200 ) 3 0 0
钩子原理

[转]钩子原理钩子原理Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。
而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。
钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。
这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
可见,利用钩子可以实现许多特殊而有用的功能。
因此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。
钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。
钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。
此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。
在本程序中我们需要捕获在任意窗口上的键盘输入,这就需要采用全局钩子以便拦截整个系统的消息,而全局钩子函数必须以DLL(动态连接库)为载体进行封装,VC6中有三种形式的MFC DLL可供选择,即Regular statically linked to MFC DLL(标准静态链接MFC DLL)、Regular using the shared MFC DLL(标准动态链接MFC DLL)以及Extension MFC DLL(扩展MFC DLL)。
在本程序中为方便起见采用了标准静态连接MFC DLL。
钩子的类型一.按事件分类,有如下的几种常用类型(1)键盘钩子和低级键盘钩子可以监视各种键盘消息。
(2)鼠标钩子和低级鼠标钩子可以监视各种鼠标消息。
(3)外壳钩子可以监视各种Shell事件消息。
比如启动和关闭应用程序。
(4)日志钩子可以记录从系统消息队列中取出的各种事件消息。
(5)窗口过程钩子监视所有从系统消息队列发往目标窗口的消息。
WindowsHook(钩子)函数详解讲述

Windows Hook(钩子)函数详解目录钩子类型 (2)WH_MSGFILTER(MessageProc) (2)WH_JOURNALRECORD(JournalRecordProc) (3)WH_JOURNALPLAYBACK(JournalPlaybackProc) (4)WH_KEYBOARD(KeyboardProc) (6)WH_GETMESSAGE(GetMsgProc) (8)WH_CALLWNDPROC(CallWndProc) (9)WH_CBT(CBTProc) (10)WH_SYSMSGFILTER(SysMsgProc) (13)WH_MOUSE(MouseProc) (14)WH_DEBUG (DebugProc) (15)WH_SHLL(ShellProc) (16)WH_FOREGROUNDIDLE(ForegroundIdleProc) (17)WH_CALLWNDPROCRET(CallWndRetProc) (18)WH_KEYBOARD_LL (LowLevelKeyboardProc) (19)WH_MOUSE_LL (LowLevelMouseProc) (21)WH_SYSMSGFILTER和WH_MSGFILTER (CallMsgFilter) (22)相关函数 (23)SetWindowsHookEx (23)SetWindowsHook (25)UnhookWindowsHookEx (26)DelHookProc: (26)UnhookWindowsHook (26)CallNextHookEx (26)钩子类型WH_MSGFIL TER(MessageProc)函数功能:挂钩处理过程是应用程序或库中定义的回调函数,它与函数SetWindowsHookEx搭配使用.当一个对话框、消息框、菜单条、或滚动条中的输入事件发生,且由此引发的消息尚未被处理之前,系统对此挂钩处理过程进行调用.此函数可以对一个特定应用程序或所有应用程序的对话框、消息框、菜单条、或滚动引发的条消息进行监视.类型HOOKPROC定义了指向此类回调函数的指针. MessageProc 是库中相应回调函数名的位置标志符.函数原形:LRESULT CALLBACK MessageProc(int code,WPARAM wParam,LPARAM lParam);参数:nCode:指示产生此消息的输入事件类型.此参数可以是以下值之一:若nCode的值小于0,则此挂钩处理过程必须将该消息不加处理地传送给函数wParam:为NULL(0).lParam:指向MSG结构的[指针].返回值:若nCode的值小于0,则此挂钩处理过程必须返回CallNextHookEx 的返回值.若nCode的值大于或等于0,并且此挂钩处理过程未对该消息进行处理,则调用函数CallNextHookEx 并返回其返回值是被推荐的.否则,其他安装了WH_MSGFILTER挂钩的应用程序将无法收到此挂钩通知,并可能由此导致错误的行为.若此挂钩处理过程处理了此消息,它应返回一个非0值以避免系统再将此消息传送给挂钩链上的其他挂钩处理过程或目标窗口处理过程.备注:一个应用程序通过调用函数SetWindowsHookEx指定WH_MSGFILTER挂钩类型和相应挂钩处理过程的首地址来安装此挂钩处理过程.若一个应用程序使用了DDEML并实行同步处理,而且要求必须在消息被分派前处理之,则一定要使用WH_MSGFILTER挂钩.速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件:winuser.h,库文件:用户自定义.WH_JOURNALRECORD(JournalRecordProc)函数功能:该函数处理过程是应用程序或库定义的回调函数, 它与函数SetWindowsHookEx搭配使用,此函数纪录系统从系统消息队列中删除的消息,此后,一个应用程序可以通过使用挂钩处理过程JournalPlaybackProc对此消息进行回调.类型HOOKPROC定义了指向此类回调函数的指针, JournalRecordProc是应用程序定义或库定义的相应回调函数名的位置标识符.函数原形:LRESULT CALLBACK JournalRecordProc(int code,WPARAM wParam,LPARAM lParam);参数:Code:若nCode之值小于0,此挂钩处理过程必须将此消息不加处理地传送给函数CallNextHookEx 并返回其返回值.wParam:指定为NULL(0).lParam:指向结构EVENTMSG ,该结构包含将被纪录的消息.返回值:返回值被忽略.备注:一个JournalRecordProc挂钩处理过程必须拷贝但不能修改此消息,在次挂钩处理过程控制交还给系统之后,此消息继续被处理.安装一个JournalRecordProc挂钩处理过程是通过调用函数SetWindowsHookEx指定WH_JOURNALRECORD挂钩类型和相应挂钩处理过程的首地址来安装此挂钩处理过程.过程并非只能存在于动态链接库中,一个应用程序自身也可拥有自己的JournalRecordProc挂钩处理过程.与其余大多数全局挂钩处理过程不同,挂钩处理过程JournalRecordProc和JournalPlaybackProc 总是在设置了该挂钩的线程上下文中被调用.一个安装了JournalRecordProc挂钩处理过程的应用程序该对虚拟键VK_CANCEL进行监视(在大多数键盘上,虚拟键VK_CANCEL被实现为组合键< CTRL+BREAK>),此虚拟键应被应用程序解释为用户希望终止进行日志纪录的信号,而应用程序对此进行响应,结束相应的纪录序列,并删除挂钩处理过程JournalRecordProc,在这里,删除挂钩处理过程是很重要的,此举使得应用程序免于因为在一个挂钩处理过程内部被挂起而将系统锁住.这种作为终止日志纪录信号的角色使得组合键<CTRL+BREAK>本身无法被纪录,而组合键<CTRL+C>并不充当日志纪录信号的角色,所以可以被纪录,这里还有两种组合键是不能被纪录的:即<CTRL+ESC> 和<CTRL+ALT+DEL>,这两组组合键导致系统终止所有的日志活动(纪录或回调),删除所有的日志挂钩,并将消息WM_CANCELJOURNAL寄送给日志应用程序.速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件:winuser.h,库文件:用户定义WH_JOURNALPLAYBACK(JournalPlaybackProc)函数功能:该函数处理过程是应用程序或库定义的回调函数, 它与函数SetWindowsHookEx搭配使用.典型地,一个应用程序通过调用此函数来对先前有JournalRecordProc挂钩处理过程纪录的一系列鼠标和键盘消息进行回放.一旦挂钩函数JournalPlaybackProc挂钩处理过程被安装,则通常的鼠标和键盘输入被禁止.类型HOOKPROC定义了指向此类回调函数的指针, JournalPlaybackProc是应用程序定义或库定义的相应回调函数名的位置标识符.函数原形:LRESULT CALLBACK JournalPlaybackProc(int code, WPARAM wParam, LPARAM lParam);参数:code::若nCode的值小于0,则此挂钩函数必须返回函数CallNextHookEx所返回的值.wParam:指示一个NULL(0)值lParam:指向一个EVENTMSG结构,该结构反映了正被此挂钩处理函数处理的消息,这个参数仅当参数nCode的值是HC_GETNEXT时才有效.返回值:为使系统在处理此消息之前先等待一段时间,返回值必须为一个以时钟计的时间量,该时间量指出了系统的等待时间长短.(此时间量可通过计算当前输入的消息与上一个输入消息的time 成员的差别获得),若希望立即处理此消息,返回值应为0,此返回值仅当挂钩代码为HC_GETNEXT时才被使用,否则,此返回值被忽略.备注:一个JournalPlaybackProc挂钩处理过程应当将输入消息拷贝给lParam参数,此消息必须是在先前使用JournalRecordProc 挂钩处理过程时被纪录过的,在使用JournalRecordProc挂钩处理过程时,不应对此消息进行修改,为了多次获得相同的消息,此挂钩处理过程可以多次以HC_GETNEXT为参数被调用.若nCode的值为HC_GETNEXT而返回值大于0,则系统按返回值指定的毫秒值进入睡眠状态,当系统开始继续执行时,它会以HC_GETNEXT为参数nCode的值再次调用次挂钩处理过程以获得相同的消息,此次调用JournalPlaybackProc的返回值为0,否则,系统又将回到睡眠状态,并以此次调用JournalPlaybackProc返回的毫秒数为睡眠时间,睡眠时间到后再重复上述操作.这就使得系统表现为被挂起.与其余大多数全局挂钩处理过程不同,挂钩处理过程JournalRecordProc和JournalPlaybackProc 总是在设置了该挂钩的线程上下文中被调用.在此挂钩处理过程将控制返回给系统后,此消息继续被处理.若nCode的值为HC_SKIP,则此挂钩处理过程必须准备在它下一次被调用时返回下一个纪录了的事件消息,安装JournalPlaybackProc挂钩处理过程通过调用函数SetWindowsHookEx,指定WH_JOURNALPLAYBACK挂钩类型及相应挂钩处理过程首地址来实现,如果用在日志回调过程中按下<Ctrl+Esc>或<Ctrl+Alt+Del>组合键,系统将终止回调,取消此日志回调过程,并寄送一个WM_CANCELJOURNAL消息给日志应用程序.若此挂钩处理过程返回的消息在WM_KEYFIRST 或WM_KEYLAST的范围内,则以下情形发生.结构EVENTMSG的paramL成员指示按下的虚拟键编码值,结构EVENTMSG的paramH成员指示扫描吗,这种情况下无法指示出重复按键的次数,这个事件仅表示一个按键事件.速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件:winuser.h,库文件:用户定义.WH_KEYBOARD(KeyboardProc)函数功能:该函数是应用程序或库文件定义的回调函数, 它与函数SetWindowsHookEx搭配使用,当应用程序调用函数GetMessage 或PeekMessage 并且当前恰好有一个键盘消息(WM_KEYUP or WM_KEYDOWN) 将要被处理时,系统就调用此挂钩处理过程.类型HOOKPROC定义了指向此类回调函数的指针, KeyboardProc是应用程序定义或库定义的相应回调函数名的位置标识符.函数原形:LRESULT CALLBACK KeyboardProc(int code,LPARAM lParam);参数:code:指定一个代码,该代码被挂钩处理过程用于决定如何处理此消息,此参数可以为以下值之一:并返回其返回值.wParam:按键的虚拟键值消息,例如:VK_F1lParam:指示重复次数,扫描码,扩展标志,上下文代码,此前的键状态标志和变化状态标志,此参数可以返回值:若nCode的值小于0,则此挂钩函数必须返回函数CallNextHookEx所返回的值;若nCode的值大于或等于0,并且此挂钩处理过程并未对此消息进行处理,我们极力推荐对函数CallNextHookEx进行调用,并返回其返回值.否则,其他安装了挂钩WH_KEYBOARD的应用程序将无法收到挂钩通知,从而导致错误的行为.若此挂钩处理过程对此消息进行了处理,它应返回非0值以避免系统将此消息传递给挂钩键上的其他处理过程或目标窗口的处理过程.备注:一个应用程序通过调用函数SetWindowsHookEx指定WH_KEYBOARD挂钩类型和相应挂钩处理过程的首地址来安装此挂钩处理过程.速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件:winuser.h,库文件:用户自定义.WH_GETMESSAGE(GetMsgProc)函数功能:该函数处理过程是应用程序或库定义的回调函数, 它与函数SetWindowsHookEx搭配使用,每当函数GetMessage从应用程序的消息队列中获得了一个消息时,系统就调用此函数,在将此获得的消息传送给相应窗口处理过程之前,系统将此消息传送给该挂钩处理过程.类型HOOKPROC定义了指向此类回调函数的指针, GetMsgProc是应用程序定义或库定义的相应回调函数名的位置标识符.函数原形:LRESULT CALLBACK GetMsgProc(int code,WPARAM wParam,LPARAM lParam );参数:Code:指示挂钩处理过程是否必须处理此消息.若nCode的值是HC_ACTION,则挂钩处理过程必须处理此消息,若nCode之值小于0,此挂钩处理过程必须将此消息不加处理地传送给函数CallNextHookEx并返回其返回值.wParam:指示此消息是否已从消息队列中被删除,此参数可以是以下值之一:lParam:指向结构MSG,该结构包含了关于此消息的详细消息返回值:若nCode的值小于0,则此挂钩函数必须返回函数CallNextHookEx所返回的值;若nCode的值大于或等于0,我们极力推荐对函数CallNextHookEx进行调用,并返回其返回值.否则,其他安装了挂钩WM_GETMESSAGE的应用程序将无法收到挂钩通知,从而导致错误的行为.若此挂钩处理过程没有调用函数CallNextHookEx,则返回值为0.备注:挂钩处理过程GetMsgProc可以检查和修改此消息,在此挂钩处理过程将控制返回给系统之后,函数GetMessage将此修改后的消息返回给最初调用他的应用程序,应用程序通过调用函数SetWindowsHookEx指定WH_GETMESSAGE挂钩类型和相应挂钩处理过程的首地址来安装此挂钩处理过程.速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件:winuser.h,库文件:用户定义.WH_CALLWNDPROC(CallWndProc)函数功能:该函数挂钩处理过程是由应用程序定义或由库定义的回调函数,它与函数SetWindowsHookEx配套使用,系统调用此函数无论何时一旦函数SendMessage被调用,在将消息发送至相应的窗口处理过程之前,系统先将该消息发送至挂钩处理过程,该挂钩处理过程可以对改消息进行检查,但不能修改之.类型HOOKPROC定义了指向此类回调函数的指针,CallWndProc是应用程序定义或库定义的函数名的位置标志位.函数原形:LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam );参数:nCode:指定该挂钩处理过程是否必须对该消息进行处理,若nCode 是HC_ACTION,则该挂钩处理过程必须处理该消息.若nCode的值小于0,则此挂钩处理过程必须在未对该消息作进一步处理的情况下,将其发送给函数CallNextHookEx并返回由CallNextHookEx返回的值.wParam:指示该消息是否由当前线程发出,若该消息由当前线程发出,其值为非0值,否则,其值为0. lParam:指向一个CWPSTRUCT结构,该结构包含了此消息的详细消息.返回值:若nCode的值小于0,则此挂钩函数必须返回函数CallNextHookEx所返回的值;若nCode的值大于或等于0,我们极力推荐对函数CallNextHookEx进行调用,并返回其返回值.否则,其他安装了WM_CALLWNDPROC挂钩的应用程序将无法收到挂钩通知,从而导致错误的行为.若此挂钩没有调用函数CallNextHookEx,则返回值为0.备注:挂钩处理函数CallWndPro可以对消息进行检查,但不能修改之.在该挂钩处理过程将控制返回给系统之后,该消息被发送至相应的窗口过程.一个应用程序通过调用SetWindowsHookEx时指定WM_CALLWNDPROC挂钩类型及其相应挂钩处理过程的首地址来安装挂钩处理过程.挂钩WM_CALLWNDPROC是在调用函数SendMessage的线程中被调用的,它并非在接受消息的线程中被调用.速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件:winuser.h,库文件:用户定义.WH_CBT(CBTProc)函数功能:该函数挂钩处理过程是在应用程序或库中定义的回调函数,它与函数SetWindowsHookEx配套使用,系统在缉获、创建、销毁、最小化、最大化、移动或改变一个窗口尺寸之前调用它;在结束一个系统命令之前调用它;在将一个鼠标或键盘事件从系统事件队列中删除之前调用它;在设置键盘焦点之前调用它,或在与系统消息队列进行同步之前调用它,一个基于计算机培训(CBT)的应用程序使用此挂钩处理过程来从系统接收有用的通知.类型HOOKPROC定义了指向此类回调函数的指针,CBTProc是应用程序定义或库定义的相应回调函数名的位置标识符.函数原形:LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam);参数:nCode:指定一个代码,该代码被此挂钩处理过程用来决定如何处理此消息,该参数可以是下值中的一个:若nCode的值小于0,此挂钩处理过程必须不加处理地将此消息发送给函数CallNextHookEx,并返回函数CallNextHookEx的返回值.wParam:取决于参数nCode的值,详细信息参见以下的说明部分.lParam:取决于参数nCode的值,详细信息参见以下的说明部分.返回值:此挂钩处理过程的返回值决定了系统允许或禁止以下操作之一,对于与以下挂钩代码相应的操作,返回值为0则允许这样的操作,返回值为1则禁止.●HCBT_ACTIVATE●HCBT_CREATEWNDHCBT_DESTROYWND●HCBT_MINMAX●HCBT_MOVESIZEHCBT_SETFOCUS●HCBT_SYSCOMMAND对于与以下CBT挂钩代码相对应的操作,返回值被忽略.●HCBT_CLICKSKIPPED●HCBT_KEYSKIPPED●HCBT_QS备注:除以下挂钩代码之外,不应当安装WH_JOURNALPLAYBACK挂钩处理过程.此挂钩处理过程必须放在某个动态链接库中,一个应用程序通过调用函数SetWindowsHookEx指定WH_CBT 挂钩类型与相应挂钩处理过程首地址来安装挂钩处理过程.以下列示了参数wParam和lParam与每一种HCBT挂钩代码的关系.HCBT_ACTIVATEwParam:指定被激活窗口句柄。
【转】用键盘钩子编写windows记录木马-网络管理与网络安全-如鹏网计算机行...

【转】用键盘钩子编写windows记录木马-网络管理与网络安全-如鹏网计算机行...用键盘钩子编写windows记录木马一、引言我们可以在应用程序中毫不费力的捕获在本程序窗口上所进行的键盘操作,但如果我们想要将此程序作成一个监控程序,捕获在Windows平台下任意窗口上的键盘操作,就需要借助于全局钩子来实现了。
二、系统钩子和DLL钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。
钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。
此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。
在本程序中我们需要捕获在任意窗口上的键盘输入,这就需要采用全局钩子以便拦截整个系统的消息,而全局钩子函数必须以DLL (动态连接库)为载体进行封装,VC6中有三种形式的 MFC DLL可供选择,即Regular statically linked to MFC DLL(标准静态链接MFC DLL)、Regular using the shared MFC DLL(标准动态链接MFC DLL)以及Extension MFC DLL(扩展MFC DLL)。
在本程序中为方便起见采用了标准静态连接MFC DLL。
三、键盘钩子程序示例本示例程序用到全局钩子函数,程序分两部分:可执行程序KeyHook和动态连接库LaunchDLL。
1、首先编制MFC扩展动态连接库LaunchDLL.dll:(1)选择MFC AppWizard(DLL)创建项目LaunchDLL;在接下来的选项中选择Regular statically linked to MFC DLL(标准静态链接MFC DLL)。
(2)在LaunchDLL.h中添加宏定义和待导出函数的声明:#define DllExport __declspec(dllexport)……DllExport void WINAPI InstallLaunchEv();……class CLaunchDLLApp : public CWinApp{public:CLaunchDLLApp();//{{AFX_VIRTUAL(CLaunchDLLApp)//}}AFX_VIRTUAL//{{AFX_MSG(CLaunchDLLApp)// NOTE - the ClassWizard will add and remove member functions here.// DO NOT EDIT what you see in these blocks of generated code !//}}AFX_MSGDECLARE_MESSAGE_MAP()};(3)在LaunchDLL.cpp中添加全局变量Hook和全局函数LauncherHook、SaveLog:HHOOK Hook;LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam);void SaveLog(char* c);(4)完成以上提到的这几个函数的实现部分:……CLaunchDLLApp theApp;……DllExport void WINAPI InstallLaunchEv(){Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)LauncherHook,theApp.m_hInstance,0);}在此我们实现了Windows的系统钩子的安装,首先要调用SDK 中的API函数SetWindowsHookEx来安装这个钩子函数,其原型是:HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId);其中,第一个参数指定钩子的类型,常用的有WH_MOUSE、WH_KEYBOARD、WH_GETMESSAGE等,在此我们只关心键盘操作所以设定为WH_KEYBOARD;第二个参数标识钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数,即当不管系统的哪个窗口有键盘输入马上会引起LauncherHook的动作;第三个参数是钩子函数所在模块的句柄,我们可以很简单的设定其为本应用程序的实例句柄;最后一个参数是钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息,在本程序中钩子需要为全局钩子,故设定为0。
11.2 Windows钩子

2018/11/3
10
11.2.2.2钩子回调函数
对于键盘钩子来说,参数定义如下所示: dwCode:键盘消息的处理方式。如果是 HC_ACTION,表示收到一个正常的击键消息; 如果是HC_NOREMOVE,表示对应消息并没有 从消息队列中移去(当某个进程用指定 PM_NOREMOVE标志的PeekMessage函数获取 消息是就是如此)。 wParam:按键的虚拟码(即Windows.inc中定 义的VK_xxx值)。
2018/11/3 6
11.2.2.1钩子程序的结构
需要共享的变量被放在.DATA?段中,如钩子句 柄和钩住的按键内容等,仅dll程序的实例句柄不 需要共享,不需要共享的变量放在.DATA段中。 程序中只写了3个函数,HookProc是钩子回调函 数,InstallHook和UninstallHook函数是供主程 序使用的钩子安装函数和卸载函数。由于这3个函 数是需要导出的,所以HookDll.def文件中包括了 它们的名称。
11.2 Windows钩子
11.2.1 什么是Windows钩子 11.2.1.1 Windows钩子简介
钩子的定义在Win32 API手册中是这样描述的: 钩子是Windows的消息处理机制中的一个监视点,应用程 序可以在这里安装一个监视子程序,这样就可以在系统中的 消息流到达目的窗口过程前监控它们。
2018/11/3
13
11.2.2.2钩子回调函数
lpKeyState指向一个256字节的缓冲区,其中存放键盘中 所有按键的当前状态,一个字节表示一个按键,数值为1 表示按下,为0表示释放,数据在缓冲区中排列位置按照 VK_xx虚拟码顺序排列。使用GetKeyboardState函数就 可以让系统根据当前的键盘状态填写这个缓冲区。 lpBuffer参数指向一个缓冲区,用来接收转换后的ASCII 码,最后uFlags参数表示当前是否有一个菜单在激活状 态,0表示没有,1表示有菜单正在激活。 函数的返回值表示转换后返回在lpBuffer缓冲区中的字符 数量,它可能是0、1或是2。
钩子 工作原理

钩子工作原理
钩子是一种操作系统提供的机制,用于拦截和修改应用程序的行为。
它可以捕捉各种事件,例如键盘和鼠标输入、窗口消息、系统消息等,然后在事件处理之前进行处理。
钩子分为全局钩子和局部钩子两种类型。
全局钩子可以拦截所有应用程序的事件,而局部钩子只能拦截当前进程的事件。
钩子的工作原理是通过在系统内部设置回调函数来实现的。
当事件发生时,操作系统会调用相应的钩子回调函数。
该函数可以修改事件的参数或阻止事件传递给应用程序。
钩子可以用于多种用途,例如实现键盘记录器、窗口消息过滤器、鼠标手势识别等。
但是,由于钩子可以访问和修改应用程序的内存,因此它也可以被恶意软件用于窃取用户信息或执行恶意代码。
因此,在使用钩子时应格外小心,确保其安全性和可靠性。
- 1 -。
键盘勾子

if( ((DWORD)lParam&0x40000000) && (HC_ACTION==nCode) ) //有键按下
{
if( (wParam==VK_SPACE)||(wParam==VK_RETURN)||(wParam>=0x2f ) &&(wParam<=0x100) )
};
(4)在KeyboardHook.cpp文件的顶部加入#include "KeyboardHook.h"语句;
(5)在KeyboardHook.cpp文件的顶部加入全局共享数据变量:
#pragma data_seg("mydata")
HHOOK glhHook=NULL; //安装的鼠标勾子句柄
实现适时监视键盘,并将按键信息保存在TXT文件中的程序
Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可以截获键盘消息,外壳钩子可以截取、启动和关闭应用程序的消息等。本文在VC6编程环境下实现了一个简单的键盘钩子程序,并对Win32全局钩子的运行机制、Win32 DLL的特点、VC6环境下的MFC DLL以及共享数据等相关知识进行了简单的阐述。
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved);
其中,第一个参数表示DLL的实例句柄;第三个参数系统保留;这里主要介绍一下第二个参数,它有四个可能的值:DLL_PROCESS_ATTACH(进程载入),DLL_THREAD_ATTACH(线程载入),DLL_THREAD_DETACH(线程卸载),DLL_PROCESS_DETACH(进程卸载),在DLLMain函数中可以对传递进来的这个参数的值进行判别,并根据不同的参数值对DLL进行必要的初始化或清理工作。举个例子来说,当有一个进程载入一个DLL时,系统分派给DLL的第二个参数为DLL_PROCESS_ATTACH,这时,你可以根据这个参数初始化特定的数据。另一方面,在Win16环境下,所有应用程序都在同一地址空间;而在Win32环境下,所有应用程序都有自己的私有空间,每个进程的空间都是相互独立的,这减少了应用程序间的相互影响,但同时也增加了编程的难度。大家知道,在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的;而在Win32环境中,情况却发生了变化,当进程在载入DLL时,系统自动把DLL地址映射到该进程的私有空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间,也就是说每个进程所拥有的相同的DLL的全局数据其值却并不一定是相同的。因此,在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。亦即把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。
Hook(钩子技术)基本知识讲解,原理

Hook(钩⼦技术)基本知识讲解,原理⼀、什么是HOOK(钩⼦) APIWindows消息传递机制,当在应⽤程序进⾏相关操作,例如点击⿏标、按下键盘,操作窗⼝等,操作系统能够感知这⼀事件,接着把此消息放到系统消息队列,然后到应⽤程序的消息序列中,应⽤程序通过Getmessage函数取出消息,然后调⽤DispatchMessage函数将这条消息调度给操作系统,操作系统会调⽤在设计窗⼝类时指定的应⽤程序窗⼝对这⼀消息进⾏处理,处理过程如图所⽰:在《VC深⼊详解》⼀书将钩⼦过程⽐喻为警察为了抓逃犯⽽设置的检查站,基本原理也确实与此类似。
就是在应⽤程序将信息传递给操作系统时(图中③的),对消息进⾏捕获和过滤,从⽽阻⽌消息发送到指定的窗⼝过程,最终完成对某些消息的屏蔽功能。
HOOK(钩⼦,挂钩)是⼀种实现Windows平台下类似于中断的机制。
HOOK机制允许应⽤程序拦截并处理Windows消息或指定事件,当指定的消息发出后,HOOK程序就可以在消息到达⽬标窗⼝之前将其捕获,从⽽得到对消息的控制权,进⽽可以对该消息进⾏处理或修改,加⼊我们所需的功能。
钩⼦按使⽤范围分,可分为线程钩⼦和系统钩⼦,其中,系统钩⼦具有相当⼤的功能,⼏乎可以实现对所有Windows消息的拦截、处理和监控。
这项技术涉及到两个重要的API,⼀个是SetWindowsHookEx,安装钩⼦;另⼀个是UnHookWindowsHookEx,卸载钩⼦。
对于Windows系统,它是建⽴在事件驱动机制上的,说⽩了就是整个系统都是通过消息传递实现的。
hook(钩⼦)是⼀种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往⽬标窗⼝的消息并进⾏处理。
所以说,我们可以在系统中⾃定义钩⼦,⽤来监视系统中特定事件的发⽣,完成特定功能,如屏幕取词,监视⽇志,截获键盘、⿏标输⼊等等。
程序员在讨论时也常说“可以先钩住再处理”,即执⾏某操作之前,优先处理⼀下,再决定后⾯的执⾏⾛向。
键盘事件的挂钩监控原理及其应用

键盘事件的挂钩监控原理及其应用intWINAPIInstallFilter(BOOLnCode){if(InitCalled==0)return(—1);if(nCode==TRUE){hKeyHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)lpfnKeyHook,hInstance,0);HookStates=TRUE;}else{UnhookWindowsHookEx(hKeyHook);HookStates=FALSE;}return(0);}LRESULTCALLBACKKeyHook(intnCode,WORDwParam,DWORDlParam)staticBOOLmsflag=FALSE;if(nCode=0){if(HookStates==TRUE){if((wParam==0xff)||/WIN3.X下按键值(wParam==0x5b)||(wParam==0x5c)){/WIN95下按键值if((i==0x15b)||(i==0x15c)){/按键按下处理msflag=TRUE;PostMessage(hWndMain,0x7fff,0x1,0x3L);}elseif((i==0xc15b)||(i==0xc15c)){/按键抬起处理msflag=FALSE;PostMessage(hWndMain,0x7fff,0x2,0x3L);}}}return((int)CallNextHookEx(hKeyHook,nCode,wParam,lParam));}该程序的重要功能是监控键盘按键消息,将两个特殊按键Micro 按下和抬起消息转换成自定义类型的消息,并将自定义消息发送给应用程序主窗口函数。
2、在应用程序主函数中建立窗口后,调用InitHooksDll()函数来初始化动态链接库,并将应用程序主窗口句柄传递给链接库,然后调用InstallFilter()函数挂接键盘事件监控回调函数。
键盘事件的挂钩监控原理及其应用

键盘事件的挂钩监控原理及其应用【摘要】本文将讨论键盘事件的挂钩监控原理及其应用。
在将介绍键盘事件的重要性和挂钩监控的定义。
在将详细阐述挂钩监控的原理、键盘事件的挂钩监控实现方式、应用场景、优势和安全性问题。
在将重点强调键盘事件的挂钩监控的重要性、未来发展趋势,并进行总结。
通过本文的讨论,读者将了解到键盘事件的挂钩监控在信息安全领域的重要性,并可以深入探讨其未来的发展方向。
【关键词】关键词:键盘事件、挂钩监控、原理、实现方式、应用场景、优势、安全性问题、重要性、发展趋势、结论。
1. 引言1.1 键盘事件的重要性键盘事件在计算机系统中起着至关重要的作用,它是用户与计算机之间进行交互的主要方式之一。
通过键盘事件,用户可以输入文字信息、执行各种操作命令,实现与计算机系统的有效沟通和互动。
键盘事件的重要性体现在它可以满足用户对计算机系统的各种需求,提高用户的使用体验和工作效率。
在计算机系统中,键盘事件的产生和处理是实现各种功能和操作的基础。
无论是在办公、游戏、编程还是其他应用场景下,键盘事件都扮演着不可或缺的角色。
用户通过键盘输入指令、操作数据,触发系统的相应反应,实现对计算机系统的控制和操作。
保障键盘事件的准确性、高效性和安全性对于计算机系统的正常运行和用户体验至关重要。
在实际应用中,通过对键盘事件进行挂钩监控,可以实现对用户输入的实时监测和记录,确保输入的准确性和安全性。
挂钩监控技术可以帮助检测和拦截恶意输入、键盘记录器等安全威胁,有效防范信息泄露和攻击风险。
对键盘事件的重要性要求我们充分重视挂钩监控技术的应用和发展,保障计算机系统和用户数据的安全。
1.2 挂钩监控的定义挂钩监控是指通过在计算机系统中设置钩子程序来拦截和监视特定的事件或操作。
在键盘事件中,挂钩监控可以用来截获和记录用户按键的操作,从而实现对键盘输入的监控和控制。
通过挂钩监控键盘事件,可以实现对用户输入的实时监控和记录,以及对键盘操作的分析和统计。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(wParam==0x1) MicroFlag=TRUE; else if(wParam==0x2) MicroFlag=FALSE; } break; 4、在进行按键组合处理时,首先判断Micro键是否按下,然后再进行 其它按键的判 断处理。 case WM_KEYDOWN: // 按键按下处理 if(MicroFlag==TRUE) { //Micro键按下 if((BYTE)HIBYTE(wParam)==0x5b) { //Micro+"["组合键 ......//按键功能处理 } else if((BYTE)HIBYTE(wParam)==0x5d) { //Micro+"]"组合键 ......//按键功能处理 } } break; 5、当应用程序退出时应注意下载键盘监控函数,即调用 InstallFilter(FALSE)函 数一次。 6、利用本文提供的方法设置自己的应用程序功能按键,在保证程序功 能按键不会 与其它系统发生冲突的同时,有效地利用了系统中现有资 源,而且在实现应用程序 功能的同时灵活应用了系统中提供的各种功 能调用。
{ static BOOL msflag=FALSE; if(nCode>=0) { if(HookStates==TRUE) { if((wParam==0xff)|| //WIN3.X下按键值 (wParam==0x5b)||(wParam==0x5c)){//WIN95下按键值 if((i==0x15b)||(i==0x15c)){ //按键按下处理 msflag=TRUE; PostMessage(hWndMain,0x7fff,0x1,0x3L); } else if((i==0xc15b)||(i==0xc15c)){//按键抬起处理 msflag=FALSE; PostMessage(hWndMain,0x7fff,0x2,0x3L); } } } } return((int)CallNextHookEx (hKeyHook,nCode,wParam,lParam)); } 该程序的主要功能是监控键盘按键消息,将两个特殊按键Micro按下和 抬起消息转换 成自定义类型的消息,并将自定义消息发送给应用程序 主窗口函数。 2、在应用程序主函数中建立窗口后,调用InitHooksDll()函数来初始化 动态链接 库,并将应用程序主窗口句柄传递给链接库,然后调用 InstallFilter()函数挂接键 盘事件监控回调函数。 InitHooksDll(hIMEWnd); //初始化DLL InstallFilter(TRUE); //安装键盘回调函数 3、在应用程序主窗口函数处理自定义消息时,保存Micro按键的状 态,供组合按键 处理时判断使用。 switch (iMessage) { case 0x7fff: //自定义消息类型 if(lParam==0x3L) {//设置Micro键的状态
FARPROC lpfnKeyHook=(FARPROC)KeyHook; BOOL HookStates=FALSE; int FAR PASCAL LibMain( HANDLE hModule, UINT wDataSeg, UINT cbHeapSize, LPSTR lpszCmdLine) { if (cbHeapSize!=0) UnlockData(0); hInstance = hModule; return 1; } int WINAPI WEP (int bSystemExit) { return 1;} int WINAPI InitHooksDll(HWND hwndMainWindow) { hWndMain = hwndMainWindow; InitCalled = 1; return (0); } int WINAPI InstallFilter(BOOL nCode) { if (InitCalled==0) return (-1); if (nCode==TRUE) { hKeyHook=SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)lpfnKeyHook,hInstance,0); HookStates=TRUE; } else { UnhookWindowsHookEx(hKeyHook); HookStates=FALSE; } return(0); } LRESULT CALLBACK KeyHook(int nCode,WORD wParam,DWORD lParam)
件中利用EXPORTS命 令进行说明;nCode决定挂接函数是否对当前消 息进行处理;wParam和lParam为具体 的消息内容。 二、键盘事件挂接函数的安装与下载 在程序中可以利用函数 SetWindowsHookEx()来挂接过滤函数,在挂接函数时必须指 出该挂接 函数的类型、函数的入口地址以及函数是全局性的还是局部性的,挂接 函 数的具体调用格式如下: SetWindowsHookEx(iType,iProc,hInst,iCode) 其中iType为挂接函数类 型,键盘类型为WH_KEYBOARD,iProc为挂接函数地址,hInst 为挂接 函数链接库实例句柄,iCode为监控代码-0表示全局性函数。 如果挂接 函数需要将消息传递给下一个过滤函数,则在该挂接函数返回前还需要 调 用一次CallNextHookEx()函数,当需要下载挂接函数时,只要调用一 次 UnhookWindowsHookEx(iProc)函数即可实现。 如果函数是全局性 的,那么它必须放在一个.DLL动态链接库中,这时该函数调用方 法可 以和其它普通.DLL函数一样有三种: 1.在DEF定 义文件中直接用函数名或序号说明: EXPORTS WEP @1 RESIDENTNAME InitHooksDll @2 InstallFilter @3 KeyboardProc @4 用 序号说明格式为:链接库名.函数名(如本例中说明方法为 KEYDLL.KeyboardProc)。 2.在应用程序中利用函数直接调用: 首先在应用程序中利用 LoadLibrary(LPSTR "链接库名")将动态链接库装入,并取得 装载库模块 句柄hInst,然后直接利用GetProcAddress(HINSTANCE hInst,LPSTR "函 数过程名")获取函数地址,然后直接调用该地址即可,程序结束前利用 函数 FreeLibrary( )释放装入的动态链接库即可。 3.利用输入库.LIB方法 利用IMPLIB.EXE程序在建立动态链接库的同时 建立相应的输入库.LIB,然后直接在 项目文件中增加该输入库。 三、WINDOWS挂钩监控函数的实现步骤 WINDOWS挂钩函数只有放在 动态链接库DLL中才能实现所有事件的监控功能。在.DLL 中形成挂钩 监控函数基本方法及其基本结构如下: 1、首先声明DLL中的变量和过程; 2、然后编制DLL主模块LibMain(),建立模块实例; 3、建立系统退出DLL机制WEP()函数; 4、完成DLL初始化函数InitHooksDll(),传递主窗口程序句柄;
5、编制挂钩安装和下载函数InstallFilter(); 6、编制挂钩函数KeyboardProc(),在其中设置监控功能,并确定继续 调下一个钩 子函数还是直接返回WINDOWS应用程序。 7、在WINDOWS主程序中需要初始化DLL并安装相应挂钩函数,由挂 接的钩子函数负 责与主程序通信; 8、在不需要监控时由下载功能卸掉挂接函数。 四、 WINDOWS下键盘挂钩监控函数的应用技术 目前标准的104 键盘上 都有两个特殊的按键,其上分别用WINDOW程序徽标和鼠标下 拉列表 标识,本文暂且分别称为Micro左键和Micro右键,前者用来模拟鼠标左 键激 活开始菜单,后者用来模拟鼠标右键激活属性菜单。这两个特殊 按键只有在按下后 立即抬起即完成 CLICK过程才能实现其功能,并且 没有和其它按键进行组合使用。 由于WINDOWS 系统中将按键划分得 更加详细,使应用程序中很难灵活定义自己的专 用快捷键,比如在开 发.IME等应用程序时很难找到不与WORD8.0等其它应用程序冲突 的功 能按键。如果将标准104键盘中的这两个特殊按键作为模拟CTRL和ALT 等专用按 键,使其和其它按键组合,就可以在自己的应用程序中自由 地设置专用功能键,为 应用程序实现各种功能快捷键提供灵活性。正 常情况下WINDOWS 键盘事件驱动程序 并不将这两个按键的消息进行 正常解释,这就必须利用键盘事件的挂钩监控函数来 实现其特定的功 能。其方法如下: 1、首先编制如下一个简单动态链接库程序,并编译成DLL文件。 #include "windows.h" int FAR PASCAL LibMain(HANDLE hModule,UINT wDataSeg, UINT cbHeapSize,LPSTR lpszCmdLine); int WINAPI WEP(int bSystemExit); int WINAPI InitHooksDll(HWND hwndMainWindow); int WINAPI InstallFilter(BOOL nCode); LRESULT CALLBACK KeyHook(int nCode,WORD wParam,DWORD lParam); static HANDLE hInstance; // 全局句柄 static HWND hWndMain; // 主窗口句柄 static int InitCalled=0; // 初始化标志 static HHOOK hKeyHook;