HID开发笔记
+ -

BIOS下HID鼠标枚举实例及数据抓包分析

2022-03-07 1028 0

通过BIOS下识别USB键盘一节可以知道,一个鼠标想要在BIOS下使用,使用系统默认的报告描述符即主机不再主动获取报告描述符,并且这的一个前提条件是接口描述符的bInterfaceSubClass必须为1,表示HID设备符是一个启动设备(Boot Device)。

实际在使用时,发现有获取这个报告描述符,至于有没有用,这就不清楚了。

有了以上的基础内容之后,我们结合手中的一个USB鼠标,来进行实例分析。
分析的条件是:将目标机开机进行BISO模式,然后我们通过USB Packet Viewer工具来进行设备数据的枚举过程分析。

USB Packet Viewer:一款国产的USB总线分析仪,价格相对于同类产品,价格低的感人,功能确异常的强大。

手动通过USB Packet Viewer抓包过程如下:
BIOS下HID鼠标枚举实例

获取设备描述符

首先是获取设备描述符,其内容如下:
获取设备描述符

注意:这里只获取设备描述符18个字节的前8个字节

设备描述符指定了USB设备的基本信息,可以看到端点0的最大包长度为8字节。
设备描述符分析

分配设备地址

使用SET_ADDRESS进行设备地址分配,过程如下:
SET_ADDRESS

SET_ADDRESS的数据格式如下:
可以看到,设置地址为20。
设置地址为20

再次获取设备描述符

这次获取了完整的18字节设备描述符。
完整的18字节设备描述符
可以看到,这里为了获取这18个字节,使用了3个IN事务,前2个IN事务获取总共16字节的,最后的一个获取2字节。

完整的18字节设备描述符分析如下:
完整的18字节设备描述符

获取配置描述符

这次的请求长度为0x00ff,不过设备按实际的长度进行返回
获取配置描述符
配置描述符的分析如下:
配置描述符的分析

注意接口描述符的bInterfaceSubClass=1。

设备配置选择

使用SET_CONFIGURE标准请求实现
SET_CONFIGURE

SET_CONFIGURE的请求如下:
SET_CONFIGURE的请求

系统第一次获取配置描述符

这里只获取前9个字节。
只获取前9个字节
前9字节分析

系统第二次获取完整的配置描述符

这个和上面的使用0x00f长度的返回数据长度并无区别,只是请求的长度不一样,一个是按255,一个是根据第一次解析的实际总长度来获取
获取完整的配置描述符

获取完整的配置描述符分析如下
完整的配置描述符分析

获取字符串描述符

字符串描述符就是设备描述符和配置描述符中相关的字符串,不过得获取字符串的语言类别,这里一般为0x0409.
获取字符串描述符
字符串描述符这里就不分析了,比较简单。

又获取了一次完整的配置描述符

这???我编不下去了,你的系统你做主。。。。

SET_IDLE请求

SET_IDLE请求

格式如下:
SET_IDLE请求

获取报告描述符

不是说可以不取嘛,好吧,你说了算。
报告描述符分析如下:

HID报告描述符分析工具
USB中文网 http://www.usbzh.com

-----报告描述符--------------

05 01    //0       GLOBAL_USAGE_PAGE(Generic Desktop Controls)    
09 02    //2       LOCAL_USAGE(Mouse)    
A1 01    //4       MAIN_COLLECTION(Applicatior)    
09 01    //6       LOCAL_USAGE(Pointer)    
A1 00    //8       MAIN_COLLECTION(Physical)    
05 09    //10      GLOBAL_USAGE_PAGE(Button)    
19 01    //12      LOCAL_USAGE_MINIMUM(1)    
29 03    //14      LOCAL_USAGE_MAXIMUM(3)    
15 00    //16      GLOBAL_LOGICAL_MINIMUM(0)    
25 01    //18      GLOBAL_LOCAL_MAXIMUM(1)    
95 08    //20      GLOBAL_REPORT_COUNT(8)    
75 01    //22      GLOBAL_REPORT_SIZE(1)    
81 02    //24      MAIN_INPUT(data var absolute NoWrap linear PreferredState NoNullPosition NonVolatile )    Input 1.0
05 01    //26      GLOBAL_USAGE_PAGE(Generic Desktop Controls)    
09 30    //28      LOCAL_USAGE(X)    
09 31    //30      LOCAL_USAGE(Y)    
09 38    //32      LOCAL_USAGE(Wheel)    
15 81    //34      GLOBAL_LOGICAL_MINIMUM(-127)    
25 7F    //36      GLOBAL_LOCAL_MAXIMUM(127)    
75 08    //38      GLOBAL_REPORT_SIZE(8)    
95 03    //40      GLOBAL_REPORT_COUNT(3)    
81 06    //42      MAIN_INPUT(data var relative NoWrap linear PreferredState NoNullPosition NonVolatile )    Input 4.0
C0       //44      MAIN_COLLECTION_END    
C0       //45      MAIN_COLLECTION_END

获取HID鼠标数据

老样子,有数据返回数据,主机返回ACK,无数据时设备返回NAK.
获取HID鼠标数据

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

Windows下枚举系统中所有HID设备
Windows下对任何设备,文件的打开都是通过CreateFile来实现的,不过要打开一个设备得首先知道设备或文件名。由上节可知道,对于HID设备,都会注册一个接口类型为{2ACCFE60-C130-11D2-B082-00A0C91EFB8B}的GUID。我们可以通过Setup系列函数枚举出系统中......
HID 设置协议SetProtocol
SetProtocol用于设置ID设备的协议值。对于USB引导设备,该协议是必须对;对于非引导设备,是可选的。详见:USB请求bmRequestType(1):0x21bRequest(1): SetProtocol,值为0bwValue(2):数据为0表示引导协议,为1表示报告协议。wInd......
HID 设置报告请求SetReport
SetReport请求用于主机向设备发送报告请求。详见:USB请求bmRequestType(1):0x21bRequest(1): SET_REPORT,值为09.wValue(2):高字节报告类型,低字节为报告ID.01:表示输入报告02: 表示输出报告03: 表示特定报告wIndex......
HID 触摸屏的报表描述符
讲道理,这个触摸屏的报告描述符是我从网上搜索的一段代码,这个触摸屏的报告内容本人也进行了测试。测试是通过本站编写的虚拟触摸屏驱动实现的。0x05, 0x0d, // USAGE_PAGE (Digitizers) 0 0x......
HID 简介
 HID(Human Interface Device,人机接口设备)是USB设备中常用的设备类型,是直接与人交互的USB设备,例如键盘、鼠标与游戏杆等。在USB设备中,HID设备的成本较低。另外,HID设备并不一定要有人机交互功能,只要符合HID类别规范的设备都是HID设备。  Wndows操作系......
HID 体系结构
Windows 中的 HID 驱动程序堆栈的体系结构基于名为 hidclass.sys 的类驱动程序。 客户端和传输微型驱动程序从用户模式或内核模式下访问的类驱动程序。HID类驱动程序在系统提供的 HID 类驱动程序是 WDM 功能驱动程序和总线驱动程序 HID 设备安装程序类 (HIDClass)......
HID 报表描述符数字显示实例
USAGE_PAGE (Alphnumeric Display) 05 14USAGE (Alphanumeric Display) 09 01LOGICAL_MINIMUM (0) 15 00 CO......
HID键盘设备数据抓包分析实践
本文使用 Bus Hound 工具对 USB HID 设备数据包进行分析,并结合官方手册及网上文章进行整理。在进行数据分析前,我们先回顾一下USB相关的基础知识。USB描述符USB 主机是通过各种描述符来识别设备的,有设备描述符,接口描述符,端点描述符,字符描述符,报告描述符(HID)等。和普通的......
USB复合HID设备报告描述符的区分
在USB规范中,设备的功能是通过接口来承载的,在USB规格书中就是接口描述符。对于一般的设备,一般一个接口就是一个功能,这个功能可以是鼠标,键盘或其它设备类型。当然这个只是对USB简易设备而言的,对于一些USB复杂设备如UVC摄像头,UAC音频等是多接口相互配合来实现其功能的,为了整合这么多接口使......
HID 设备描述符关系
HID设备连接到USB主机后,主机通过发送Get_Descriptor请求读取HID设备的描述符,了解描述符对了解USB设备是至关重要的。HID设备的描述符HID设备除了支持USB设备的5种标准描述符之外,还支持HID设备特有的3种描述符。这些描述符是:USB标准描述符:设备描述符、配置描述符、......
HID描述符
HID描述符的主要作用是用来识别HID通信所使用的额外描述符。下表是HID描述符结构。偏移量字段字节数数值类型说明0bLength1Numeric描述符字节数1bDescriptorType1Constant0x21 = HID描述符2bcdH......
HID报告描述符详解
HID的报告描述符和其它描述符不一样,不是具有固定的数据结构,而是由固件开发商根据上报的数据自行组装的。这个组装的原材料是HID规范定义的ITEM。所以说HID报告描述符就像搭积木一样,其最终的数据结构和设计图纸是什么,都是由固件开发商决定的,但是其最终的产品又是由HID规范提供的各个标准积木模块搭......
HID 报表描述符远程控制实例
USAGE_PAGE (Consumer Devices) 05 0CUSAGE (Consumer Control) 09 01COLLECTION (Application) A1 01 ......
HID 报表描述符键盘实例
通过下面的报告描述符的定义,我们根据上面的注释可知,包含一个中断输入报表描述符和一个中断输出报告描述符。其中断输入报告描述符用于USB HID键盘中断输入端点,输出报表描述符用于USB HID键盘中断输出端点。USB HID键盘的中断输入报告对于中断输入端点,数据格式定义如下:BYTE0:该字......
USB通用父驱动usbccgp.sys的过滤UVC摄像头、UAC麦克风和HID设备硬件ID
激动的心情,无溢言表。。虽然只是一个很简单的东西。。但相于折腾了这么久,还是很开心的了。最近有个需求,功能是这样的:有一个USB复合设备,连接到windows系统中它在windows下的设备树如下:USB Composite Device(usbccgp.sys)UVC CameraUAC ......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!