仿USB键盘文件植入器模拟人工按键.docx

上传人:b****6 文档编号:3716268 上传时间:2022-11-24 格式:DOCX 页数:19 大小:196KB
下载 相关 举报
仿USB键盘文件植入器模拟人工按键.docx_第1页
第1页 / 共19页
仿USB键盘文件植入器模拟人工按键.docx_第2页
第2页 / 共19页
仿USB键盘文件植入器模拟人工按键.docx_第3页
第3页 / 共19页
仿USB键盘文件植入器模拟人工按键.docx_第4页
第4页 / 共19页
仿USB键盘文件植入器模拟人工按键.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

仿USB键盘文件植入器模拟人工按键.docx

《仿USB键盘文件植入器模拟人工按键.docx》由会员分享,可在线阅读,更多相关《仿USB键盘文件植入器模拟人工按键.docx(19页珍藏版)》请在冰豆网上搜索。

仿USB键盘文件植入器模拟人工按键.docx

仿USB键盘文件植入器模拟人工按键

编号:

 

嵌入式系统综合实训说明书

题目:

仿USB键盘文件植入器

院(系):

信息与通信学院

专业:

电子信息工程

学生姓名:

万玉

学号:

1161170125

指导教师:

叶金才

 

2015年1月11日

摘要

这次设计任务所做的工作就是实现模拟人工按键,将开发板接上位机后,不用板子上的按键,直接用程序产生键盘码,计算机收到USB键盘的键码,会执行相应的功能。

具体的动作是打开计算机的命令行,在命令行里面运行记事本,并新建一个a.txt记事本文件,并向该文件录入若干的英文字符。

运行命令行通过键盘操作是win+R-》cmd-》notepada.txt-》enter-》录入英文字符。

最后,会在本文介绍如何实现向电脑发送WIN+R这样的组合键键码,可以类似去模拟ALT+F4,SHIFT+1之类的按键。

关键词:

ARM;USB键盘;模拟人工按键;USBHID协议;组合键

 

Abstract

Thedesigntaskistorealizethesimulationofartificialworkkey,developmentboardconnectedwithahostcomputer,noboardofthekey,thedirectuseofprogramgenerationkeyboardcode,computerreceivedUSBkeyboardkeycode,executesthecorrespondingfunction.Thespecificactionistoopenthecomputercommandline,thecommandlinewhichrunNotepad,andanewa.txtnotepadfile,andsometothefileentryEnglishcharacter.Runcommandlinesthroughthekeyboardoperationiswin+R-"cmd-"Notepada.txt-"enter-"inputEnglishcharacter.

最后,会在本文介绍如何实现向电脑发送WIN+R这样的组合键键码,可以类似去模拟ALT+F4,SHIFT+1之类的按键。

Finally,inthispaperintroduceshowtorealizethecomputertosendWIN+Rthiscombinationkeycode,canbesimilartothesimulatedALT+F4,SHIFT+1andthelikebutton.

Keywords:

ARM;USBkeyboardkeys;artificialsimulation;USBHIDprotocol;keycombination

 

引言……………………………………………………………………………1

1设计软件基础知识…………………………………………………………2

1.1C编译器KEIL介绍…………………………………………………………2

1.2ARM相关知识…………………………………………………………………2

1.3USB-HID简介…………………………………………………………………2

2模拟人工按键设计…………………………………………………………3

2.1程序设计的任务要求…………………………………………………………3

2.2程序的设计思路和想法………………………………………………………3

2.3报告描述符…………………………………………………………………3

2.4普通按键程序设计……………………………………………………………4

2.5特殊(功能)按键程序设计……………………………………………………6

3功能程序设计………………………………………………………………7

3.1程序总流程图………………………………………………………………7

3.2开始程序的修改……………………………………………………………8

4结论………………………………………………………………………10

谢辞……………………………………………………………………………11

参考文献………………………………………………………………………12

附录……………………………………………………………………………13

 

引言

USB,是英文UniversalSerialBus(通用串行总线)的缩写,而其中文简称为“通串线”,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。

是应用在PC领域的接口技术。

USB接口支持设备的即插即用和热插拔功能。

USB是在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出的。

USB-HID是HumanInterfaceDevice的缩写,由其名称可以了解HID设备是直接与人交互的设备,例如键盘、鼠标与游戏杆等。

不过HID设备并不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。

交换的数据存储在称为报表(report)的结构内,设备的固件必须支持HID报表的格式。

主机在控制与中断传输中传送与要求报表,来传送与接收数据。

报表的格式非常有弹性,可以处理任何类别的数据。

键盘是最常用也是最主要的输入设备,通过键盘可以将英文字母、数字、标点符号等输入到计算机中,从而向计算机发出命令、输入数据等。

起初这类键盘多用于品牌机,如HP、联想等品牌机都率先采用了这类键盘,受到广泛的好评,并曾一度被视为品牌机的特色。

随着时间的推移,渐渐的市场上也出现独立的具有各种快捷功能的产品单独出售,并带有专用的驱动和设定软件,在兼容机上也能实现个性化的操作。

 

1设计软件基础知识

包括keiluVision4,ARM核心知识,USB-HID简介。

1.1C编译器Keil介绍

KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。

Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。

KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。

在开发大型软件时更能体现高级语言的优势。

KeilSoftware公司推出的uVision4是一款可用于多种8051MCU的集成开发环境(IDE),该IDE同时也是PK51及其它开发套件的一个重要组件。

除增加了源代码、功能导航器、模板编辑以及改进的搜索功能外,uVision3还提供了一个配置向导功能,加速了启动代码和配置文件的生成。

此外其内置的仿真器可模拟目标MCU,包括指令集、片上外围设备及外部信号等。

uVision3提供逻辑分析器,可监控基于MCUI/O引脚和外设状态变化下的程序变量。

uVision4提供对多种最新的8051类微处理器的支持,包括AnalogDevices的ADuC83x和ADuC84x,以及Infineon的XC866等。

1.2ARM核心相关知识

2012年3月14日,中国上海——ARM公司今天发布了一款拥有全球最低功耗效率的微处理器——ARMCortex™-M0+处理器。

支持ARMv6M指令集,该款经过优化的Cortex-M0+处理器可针对家用电器、白色商品、医疗监控、电子测量、照明设备以及功耗与汽车控制器件等各种广泛应用的智能传感器与智能控制系统,提供超低功耗、低成本微控制器(MCU)。

1.3USB-HID简介

是HumanInterfaceDevice的缩写,由其名称可以了解HID设备是直接与人交互的设备,例如键盘、鼠标与游戏杆等。

不过HID设备并不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。

交换的数据存储在称为报表(report)的结构内,设备的固件必须支持HID报表的格式。

主机在控制与中断传输中传送与要求报表,来传送与接收数据。

报表的格式非常有弹性,可以处理任何类别的数据。

每个USB只有一个主机。

在USB中,USBHOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。

USB报告描述符(ReportDescriptor)是HID设备中的一个描述符,它是比较复杂的一个描述符。

USB-HID设备是通过报告来给传送数据的,报告有输入报告和输出报告。

输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。

报告是一个数据包,里面包含的是所要传送的数据。

输入报告是通过中断输入端点输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出。

而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。

通过它,USBHOST可以分析出报告里面的数据所表示的意思。

它通过控制输入端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求是发送到接口的,而不是到设备。

一个报告描述符可以描述多个报告,不同的报告通过报告ID来识别,报告ID在报告最前面,即第一个字节。

当报告描述符中没有规定报告ID时,报告中就没有ID字段,开始就是数据。

2模拟人工按键设计

包括设计要求,普通按键的程序设计,组合键(功能键组合)的程序设计。

2.1程序设计的任务要求

模拟人工按键(默认路径),win+r(组合键,Win键即window键)→输入cmd→回车→输入notepada.txt→回车→回车(由于第一次在默认路径C:

\Users\Administrator新建文件,所以对弹出的是否创建文件的提示框按一次回车)→输入abcd1234→按下Ctrl+S(组合键,对记事本进行保存的快捷键)进行保存→完成。

2.2程序的设计思路和想法

开始前应该把Win+R和Ctrl+S这两个组合键环节分别定成一个程序的开始和结束,而cmd,回车,notepad空格a.txt,回车,回车,abcd1234这个单个按键的环节定为中间环节,整体的思路就是这样。

由于一开始通过例程知道单个按键比较容易实现,于是可以是先做了单个按键的数组,再去做组合键,做完之后回头总结,这样的想法确实是对的,遵循先易后难得原则,而且也可以从简单的实现方法中去发现组合键的做法。

在设计组合键的时候最难得莫过于window键都按不下去,通过查询和阅读了很多的资料后,总结了win键和类似的功能键如何实现,然后在不断的尝试中发现组合键的实现方法,后面会做详细的介绍。

2.3报告描述符

在上面的USB-HID简介中已经介绍了报告描述符。

报告描述符是描述一个报告以及报告里面的数据是用来干什么用的。

通过它,USBHOST可以分析出报告里面的数据所表示的意思。

所以有必要解释一下报告描述符。

constuint8_tg_HID_au8KeyboardReportDescriptor[]={

0x05,0x01,//UsagePage(GenericDesktop)

//表示用途页为通用桌面设备

0x09,0x06,//Usage(Keyboard)

//表示用途为键盘

0xA1,0x01,//Collection(Application)

//表示应用集合,必须以END_COLLECTION来结束它

0x05,0x07,//UsagePage(KeyCode)

//表示用途页为按键

0x19,0xE0,//UsageMinimum(224)

//用途最小值,这里为左Ctrl键

0x29,0xE7,//UsageMaximum(231)

//用途最大值,这里为右GUI,即window键

0x15,0x00,//LogicalMinimum(0)

//逻辑最小值为0

0x25,0x01,//LogicalMaximum

(1)

//逻辑最大值1

0x75,0x01,//ReportSize

(1)

//报告大小(即这个字段的宽度)为1bit

0x95,0x08,//ReportCount(8)

//报告的个数为8,即总共有8个bits

0x81,0x02,//Input(Data,Variable,Absolute);Modifierbyte

//输入用,变量,值,绝对值

2.4普通按键程序设计

由于例程里是扫描按键,然后对按下的按键赋上对应的键值,可以实现按下按键,在TXT里得到对应的字母。

首先,任务的要求是模拟人工按键,在原USB键盘程序上进行修改,所以只需要向上位机发送我们想按下的按键键值的报告,并不用人亲自去按键,所以在这里用不到键盘扫描。

主要是明白报告描述符和报告。

接下来根据USBHIDtoPS/2ScanCodeTranslationTable去找到自己想要的键码,对应的十六进制,只用看HIDUsageID这一列。

例如,a对应的键值为0x04,b为0x05,0x03为没定义。

所以对应之前设计思路中的中间环节,即为普通按键环节。

cmd,回车,notepad空格a.txt,回车,回车,abcd1234,均为单个的按键。

于是有了下面定义的数组:

a[31]={0x00,0x00,0x00,0x00,0x03,0x0D,0x04,0x25,0x0E,0x0F,0x14,0x05,0x10,0x01,0x04,0x29,0x01,0x34,0x14,0x18,0x14,0x25,0x025,0x01,0x02,0x03,0x04,0x1B,0x1C,0x1D,0x1E};

需要解释的是,在实验的过程中,在反复的尝试后,发现前几个数组没办法执行,于是可以加入了几个空的定义将其放空,几个空的定义执行后再执行想要的功能。

另外,在程序里有这么一句:

buf[2]=0x03+a[myi],所以在上述的数组中就将其减了0x03,在本文后面附录的USBHIDtoPS/2ScanCodeTranslationTable中,可以简单地看成想要的那个键值往上数三个就是需要的键值。

附录会给出键值表图。

这里给出一些需要用到的键值。

表2.1

KeyName

HIDUsagePage

HIDUsageID

ErorrUndefined

07

03

aA

07

04

cC

07

06

dD

07

07

mM

07

10

nN

07

11

oO

07

12

pP

07

13

rR

07

15

tT

07

17

xX

07

1B

.>

07

37

Return

07

28

Space

07

39

所以设计要求中的依次输c,m,d,回车,空格都可以找到对应的键码,回车这类

不算是功能按键,也算是普通按键,一样可以找到对应的键码,附录会放上USBHIDtoPS/2ScanCodeTranslationTable,于是,一开始普通按键环节的程序设计如下。

voidHID_SetInReport()

{

uint8_t*buf;

Staticintmyi=0;

inta[31]={0x00,0x00,0x00,0x00,0x03,0x0D,0x04,0x25,0x0E,0x0F,0x14,0x05,0x10,0x01,0x04,0x29,0x01,0x34,0x14,0x18,0x14,0x25,0x025,0x01,0x02,0x03,0x04,0x1B,0x1C,0x1D,0x1E};

if(g_HID_sDevice.isReportReady)return;//checkifpreviousreportdone

buf=g_HID_sDevice.pu8Report;//updatenewreportdata

If(myi<31)

{

DrvSYS_Delay(250000);

buf[2]=0x03+a[myi];//output

myi++;

}

else

buf[2]=0x03;

这段程序可以看出,每次进来可以自动加一,并且按照自己定义的数组去给buf[2]一个值,所以可以将想要输出的字母顺序依次给数组里的每个元素。

这样会向上位机报告哪些按键被按下,于是可以实现普通按键的设计。

2.5特殊(功能)按键程序设计

这部分最难解决的是如何将两个键位同时按下,通过上面的分析,可以知道如何报告单个按键按下的情况给上位机,但是如何按下一个键不放,然后去按下另个键呢?

如果把win和R键的键值一起放到buf[2]里,可以肯定的是,这是不可能实现的。

在多次尝试未果之后,可以试着把win键的键值放入到buf[2]去试试,看能不能实现这个功能键,最后也可以发现这是不可能实现的。

于是通过查询大量的资料,以及一些网上参考的资料。

通过分析,有了如下的总结,这个报告中只有一个报告,所以没有报告ID,因此返回的都是实际使用的数据。

总共有8字节输入,1字节输出。

其中输入的第一字节用表示特殊按键,第二字节保留,后面的六字节为普通按键。

在附录中有图片,这里简单解释下,总结如下。

如果想只按下win键,则返回0800000000000000(十六进制),

如果想只按下r键,则返回0000150000000000,

如果想win+r按下,则返回0800150000000000,

如果想全部按键释放,则返回0000000000000000。

这些数据(即报告)都是通过中断端点返回的。

键一共有八个字节,即一起发送要发八个字节的数据,第1个字节是八个控制键,第2个字节是保留,第三至第八个字节为普通按键键值,没有固定位置,只需要往上填上HIDUsageTables上的键值,系统即会确认为该键按下。

而功能(特殊)按键实际上为键盘的八个控制键,包括:

左/右CTL,在/右ALT,在/右SHIFT,左/右WIN键盘。

一开始以为在USBHIDtoPS/2ScanCodeTranslationTable中的leftGUI的键值为0xE7,最后明白上述的原理,也查询了资料,最后结合查询的资料,总结出来的就是buf[0]能表示功能键,buf[1]保留字节,buf[2]到buf[7]为普通按键。

所以特殊按键的开始环节部分为

if(myi<5)

{

DrvSYS_Delay(250000);

buf[0]=0x08;//按下win键

buf[3]=0x15;//按下R键

myi++;

}

在程序的最后还有一次Ctrl+S的组合键来结束

if(myi<41)

{

DrvSYS_Delay(250000);

buf[0]=0x01;

buf[3]=0x16;

myi++;

}

3功能程序设计

在设计之前,首先明确了要做的事情,需要在一次数组的循环调用中,前几次先不执行。

因为在调试的过程中,可以发现,前几个数组根本没有按键,于是在上述的程序中,不要一开始就把cmd或者win+R这类一开始的按键立即执行,而是在中间多次让它没定义,从第五次开始执行win+R,而不是让它立即执行win+R。

所以通过看程序,inta[]里多次使用了0x00,这样,才能执行成功。

可以看到每次进入下一个if或elseif语句时,在数组其实已经预留了很多的0x00,并且一定要在每个if和elseif里加上延时,这点很重要。

3.1程序总流程图

此次程序设计首先明确普通按键和特殊按键的区别,组合键可以加入到报告里,但是在程序里,往下执行的时候必须清零,否则会一直按着组合键不放,最后导致后面的按键也不能执行,如下为程序设计总流程图。

需要解释的是,在程序的一开始,在myi<5的if()语句中,也加入了几个0x00去放空之后才能执行(上面也解释过了),循环调用几次之后执行了win+r,期间一直myi++,直到myi>5时进入到下一个elseif()语句中,开始执行之前自己定义的普通按键环节,不同的是加入了将buf[0],buf[3]清零的动作,不然程序会反复执行win+R,导致之后普通按键没办法执行,同样开头也做了放空。

直到myi>36时再次进入到下一个elseif()语句中,开始执行Ctrl+S进行保存,同样开头放空,最后myi>36进入到else()语句中buf[2]=0x03进行清零,否则会一直按着最后一个按键。

程序总流程图如下。

N

Y

myi++;

当myi>5时

Y

N

myi++;

当myi>36时

N

Y

myi++;

else

 

图3.1程序流程图

3.2开始程序的修改

由于在确认USB设备被识别后马上开始程序,每次开始都太突然,没办法看清每一次修改程序后的变化,于是可以在main.c里加入了一段。

按key1执行开始,这样会比较方便调试。

while

(1){

number=ScanKey();

if(number==1){

HID_MainProcess();

}

}

这里用到了键盘扫描,并且当key1按下时,开始执行HID_MainProcess。

 

 

4结论

在这次课程设计中,我学会了怎样去根据设计的要求去设计程序和调试程序。

动手能力得到很大的提高。

从中我发现自己并不能很好的熟练去使用我所学到的嵌入式知识。

在以后学习中我要加强对嵌入式的理解和解决问题的能力。

在这次完成设计的过程中,遇到最难的就是组合键的键值问题,为此我也纠结了很多天,查阅了很多USB的资料和很多协议,最后能在自己的能力下完成这份设计,也感觉比较开心。

也由于有例程,所以比较简单、定型,而不是真实的生产、科研任务,所以我基本上能有章可循,完成起来并不困难。

掌握了设计的步骤和方法,能比较明确自己的设计任务,了解程序和实施方法,这对今后从事技术工作无疑是个很好的训练。

通过这种综合训练,我们可以掌握嵌入式设计的基本方法,培养分析解决问题的实际本领,为以后毕业设计和从事嵌入式方向实际工作打下基础。

同时也让我充分认识到自己的空想与实践的差别,认识到自己的不足,在弄不懂组合键方法的几天中脾气和态度都不好,这是我的不足。

而扎实的基础是一切创造的源泉,只有从本质上理解了原理,才能更好的于疑途寻求柳暗花明,实现在科学界的美好畅游和寻得创造的快乐。

 

谢辞

本次设计

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1