综合课程设计报告--键盘输入截获系统的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
综合课程设计报告--键盘输入截获系统的设计与实现
键盘输入截获系统的设计与实现
摘要
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() //设置钩子输入函数,用于屏蔽某些键void
CCppWindowsHookDlg::OnBnClickedResettex t()//清空函数