键盘事件的挂钩监控原理及其应用

键盘事件的挂钩监控原理及其应用键盘事件的挂钩监控原理及其应用键盘事件的挂钩监控原理及其应用2019-10-03计算机信息技术键盘事件的挂钩监控原理及其应用WINDOWS的消息处理机制为了能在应用程序中监控系统的各种事件消息,提供了挂接各种反调函数(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()来实现,如果不传递直接返回即可。

挂接函数可以是用来监控所有线程消息的全局性函数,也可以是单独监控某一线程的局部性函数。

如果挂接函数是局部函数,可以将它放到一个.DLL动态链接库中,也可以放在一个局部模块中;如果挂接函数是全局的,那么必须将其放在一个.DLL 动态链接库中。

挂接函数必须严格按照下述格式进行声明,以键盘挂钩函数为例:int FAR PASCAL KeyboardProc( int nCode,WORD wParam,DWORD lParam) 其中KeyboardProc为定义挂接函数名,该函数必须在模块定义文件中利用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;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{UnhookWindow sHookEx(hKeyHook);HookStates=FALSE;}return(0);}LRESULT CALLBACK KeyHook(int nCode,WORD wParam,DWORD lParam){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);}elseif((i==0xc15b)||(i==0xc15c)){//按键抬起处理msflag=FALSE;PostMessage(hWndMain,0x7fff,0x2,0x3L);}}}}return((int)Ca llNextHookEx(hKeyHook,nCode,wParam,lParam));}该程序的主要功能是监控键盘按键消息,将两个特殊按键Micro按下和抬起消息转换成自定义类型的消息,并将自定义消息发送给应用程序主窗口函数。

2、在应用程序主函数中建立窗口后,调用InitHooksDll()函数来初始化动态链接库,并将应用程序主窗口句柄传递给链接库,然后调用InstallFilter()函数挂接键盘事件监控回调函数。

InitHooksDll(hIMEWnd); //初始化DLLInstallFilter(TRUE); //安装键盘回调函数3、在应用程序主窗口函数处理自定义消息时,保存Micro按键的状态,供组合按键处理时判断使用。

合集下载

电子钢琴键盘动态监测技术研究

电子钢琴键盘动态监测技术研究

电子钢琴键盘动态监测技术研究电子钢琴自问世以来,享有非常广泛的用户群体。

与传统钢琴相比,电子钢琴的优点在于便携、调音方便、操作简单等等。

然而,随着时间的流逝,电子钢琴键盘出现故障的情况也越来越普遍。

特别是在学生练习过程中,键盘频繁地被按下、敲打,容易出现磨损和损坏。

为了及时发现并维修键盘故障,使用动态监测技术对电子钢琴键盘进行追踪、监控和分析是非常必要的。

本文将探讨钢琴键盘动态监测技术的研究。

一、动态监测技术的引入传统的维护方法是周期检查和维修,即定期对键盘进行检查、清洁和维修。

然而,这种方法无法及时发现键盘问题。

因此,引入动态监测技术对键盘故障进行追踪和监控是必要的。

动态监测技术通过分析键盘在学习和演奏过程中的使用状态,判断键盘的状态和损坏程度,从而实时发现和维护键盘故障。

二、监测技术的实现动态监测技术可以通过传感器网络和嵌入式系统来实现。

传感器网络可以将各种传感器(例如声音传感器、图像传感器、加速度传感器等)分布在键盘上,监测键盘的状态,并将数据传输到嵌入式系统中进行分析处理。

嵌入式系统处理数据后可以将结果反馈给用户,提醒用户及时修复键盘问题。

这种技术可以高效地监测键盘态,决定更及时和准确地对键盘进行维修,以避免键盘故障对用户练琴的影响。

三、监测数据的分析监测数据的分析是动态监测技术的重要环节。

传感器网络采集的数据包括键盘的使用频率、使用时间、使用强度、使用位置等等。

这些数据可以分析出键盘故障的原因和程度。

例如,如果一连串的测量数据都表明某一键盘键的持续按下时间明显缩短,说明该键已经磨损了。

有时候,键盘表面被人为地刮伤或物品所破坏,也会导致键盘故障。

此时,通过与人工排除潜在的人为损坏,再结合实测数据得出结论,就可以及时修复键盘问题。

四、未来的研究方向未来,钢琴键盘动态监测技术的发展方向在于提高监测精度。

为了保证监测精度,可以在键盘中引入更多传感器。

目前的键盘技术通常使用了10-15个传感器,但是未来可以增加到20个以上,以提高键盘状态数据采集的准确性和完整性。

keylogger原理

keylogger原理

keylogger原理Keylogger, also known as a keyboard logger or system monitor, is a type of surveillance software that records every keystroke made on a computer. Its primary purpose is to capture sensitive information such as passwords, usernames, and other personal data entered by users. The keylogger operates by intercepting and logging keystrokes at the hardware or software level, depending on its implementation.键盘记录器,也称为键盘记录器或系统监视器,是一种监控软件,用于记录计算机上的每个击键。

其主要目的是捕获用户输入的敏感信息,如密码、用户名和其他个人数据。

键盘记录器通过在硬件或软件层面拦截并记录击键来实现其功能,具体取决于其实现方式。

At the hardware level, a keylogger may be physically installed inside a computer's keyboard or connected externally through a USB device. These devices capture the keystrokes directly from the keyboard's circuitry, making them undetectable by standard antivirus software. However, they require physical access to the target computer for installation, which can be challenging in certain scenarios.在硬件层面,键盘记录器可能被物理安装在计算机的键盘内部或通过USB 设备外部连接。

键盘事件的挂钩监控原理及其应用

键盘事件的挂钩监控原理及其应用

键盘事件的挂钩监控原理及其应用【摘要】本文将讨论键盘事件的挂钩监控原理及其应用。

在将介绍键盘事件的重要性和挂钩监控的定义。

在将详细阐述挂钩监控的原理、键盘事件的挂钩监控实现方式、应用场景、优势和安全性问题。

在将重点强调键盘事件的挂钩监控的重要性、未来发展趋势,并进行总结。

通过本文的讨论,读者将了解到键盘事件的挂钩监控在信息安全领域的重要性,并可以深入探讨其未来的发展方向。

【关键词】关键词:键盘事件、挂钩监控、原理、实现方式、应用场景、优势、安全性问题、重要性、发展趋势、结论。

1. 引言1.1 键盘事件的重要性键盘事件在计算机系统中起着至关重要的作用,它是用户与计算机之间进行交互的主要方式之一。

通过键盘事件,用户可以输入文字信息、执行各种操作命令,实现与计算机系统的有效沟通和互动。

键盘事件的重要性体现在它可以满足用户对计算机系统的各种需求,提高用户的使用体验和工作效率。

在计算机系统中,键盘事件的产生和处理是实现各种功能和操作的基础。

无论是在办公、游戏、编程还是其他应用场景下,键盘事件都扮演着不可或缺的角色。

用户通过键盘输入指令、操作数据,触发系统的相应反应,实现对计算机系统的控制和操作。

保障键盘事件的准确性、高效性和安全性对于计算机系统的正常运行和用户体验至关重要。

在实际应用中,通过对键盘事件进行挂钩监控,可以实现对用户输入的实时监测和记录,确保输入的准确性和安全性。

挂钩监控技术可以帮助检测和拦截恶意输入、键盘记录器等安全威胁,有效防范信息泄露和攻击风险。

对键盘事件的重要性要求我们充分重视挂钩监控技术的应用和发展,保障计算机系统和用户数据的安全。

1.2 挂钩监控的定义挂钩监控是指通过在计算机系统中设置钩子程序来拦截和监视特定的事件或操作。

在键盘事件中,挂钩监控可以用来截获和记录用户按键的操作,从而实现对键盘输入的监控和控制。

通过挂钩监控键盘事件,可以实现对用户输入的实时监控和记录,以及对键盘操作的分析和统计。

Python中使用PyHook监听鼠标和键盘事件实例

Python中使用PyHook监听鼠标和键盘事件实例

Python中使用PyHook监听鼠标和键盘事件实例PyHook是一个基于Python的“钩子”库,主要用于监听当前电脑上鼠标和键盘的事件。

这个库依赖于另一个Python库PyWin32,如同名字所显示的,PyWin32只能运行在Windows平台,所以PyHook也只能运行在Windows平台。

关于PyHook的使用,在它的官方主页上就有一个简单的教程,大体上来说,可以这样使用?123456789101112131415161718192021222324252627282930 313233343536373839404142434445464748495051525354555 6# -*- coding: utf-8 -*- # 3import pythoncom 4import pyHook 5def onMouseEvent(event): # 监听鼠标事件print "MessageName:",event.MessageNameprint "Message:", event.Message print "Time:",event.Time print "Window:", event.Window print "WindowName:", event.WindowName print "Position:", event.Position print "Wheel:", event.Wheel print "Injected:", event.Injected print"---" # 返回True 以便将事件传给其它处理程序# 注意,这儿如果返回False ,则鼠标事件将被全部拦截# 也就是说你的鼠标看起来会僵在那儿,似乎失去响应了return True 23def onKeyboardEvent(event): # 监听键盘事件print "MessageName:", event.MessageName print "Message:", event.Message print "Time:", event.Time print "Window:", event.Window print "WindowName:", event.WindowName print "Ascii:", event.Ascii,chr(event.Ascii) print "Key:", event.Key print "KeyID:", event.KeyID print "ScanCode:",event.ScanCode print "Extended:", event.Extendedprint "Injected:", event.Injected print "Alt", event.Alt print "Transition", event.Transition print "---" #同鼠标事件监听函数的返回值return True 42def main(): # 创建一个“钩子”管理对象hm = pyHook.HookManager() # 监听所有键盘事件hm.KeyDown = onKeyboardEvent # 设置键盘“钩子”hm.HookKeyboard() # 监听所有鼠标事件hm.MouseAll = onMouseEvent # 设置鼠标“钩子”hm.HookMouse() # 进入循环,如不手动关闭,程序将一直处于监听状态pythoncom.PumpMessages()56if __name__ == "__main__": main()。

pyhook的简单使用

pyhook的简单使用

pyhook的简单使⽤实验内容:通过python编程调⽤windows的api,编写键盘和⿏标监控的hook,将相关信息保存记录到txt⽂档中。

实验步骤:1.Hook技术,pyHook3和pywin32简介1.1 Hook简介windows应⽤程序是基于消息驱动的。

各种应⽤程序对各种消息作出响应从⽽实现各种功能。

hook(钩⼦)是⼀种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往⽬标窗⼝的消息并进⾏处理。

所以说,我们可以在系统中⾃定义钩⼦,⽤来监视系统中特定事件的发⽣,完成特定功能,如屏幕取词,监视⽇志,截获键盘、⿏标输⼊等等。

钩⼦实际上是⼀个处理消息的,通过,把它挂⼊系统。

每当特定的消息发出,在没有到达⽬的窗⼝前,就先捕获该消息,亦即先得到控制权。

这时钩⼦函数即可以加⼯处理(改变)该消息,也可以不作处理⽽继续传递该消息,还可以强制结束消息的传递。

Windows消息带了⼀些程序有⽤的信息,⽐如Mouse类信息,就带有⿏标所在窗体句柄、⿏标位置等信息,拦截了这些消息,就可以利⽤这些信息做出⼀些功能每⼀个Hook都有⼀个与之相关联的列表,称之为钩⼦,由系统来维护。

这个列表的指针指向指定的,应⽤程序定义的,被Hook⼦程调⽤的,也就是该钩⼦的各个处理⼦程序。

当与指定的Hook类型关联的消息发⽣时,系统就把这个消息传递到Hook⼦程。

⼀些Hook⼦程可以只监视消息,或者修改消息,或者停⽌消息的前进,避免这些消息传递到下⼀个Hook⼦程或者⽬的窗⼝。

最近安装的钩⼦放在链的开始,⽽最早安装的钩⼦放在最后,也就是后加⼊的先获得控制权。

与线程钩⼦:SetWindowsHookEx()函数的最后⼀个参数决定了此钩⼦是系统钩⼦还是线程钩⼦。

线程钩⼦⽤于监视指定线程的事件消息。

线程钩⼦⼀般在当前线程或者当前线程派⽣的线程内。

系统钩⼦监视系统中的所有线程的事件消息。

因为系统钩⼦会影响系统中所有的应⽤程序,所以必须放在独⽴的动态链接库(DLL) 中。

Windows系统钩子与键盘监控

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

基于jQuery实现键盘事件监听控件

基于jQuery实现键盘事件监听控件最近项⽬⾥要做⼀个画板,需要对键盘事件进⾏监听,来进⾏诸如撤回、重做、移动、缩放等操作,因此顺⼿实现了⼀个键盘事件监听控件,期间略有收获,整理出来,希望对⼤家有所帮助,更希望能获得⾼⼿的指点。

1. ⾃动获取焦点似乎浏览器的键盘事件只能被那些可以获得焦点的元素设置监听,⽽通常需要监听事件的 <DIV>、<CANVAS> 元素都不能获得焦点,因此需要修改⽬标元素的某些属性使其可以获得焦点,另外⼀种可⾏的⽅法是将事件委托给诸如 <INPUT> 标签。

这⾥采⽤的是第⼀类⽅法,当然,可以修改的属性也不⽌⼀种,例如,对于 <DIV> 标签可以将其 “editable” 属性设为 true,⽽这⾥采⽤的是给其设⼀个 tabindex 值。

代码如下:$ele.attr('tabindex', 1);另外,焦点事件的触发需要点击元素或者 TAB 切换,⽽这并不符合⼈类的直觉,因此需要监听⿏标移⼊事件,使⽬标元素“⾃动”地获得焦点:$ele.on('mouseenter', function(){$ele.focus();});2. 监听键盘事件由于项⽬⾯向的客户所使⽤的浏览器以chrome为主(实际上是36x浏览器),因此没有针对浏览器做任何适配,仅仅使⽤了jQuery的事件监听:$ele.on('keydown', this._keyDownHandler.bind(this));由于实现是控件化的,所以定义了⼀个私有⽅法 _keyDownHandler 来响应键盘的动作。

3. 按键事件甄别jQuery事件监听器返回的事件对象信息较多,因此需要进⾏甄别,为此定义了⼀个私有⽅法 _keyCodeProcess 来处理按键function _keyCodeProcess(e){var code = e.keyCode + '';var altKey = e.altKey;var ctrlKey = e.ctrlKey;var shiftKey = e.shiftKey;var threeKey = altKey && ctrlKey && shiftKey;var ctrlAlt = altKey && ctrlKey;var altShift = altKey && shiftKey;var ctrlShift = shiftKey && ctrlKey;var keyTypeSet = this.keyTypeSet;var resStr = '';if(threeKey){resStr = keyTypeSet.threeKey[code];} else if(ctrlAlt) {resStr = keyTypeSet.ctrlAlt[code];} else if(ctrlShift) {resStr = keyTypeSet.ctrlShift[code];} else if(altShift) {resStr = keyTypeSet.altShift[code];} else if(altKey) {resStr = keyTypeSet.altKey[code];} else if(ctrlKey) {resStr = keyTypeSet.ctrlKey[code];} else if(shiftKey) {resStr = keyTypeSet.shiftKey[code];} else {resStr = keyTypeSet.singleKey[code];}return resStr};这⾥的 keyTypeSet 是⼀个类似于查找表的对象,⾥⾯存储了 ctrl、shift、alt按钮的各种类型组合,每种组合下⼜分别按照按键码存储⼀个⾃定义事件类型字符串,事件发⽣之后会从这⾥返回这个字符串,当然,没有对应⾃定义事件的时候,就⽼⽼实实地返回空字符串。

WIN95中日志钩子(JournalRecord Hook)的使用

WIN95中日志钩子(JournalRecord Hook)的使用---- 钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之前处理它们。

钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可以截获键盘消息,鼠标钩子可以截获鼠标消息,外壳钩子可以截获启动和关闭应用程序的消息,日志钩子可以监视和记录输入事件。

钩子分为线程专用钩子和全局钩子,线程专用钩子只监视指定的线程,要监视系统中的所有线程,必须用到全局钩子。

对于全局钩子,钩子函数必须包含在独立的动态链接库(DLL) 中,这样才能被各种相关联的应用程序调用。

在WINDOWS中,日志钩子是个很特别的钩子,它只有全局钩子一种,是键盘鼠标等输入设备的消息在系统消息队列被取出时发生的,而且系统中只能存在一个这样的日志钩子,更重要是,它不必用在动态链接库中,这样可以省却了为安装一个全局钩子而建立一个动态链接库的麻烦。

利用日志钩子,我们可以监视各种输入事件,下面的示例可以用来记录键盘的输入,当有按键发生时,自动记录按键动作的日期和时间以及当前激活的窗口名称。

本示例在中文WIN98,Borland C++ Builder4中编译通过。

---- 1.新建一个工程,在窗体Form1中放置两个按钮Button1和Button2, CAPTION分别为“安装日志钩子”和“卸载日志钩子”。

---- 2.定义如下全局变量:HHOOK g_hLogHook=NULL; //钩子变量HWND g_hLastFocus=NULL;//记录上一次得到焦点的窗口句柄constintKeyPressMask=0x80000000; //键盘掩码常量char g_PrvChar; //保存上一次按键值3.在Button1的OnClick事件中输入:void __fastcall TForm1::Button1Click(TObject *Sender){if (g_hLogHook==NULL)g_hLogHook = SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)JournalLogProc,HInstance,0); //安装日志钩子}4.在Button2的OnClick事件中输入:void __fastcall TForm1::Button2Click(TObject *Sender){if (g_hLogHook!=NULL){UnhookWindowsHookEx(g_hLogHook);g_hLogHook=NULL;} //卸载日志钩子}5.输入钩子回调函数:HOOKPROC JournalLogProc(intiCode,WPARAM wParam, LPARAM lParam){if (iCode<0) return (HOOKPROC)CallNextHookEx(g_hLogHook,iCode,wParam,lParam); if (iCode="=HC_ACTION)" {EVENTMSG *pEvt="(EVENTMSG" *)lParam; int i; HWND hFocus; //保存当前活动窗口句柄char szTitle[256]; //当前窗口名称 char szTime[128]; //保存当前的日期和时间FILE *stream="fopen(“c:\\logfile.txt”,"a+t");" if(pEvt->message==WM_KEYDOWN){intvKey=LOBYTE(pEvt- >paramL); // 取得虚拟键值charch;charstr[10];hFocus=GetActiveWindow();//取得当前活动窗口句柄if(g_hLastFocus!=hFocus)//当前活动窗口是否改变{GetWindowText(hFocus,szTitle,256);g_hLastFocus=hFocus;strcpy(szTime,DateTimeToStr(Now()).c_str()); //得到当前的日期时间fprintf(stream,"%c%s%c%c%s",10,szTime,32,32,szTitle); //写入文件fprintf(stream,"%c%c",32,32);}intiShift=GetKeyState(0x10);//测试SHIFT,CAPTION,NUMLOCK等键是否按下intiCapital=GetKeyState(0x14);intiNumLock=GetKeyState(0x90);boolbShift=(iShift&KeyPressMask)==KeyPressMask;boolbCapital=(iCapital& 1)==1;boolbNumLock=(iNumLock& 1)==1;if (vKey>=48 &&vKey<=57) // 数字0-9 if (!bShift)fprintf(stream,"%c",vKey); if (vKey>=65 &&vKey<=90) // A-Z a-z {if (!bCapital) if (bShift) ch="vKey;" else ch="vKey+32;" else if (bShift)ch="vKey+32;" else ch="vKey;" fprintf(stream,"%c",ch); } if (vKey>=96 &&vKey<=105) // 小键盘0-9 if (bNumLock)fprintf(stream,"%c",vKey-96+48); if (vKey>=186 &&vKey<=222) // 其他键{switch (vKey) {case 186:if (!bShift) ch=";" ; else ch=":" ;break; case 187:if (!bShift) ch="=" ; else ch="+" ;break; case 188:if (!bShift) ch="," ; else ch="<" ;break; case 189:if (!bShift) ch="-" ; elsech="_" ;break; case 190:if (!bShift) ch="." ; else ch=" >" ;break; case 191:if (!bShift) ch="/" ; else ch="?" ;break; case 192:if (!bShift) ch="`" ; else ch="~" ;break; case 219:if (!bShift) ch="[" ; elsech="{" ;break; case 220:if (!bShift) ch="\\" ; else ch="|" ;break; case 221:if (!bShift) ch="]" ; else ch="}" ;break; case 222:if (!bShift) ch="\" '; else ch="\"" ;break; default:ch="n" ;break; } if (ch!="n" )fprintf(stream,"%c",ch); } // if (wParam>=112 &&wParam<=123) // 功能键[F1]-[F12] if (vKey>=8 &&vKey<=46) //方向键 {switch (vKey) {case8:strcpy(str,"[BK]");break; case 9:strcpy(str,"[TAB]");break; case 13:strcpy(str,"[EN]");break; case 32:strcpy(str,"[SP]");break; case 33:strcpy(str,"[PU]");break; case 34:strcpy(str,"[PD]");break; case 35:strcpy(str,"[END]");break; case 36:strcpy(str,"[HOME]");break; case 37:strcpy(str,"[LF]");break; case 38:strcpy(str,"[UF]");break; case 39:strcpy(str,"[RF]");break; case 40:strcpy(str,"[DF]");break; case 45:strcpy(str,"[INS]");break; case 46:strcpy(str,"[DEL]");break; default:ch="n" ;break; } if (ch!="n" ) {if (g_PrvChar!="vKey)" {fprintf(stream,"%s",str); g_PrvChar="vKey;" } } } } if(pEvt->message==WM_LBUTTONDOWN || pEvt- >message==WM_RBUTTONDOWN){hFocus=GetActiveWindow();if (g_hLastFocus!=hFocus){g_hLastFocus=hFocus;GetWindowText(hFocus,szTitle,256);strcpy(szTime,DateTimeToStr(Now()).c_str());//得到当前的日期时间fprintf(stream,"%c%s%c%c%s",10,szTime,32,32,szTitle); //写入文件fprintf(stream,"%c%c",32,32);}}fclose(stream);return (HOOKPROC)CallNextHookEx(g_hLogHook,iCode,wParam,lParam);}---- 将工程编译执行后,每当激活一个窗口时,就会把当前窗口名称写入文件c:\logfile.txt中,当有按键时,按键的名称也会写入此文件中,这里的并没有处理全部的按键,读者可根据需要添加相应的语句。

云计算技术与应用专业《键盘钩子》

键盘钩子病毒实验【实验环境】本地主机或Windows实验台或其他安装Windows系统的主机Microsoft Visual Studio 2021/C#【实验内容】运行简要键盘钩子实例分析键盘钩子代码及原理键盘钩子病毒实验【实验原理】钩子Hoo的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。

钩子的种类有很多,每种钩子可以截获并处理相应的消息。

每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。

此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。

Windows钩子可以分成两种类型:线程钩子和全局钩子。

线程钩子只能监视某个线程,而全局钩子那么可对在当前系统下运行的所有线程进行监视。

显然,线程钩子可以看作是全局钩子的一个子集,全局钩子虽然功能强大,但实现起来也复杂一些:其钩子函数的实现必须封装在动态链接库DLL中才可以使用。

Windows系统可以同时存在多个同类型的钩子,这些钩子组成一个钩子链,系统为通过一个指针链表来维护它,称之为钩子链表。

最近安装的钩子放在链表的开始,最早安装的钩子那么放在最后,当钩子监视的消息出现时,操作系统调用链表开始处的第一个钩子处理函数进行处理,也就是说最后参加的钩子优先获得控制权。

由于Windows钩子可以截获发往系统的各种消息并按照自己的需要对消息进行处理,以到达控制键盘、鼠标的目的。

键盘钩子病毒正是利用Windows钩子这一特性,来获取用户的秘密数据如账号,密码等,或者传播恶意破坏代码。

这些病毒程序往往将钩子隐藏在后台或者利用DLL将病毒注入到其它合法的系统进程之中,以逃避杀毒软件的检查。

病毒可以监视或截获键盘、鼠标的输入等,从而窃取用户信息,到达一些私人或非法的目的。

许多木马病毒都利用了Windows钩子,例如国内有名的冰河木马就利用钩子在被监控端后台记录用户的击键信息,获取用户系统私密,最终对被监视端实现远程控制。

键盘事件的挂钩监控原理及其应用

键盘事件的挂钩监控原理及其应用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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档