1、键盘输入截获系统的设计与实现键盘输入截获系统的设计与实现 摘要摘要 Windows 系统键盘截获系统,在我们的生活中是很常见的,比如在军方的某些系统中, 为确保某些机密信息不被泄露出去, 就要求在工作人员在于外界交流的时候, 无意中输出的 可能隐含机密信息不被发送出去,此时可以设置关键字,使用钩子来屏蔽这些信息,不让其 发送出去,这样就很好的杜绝了机密信息的泄露的发生,提高军方系统的安全性,以上是一 个很常见的例子,那么当提及到 Windows 系统信息截获,不得不想到动态链接库和钩子, 动态链接库在 Windows 系统中无处不在,编程过程中,调用的所有的 API 都是从系统动态 链接库导出
2、的,实际上,不使用动态链接库几乎是不可能的,因为 Windows 提供给编程人 员的几乎所有功能都驻留在动态链接库中。 Windows 应用程序的运行模块是基于消息驱动的, 任何线程只要注册了窗口类都会有一 个消息队列来接收用户的输入消息和系统消息。 为了取得特定线程接收或者发送的消息, 就 要用到 Windows 提供的钩子。Windows 钩子广泛应用于各种检测侦查程序中,如输入监视、 API 截获等。一般的钩子函数都必须写在动态链接库中,以便注入到其进程。 一、一、需求分析需求分析 1 1、实验要求:实验要求: 设计一个基于 Windows 或 Linux 的键盘输入捕获系统,对特定键盘
3、输入进行 检测过滤。要求如下: (1)设计一个键盘钩子程序捕获键盘动作,捕获任意窗口上的键盘输入, 并进行记录; (2)能监控 QQ、MSN、word、Excel、记事本、IE 网页等应用程序; (3)设置一些关键词,根据键盘输入,设计一种关键词检测的方法,能在 记录的键盘输入中检测出关键词出现的位置; (4)对输入的关键词,进行过滤,阻止其在相关的应用程序中输出; 2 2、实验环境:实验环境: Microsoft Visual studio 2010 二、二、实验实验分组情况分组情况: 三、三、实验原理实验原理概述概述: 钩子钩子: 钩子是 Windows 中可以拦截事件的一种机制, 可以指
4、定一个函数作为特定类型的被 拦截事件的钩子过程。 钩子过程可以对拦截的每个事件进行处理。 不同类型的钩子可 以为消息处理机制的不同方面提供访问,例如,WH_MOUSE 钩子可以监视与鼠标操作 相关的消息。 系统为每一个类型的钩子维护一个独立的钩子链, 其中包含指定一组作 为钩子过程的回调函数指针。 当与指定类型的钩子相关联的消息发生时, 系统会把消 息传递给钩子链中相关钩子过程。 关于钩子需要了解到以下几点: (1) 钩子是用来截获系统的消息流的。利用钩子,可以处理任何感兴趣的消息,包 括其他线程的消息。 (2) 截获消息后,用于处理消息的子程序叫做钩子函数,它是应用程序自定义的一 个函数,在
5、安装钩子时要把这个函数的地址告诉 Windows. (3) 系统中同一时间可以有多个进程安装钩子。多个钩子函数在一起组成钩子链。 所以在处理截获到的消息时,应该把消息事件传递下去,以便其他钩子也有机 会处理这一消息。 (4) 钩子会使系统变慢,因为他增加了系统对每个消息的处理量。仅应该在必要时 才安装钩子,而且在不需要时尽快移除。 全局钩子全局钩子: 钩子可以分为全局钩子和特定线程钩子, 全局钩子的钩子过程只能在 Dll 中定义, 全局钩子可以监视与调用线程位于同一个桌面的所有线程的消息, 然后调用钩子过程 对拦截的消息进行处理。 线程钩子线程钩子:钩子的另一种类型是特定线程钩子,他只能监视一
6、个单独的线程的消息。特定的 线程钩子的钩子过程可以在应用程序的任何位置,每个线程都有自己的私有内存空 间, 所以一个线程不能调用其他线程的代码, 也不能访问其他线程的内存数据, 这样, 如果在安装钩子的线程中定义钩子的过程, 则其他正在运行的线程被拦截消息后, 就 不能成功调用钩子过程了。 动态链接库动态链接库: 动态链接库是应用程序的一个模块, 这个模块用于导出一些函数和数据供程序 中的其他模块使用。可以从以下 3 个方面来理解这个概念: (1)动态链接库是应用程序的一部分,他的任何操作都是代表应用程序进行的。所以动态 链接库在本质上与可执行文件没有区别, 都是作为模块被进程加载到自己的空间地址 的。 (2)动态链接库在程序编译时并没有被插入到可执行文件中,在程序运行时整个库的代码 才会调入内存,这就是所谓的“动态链接” 。 (3)如果有多个程序用到同一个动态链接库,Windows 在物理内存中只保留一份库的代码, 仅通过分页机制将这份代码映射到不同的进程中, 这样, 不管有多少程序同时使用一 个库,库代码实际占用的物理内存永远只有一份。 四、总体设计:四、总体设计: 为