当前位置:文档之家› 综合课程设计报告--键盘输入截获系统的设计与实现

综合课程设计报告--键盘输入截获系统的设计与实现

综合课程设计报告--键盘输入截获系统的设计与实现键盘输入截获系统的设计与实现摘要Windows系统键盘截获系统,在我们的生活中是很常见的,比如在军方的某些系统中,为确保某些机密信息不被泄露出去,就要求在工作人员在于外界交流的时候,无意中输出的可能隐含机密信息不被发送出去,此时可以设置关键字,使用钩子来屏蔽这些信息,不让其发送出去,这样就很好的杜绝了机密信息的泄露的发生,提高军方系统的安全性,以上是一个很常见的例子,那么当提及到Windows系统信息截获,不得不想到动态链接库和钩子,动态链接库在Windows 系统中无处不在,编程过程中,调用的所有的API都是从系统动态链接库导出的,实际上,不使用动态链接库几乎是不可能的,因为Windows 提供给编程人员的几乎所有功能都驻留在动态链接库中。

Windows 应用程序的运行模块是基于消息驱动的,任何线程只要注册了窗口类都会有一个消息队列来接收用户的输入消息和系统消息。

为了取得特定线程接收或者发送的消息,就要用到Windows提供的钩子。

Windows钩子广泛应用于各种检测侦查程序中,如输入监视、API截获等。

一般的钩子函数都必须写在动态链接库中,以便注入到其进程。

一、需求分析1、实验要求:设计一个基于Windows或Linux的键盘输入捕获系统,对特定键盘输入进行检测过滤。

要求如下:(1)设计一个键盘钩子程序捕获键盘动作,捕获任意窗口上的键盘输入,并进行记录;(2)能监控QQ、MSN、word、Excel、记事本、IE网页等应用程序;(3)设置一些关键词,根据键盘输入,设计一种关键词检测的方法,能在记录的键盘输入中检测出关键词出现的位置;(4)对输入的关键词,进行过滤,阻止其在相关的应用程序中输出;2、实验环境: Microsoft Visual studio 2010二、实验分组情况:三、实验原理概述:钩子:钩子是Windows中可以拦截事件的一种机制,可以指定一个函数作为特定类型的被拦截事件的钩子过程。

钩子过程可以对拦截的每个事件进行处理。

不同类型的钩子可以为消息处理机制的不同方面提供访问,例如,WH_MOUSE钩子可以监视与鼠标操作相关的消息。

系统为每一个类型的钩子维护一个独立的钩子链,其中包含指定一组作为钩子过程的回调函数指针。

当与指定类型的钩子相关联的消息发生时,系统会把消息传递给钩子链中相关钩子过程。

关于钩子需要了解到以下几点:(1)钩子是用来截获系统的消息流的。

利用钩子,可以处理任何感兴趣的消息,包括其他线程的消息。

(2)截获消息后,用于处理消息的子程序叫做钩子函数,它是应用程序自定义的一个函数,在安装钩子时要把这个函数的地址告诉Windows.(3)系统中同一时间可以有多个进程安装钩子。

多个钩子函数在一起组成钩子链。

所以在处理截获到的消息时,应该把消息事件传递下去,以便其他钩子也有机会处理这一消息。

(4)钩子会使系统变慢,因为他增加了系统对每个消息的处理量。

仅应该在必要时才安装钩子,而且在不需要时尽快移除。

全局钩子:钩子可以分为全局钩子和特定线程钩子,全局钩子的钩子过程只能在Dll中定义,全局钩子可以监视与调用线程位于同一个桌面的所有线程的消息,然后调用钩子过程对拦截的消息进行处理。

线程钩子:钩子的另一种类型是特定线程钩子,他只能监视一个单独的线程的消息。

特定的线程钩子的钩子过程可以在应用程序的任何位置,每个线程都有自己的私有内存空间,所以一个线程不能调用其他线程的代码,也不能访问其他线程的内存数据,这样,如果在安装钩子的线程中定义钩子的过程,则其他正在运行的线程被拦截消息后,就不能成功调用钩子过程了。

动态链接库:动态链接库是应用程序的一个模块,这个模块用于导出一些函数和数据供程序中的其他模块使用。

可以从以下3个方面来理解这个概念:(1)动态链接库是应用程序的一部分,他的任何操作都是代表应用程序进行的。

所以动态链接库在本质上与可执行文件没有区别,都是作为模块被进程加载到自己的空间地址的。

(2)动态链接库在程序编译时并没有被插入到可执行文件中,在程序运行时整个库的代码才会调入内存,这就是所谓的“动态链接”。

(3)如果有多个程序用到同一个动态链接库,Windows在物理内存中只保留一份库的代码,仅通过分页机制将这份代码映射到不同的进程中,这样,不管有多少程序同时使用一个库,库代码实际占用的物理内存永远只有一份。

四、总体设计:为实现实验要求的键盘输入截获系统功能,由实验要求我们可以了解到,我们要实现的功能主要包含以下几点,首先是设置的钩子函数能够截获键盘的输入,这是最基本的功能,因为我们要实现的是键盘的截获,而不是鼠标或者其他输入设别的信息的截获,所以可以理解为特点线程输入信息的截获,其次是能够监控能监控QQ、MSN、word、Excel、记事本、IE网页等应用程序,即为设置一个全局钩子即可截获所有任何可编辑界面的输入。

再次是能够保存截获信息,即记录输入信息,最后是过滤关键字,我们设置为屏蔽某些关键字,当点击这一关键字是,在主窗口上是不能显示的,但是可以在保存文件中可以看到被屏蔽的关键字,以上四点就是要实现的主要功能。

在我们的程序中,我们使用了动态链接库CppHookDll和CppWindowsHook两个程序,后者为应用程序,在运行是动态调用动态链接库CppHookDll,当完成动态链接库的加载后,就开始实现钩子的相关操作,钩子的安装,卸载,截获并向主窗口传送信息等。

同时在应用程序对话框的主窗口显示键盘的输入信息。

为实现该键盘截获系统的功能,以下是对动态链接库和应用程序中主要函数的功能的大体介绍:CppHookDll中:LRESULT CALLBACK KeyboardHookProc( ) //钩子键盘函数BOOL WINAPI SetKeyboardHook( ) //安装或者卸载钩子函数LRESULT CALLBACK LowKeyboardHookProc( )//低级键盘钩子函数BOOL WINAPI SetLowKeyboardHook( ) //低级键盘钩子设置函数CppWindowsHook中:CCppWindowsHookApp::CCppWindowsHookApp()//用于添加构造代码BOOL CCppWindowsHookApp::InitInstance() //完成初始化功能。

CppWindowsHookDlg中:BOOL CCppWindowsHookDlg::OnInitDialog()//初始化对话框¨long CCppWindowsHookDlg::OnHookKeyboard( ) //键盘钩子处理函数long CCppWindowsHookDlg::OnHookLowKeyboard( )//低级键盘钩子处理函数void CCppWindowsHookDlg::OnBnClickedSethook() // 安装或者卸载全局钩子函数void CCppWindowsHookDlg::OnBnClickedSethookthread()//安装或卸载线程键盘钩子函数void CCppWindowsHookDlg::OnBnClickedSethookinput() //设置钩子输入函数,用于屏蔽某些键voidCCppWindowsHookDlg::OnBnClickedResettex t()//清空函数主函数界面显示如下:五、详细设计:(含流程图)1、CCppWindowsHookDlg::CCppWindowsHookDlg( ) 函数功能:CppWindowsHookDlg类的构造函数的实现,其中调用了基类的构造函数,以: CDialog(CCppWindowsHookDlg::IDD, pParent)//CCppWindowsHookDlg父类的ID以及以及父窗口句柄为参数。

函数代码:CCppWindowsHookDlg::CCppWindowsHookDlg(CW nd* pParent /*=NULL*/){ m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);//通过AfxGetApp()函数来获得全局的唯一的应用程序(即theApp),然后调用theApp对象的//然后调用theApp对象的LoadIcon()函数获得指定图标的句柄。

}1、宏定义消息映射表功能:宏定义消息映射表,第一个参数为资源里的ID,后一个为调用的函数名。

/括号里第一个参数,是资源里的ID,第二个参数是当按动时调用的函数名。

//以鼠标为例括号里第一个参数,是资源里的ID,是鼠标腰部那个钮)第二个参数是当腰部那个钮按动时调用的函数名。

ON_BN_CLICKED 是宏。

它与 ON_COMMAND 宏一样。

函数代码:ON_BN_CLICKED(IDC_BUTTON_WAIST_ACTION, OnButtonWaistAction)BEGIN_MESSAGE_MAP(CCppWindowsHookDlg,CDialog)//这是消息映射的实现,其中有6个消息ON_MESSAGE(WM_KEYSTROKE, OnHookKeyboard)//键盘钩子处理函数以及资源ID映射ON_MESSAGE(WM_KEYINPUT, OnHookLowKeyboard)//低级键盘钩子处理函数以及资源ID映射ON_BN_CLICKED(IDC_SETHOOK,&CCppWindowsHookDlg::OnBnClickedSethook) //“全局键盘钩子”按钮对应的函数和操作ON_BN_CLICKED(IDC_SETHOOKTHREAD,&CCppWindowsHookDlg::OnBnClickedSethookth read)//“线程键盘钩子”按钮对应的函数和操作ON_BN_CLICKED(IDC_SETHOOKINPUT,&CCppWindowsHookDlg::OnBnClickedSethookin put)//低级键盘屏蔽按钮对应的函数和操作ON_BN_CLICKED(IDC_RESETTEXT,&CCppWindowsHookDlg::OnBnClickedResettext )//“清空”按钮对应的函数和操作END_MESSAGE_MAP()2、初始化对话框函数函数功能:OnInitDialog()初始化对话框,函数代码:BOOLCCppWindowsHookDlg::OnInitDialog()//初始化对话框{CDialog::OnInitDialog();// 设置此对话框的图标。

相关主题