APP下载

击键特征数据采集系统设计*

2015-11-08

新技术新工艺 2015年1期
关键词:钩子调用持续时间

李 艳

(西安职业技术学院,陕西 西安710077)

随着网络技术的发展,信息安全显得日益重要。通常身份认证系统的方式有很多,基于击键特征的身份认证利用键盘提取用户特征,不需要其他设备,是一种价格低廉,使用便利的认证方式。本设计主要分为2部分:用于实现键盘消息截取的键盘钩子dll动态链接库的建立以及主函数的编写。其中,dll动态链接库主要实现的功能是将用户输入的按键信息保存到工程目录下以及设置按键以屏蔽键盘消息;主函数中除了调用动态链接库以外,主要完成单键持续时间和按键间隔时间的采集。试验采用的是MFC,即基于对话框的MFC工程。

1 动态链接库建立

1.1 dll主程序设计

键盘钩子安装好后,则在主函数调用时,一旦有按键消息(按键按下或弹起),就会触发键盘钩子函数,截获消息并会进入过程函数进行相应处理,过程函数是处理键盘消息的主要函数。本试验中,要求将键盘上按下的键记录在工程目录下。在开始编写前,首先声明钩子过程函数为:

在进行钩子过程编写时,设计实现的是将按键保存到工程目录下的“key.txt”文件中,因此将用到c中的文件类型函数,可以用fopen()函数来实现打开文件。本设计采用的是“a+”,表示为读写打开一个文本文件,当字符输入完成后,可用fwrite函数输入一组数据到文件中,fwrite用来写入一个数据块,它的一般调用形式为fwrite(buffer,zise,count,fp)。字符的保存机理为首先将键盘的虚拟键码保存,然后再利用ToAscii函数将虚拟键码或按键状态转换成相应的字符。ToAscii函数的的原型为:

1.2 函数导出

处理函数编好后,必须将要在主函数中调用的函数导出,本试验需要导出的函数为InstallHook()与EndHook()函数。调用InstallHook()函数,当有按键消息时,便会触发钩子函数,进入钩子过程进行处理;当不需要键盘钩子时,调用EndHook()函数,卸载钩子。在源文件中添加关键字__declspec(dllexport)来声明要导出的函数,在源文件中添加一头文件KB.h,添加下述代码:

1.3 dll与lib文件生成

在完成上述步骤,即钩子安装,钩子过程处理,钩子卸载,函数导出一系列工作之后,点击“编译”与“建立”按钮,在工程Debug目录下生成2个文件,KB.lib与KB.dll。至此,一个动态链接库完成建立,其功能主要为保存按键信息。

2 主函数设计

2.1 程序界面设计

在VC++6.0环境下新建一个基于对话框的MFC AppWizard(exe)工程,工程命名为特征值采集,在选项“ResuorceView”的“test resuorce”下选择“Dialog”,选择第2项“IDD_TEST_DIALOG”,点击打开设置应用程序界面,添加4个按钮,ID属性分别为IDC_BUTTON1、IDC_BUTTON2、IDC_BUTTON3、IDC_BUTTON4,Caption属性分别为获取单键持续时间(毫秒)、获取两键间隔时间(毫秒)、取消按键信息、保存按键信息。按下对应按钮会实现相应的功能。

2.2 主程序编写

2.2.1 获取单键持续时间与按键间隔时间

为在对话框中响应按键按下及弹起消息,需要在CtestDlg类下添加函数PreTranslateMessage(MSG* pMsg),右击添加虚拟函数PreTranslateMessage(),通过重载这个函数,可以改变MFC的消息控制流程,甚至可以做一个全新的控制流出来。利用PreTranslateMessage()可以拦截按键消息,在窗口进行响应。右击CtestDlg类,选择“Add Virtual Function”,在其下选择“PreTranslateMessage”并添加,就可以在其下进行按键拦截和处理。PreTranslateMessage函数如下:

本文主要采用高精度计时器QueryPerformanceFrequency()和 QueryPerformanceCounter()函数获取单键持续时间与两键间隔时间。在计时之前,需要调用QueryPerformanceFrequency()函数获取计数器的频率nFreq,之后为获取单键持续时间与两键间隔时间,必须截获按键按下消息(WM_KEYDOWN)和释键消息(WM_KEYUP),每当按键按下或弹起时,调用QueryPerformanceCounter()函数获取当前计数值nBeginTime.QuadPart与nEndTime.QuadPart,可记为t1与t2,则单键持续时间为time1=(t2-t1)/nFreq。类似地,两键间隔时间可用同样的方法测得。由于按键按下和释放消息都要截获处理,因此可用switch语句实现:

结果为双精度型,单位为ms。如此便获得了单键持续时间,由于本设计设置为获取6位任意字符的单键持续时间和两键间隔时间,可定义两个双精度型全局数组time[6]和time[5],分别用于存放六个按键的持续时间和两两间隔时间,并设置1个变量i,共判断6次,以上述同样的方法获得两种按键特征值。

2.2.2 动态链接库调用

动态链接库编译后,需要在主程序中对其进行调用,调用方法采用隐式加载的方式,即将工程KB\Debug目录下生成的dll文件拷贝至主函数特征值采集工程目录下,并在工程下选择工程,设置、选择连接选项卡,在对象/库模块下添加静态库KB.lib的路径,由于本设计定的两工程在同一目录下,可添加的路径为:…\KB\Debug\KB.lib.

2.2.3 按钮功能实现

本设计在程序界面设置了4个按钮,ID为IDC_BUTTON1、IDC_BUTTON2、IDC_BUTTON3、IDC_BUTTON4,Caption属性分别为获取单键持续时间(毫秒)、获取两键间隔时间(毫秒)、取消按键信息、保存按键信息,设计要求按下时实现相应的功能,其中按下IDC_BUTTON1和IDC_BUTTON2要求显示结果,即数组time[6]与time[5]的各个元素值,本设计采用MessageBox简单显示结果,使用Cstring的Format方法将双精度型time[6]与time[5]元素转换成Cstring字符串。打开程序设计界面,双击IDC_BUTTON1,跳转到如下程序:

在上述程序中添加Format格式转换代码,并用MessageBox对话框显示结果,本设计将double型转换为Cstring,因此可用%lf格式转换:

类似地,双击IDC_BUTTON2,在函数void CTestDlg::OnButton2()下用同样的方法可将time[5]中的各个元素显示。

IDC_BUTTON3的功能是取消按键信息的保存,信息的保存是在dll中实现的,因此,在主函数中,只需简单地调用EndHook()将钩子卸载就行,这样就取消了钩子的功能。工程目录下的key.txt文件将不会保存用户输入的信息。函数如下:

void CTestDlg::OnButton3()

//TODO:Add your control notification handler code here

EndHook();

IDC_BUTTON4用于保存输入信息,只需调用InstallHook()即可。函数如下:

void CTestDlg::OnButton4()

//TODO:Add your control notification handler code here

InstallHook();

通过试验验证,击键特征数据采集系统能够很好地采集用户击键时的按键持续时间和间隔时间,为后续用户击键特征的识别打下了良好基础。

[1]曲维光,宋如顺.基于用户击键特征识别的用户认证系统[J].计算机工程与应用,2002,39(16):69-70

[2]朱明,周津,王继康.基于击键特征的用户身份认证新方法[J].计算机工程,2002,28(10):138-140.

猜你喜欢

钩子调用持续时间
核电项目物项调用管理的应用研究
变径组合提升管内团聚物持续时间的分析
谁和谁好
幸福的一家
近10年果洛地区冻土的气候特征分析
《脉望馆钞校本古今杂剧》穿关之“钩子困带”考
基于系统调用的恶意软件检测技术研究
精钩子
The 15—minute reading challenge
利用RFC技术实现SAP系统接口通信