HID开发笔记
+ -

以USB鼠标为例使用BUSHOUND抓取HID设备报告描述符

2023-08-31 454 0

普通的USB设备的设备描述符配置描述符、字符串等常用的描述符可通过UsbTreeViewer来查看,但对于HID设备,其有一个特别的描述符,那就是报告描述符
报告描述符定义了HID设备的功能和数据格式,相对于普通用USB其它标描述符,相对复杂些。

HID报告描述符报告给主机,一般发生在HID设备枚举时,详细的HID设备枚举过程可详见:Windows系统HID设备的启动过程

一般情况下,我们都是使用BUSHOUND来进行抓包:
我们可以在BUSHOUND中选中我们要抓取的HID设备,如本人电脑中的鼠标
BUSHOUND中选中我们要抓取的HID设备
我们可以通过插拔设备来让设备重新枚举,来抓取设备枚举过程中的信息,当然这里的枚举过程就有获取HID报告描述符。
但对于随整机封装的USB设备,我们无法进行插拔,这里可以通过USBTreeViewer自带的工具通过HUB的端点复位来达到复位设备,最终实现HID设备重新枚举。

注意,这里的UsbTreeViewer必须通过管理员运行。

USBTreeViewer

这里既可以选择复位设备,也可以选择复位端口。

通过BUSHOUND可以抓取到的信息如下:

 53.0      CTL    80 06 00 01  00 00 12 00                                                                                
 53.0  18  IN     12 01 00 02  00 00 00 08  3a 09 10 25  00 01 01 02  00 01                                               
 53.0      CTL    80 06 00 02  00 00 09 00                                                                                
 53.0   9  IN     09 02 22 00  01 01 00 a0  32                                                                            
 53.0      CTL    80 06 00 02  00 00 22 00                                                                                
 53.0  34  IN     09 02 22 00  01 01 00 a0  32 09 04 00  00 01 03 01  02 00 09 21  11 01 00 01  22 2e 00 07  05 81 03 04  
                  00 0a                                                                                                   
 53.0      CTL    00 09 01 00  00 00 00 00                                                                                
 53.0      CTL    21 0a 00 00  00 00 00 00                                                                                
 53.0      CTL    81 06 00 22  00 00 6e 00                                                                                
 53.0  46  IN     05 01 09 02  a1 01 09 01  a1 00 05 09  19 01 29 03  15 00 25 01  95 08 75 01  81 02 05 01  09 30 09 31  
                  09 38 15 81  25 7f 75 08  95 03 81 06  c0 c0

可以看到:

81 06 00 22  00 00 6e 00

就是GET_DESCRIPTOR,其类型为HID的报告描述符,返回的数据就是HID鼠标的报告描述符。
我们可以通过本站自带的工具:USB标准请求及描述符在线分析 https://www.usbzh.com/tool/usb.html
分析内容如下:

0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
0x09, 0x02,        // Usage (Mouse)
0xA1, 0x01,        // Collection (Application)
0x09, 0x01,        //   Usage (Pointer)
0xA1, 0x00,        //   Collection (Physical)
0x05, 0x09,        //     Usage Page (Button)
0x19, 0x01,        //     Usage Minimum (0x01)
0x29, 0x03,        //     Usage Maximum (0x03)
0x15, 0x00,        //     Logical Minimum (0)
0x25, 0x01,        //     Logical Maximum (1)
0x95, 0x08,        //     Report Count (8)
0x75, 0x01,        //     Report Size (1)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
0x09, 0x30,        //     Usage (X)
0x09, 0x31,        //     Usage (Y)
0x09, 0x38,        //     Usage (Wheel)
0x15, 0x81,        //     Logical Minimum (-127)
0x25, 0x7F,        //     Logical Maximum (127)
0x75, 0x08,        //     Report Size (8)
0x95, 0x03,        //     Report Count (3)
0x81, 0x06,        //     Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
0xC0,              //   End Collection
0xC0,              // End Collection

// 46 bytes

当然,也可以通过本人写的离线工具HidReportParser工具进行分析,其下载地址为:https://www.usbzh.com/article/detail-1191.html

当然,抓取HID报告描述符的方法比较多样,本人这里只介绍一种最简单的方法。如果读者手中有USB总线分析仪,也可以使用它来抓取HID报告描述符。只不过一般情况下因为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 篇笔记 写笔记

USB音箱 工作抓包分析
USB音响打开Length Phase Data -------- ----- ------------------------------ -------------- CTL ......
UVC摄像头的关闭流程及抓包分析
通过UVC协议规范可以知道,UVC的数据传输支持USB四种传输中的批量传输和同步传输,所以对于UVC摄像头,当我们在摄像头正在工作时,需要停止摄像头工作,执行的操作是不同的。在Linux的源代码中,摄像头的流关闭是由函数uvc_video_stop_streaming完成的。代码比较简单,我们直接给......
ubuntu下使用usbmon进行usb抓包
开发或者调试USB设备相关的工具或者驱动,一个调试的利器就是usbmon抓包。 在ubuntu下使用步骤如下:1 运行命令 sudo mount -t debugfs none /sys/kernel/debug ,如果提示已经挂载,则下次抓包就可以不运行这个命令了。表示系统默认会挂载。 2 ......
华为UAC麦克风的工作过程数据分析
看完了耳机的数据分析,再来分析麦克风,就相对来说很简单了,这是因为:第一:麦克风没有音频控制特效单元描述符,所以少了很多特定类请求。第二:麦克风只有一个音频流转换接口,且只支持采样率为48000HZ 16位。具体的过程见下:Length Phase Data-------- --......
BusHound的使用方法详解
在开始菜单日运行Bus Hound软件,将USB设备插入电脑U口。如图所示,进入”Devices”目录,在”Devices”内选择要监听的设备。例如:我的设备置是一个U盘,则装置为USB大容量储存设备,点选”USB大容量储存设备”图示,可以在下面的”Properties”图框内看到设备的设备树及设备......
HID键盘设备数据抓包分析实践
本文使用 Bus Hound 工具对 USB HID 设备数据包进行分析,并结合官方手册及网上文章进行整理。在进行数据分析前,我们先回顾一下USB相关的基础知识。USB描述符USB 主机是通过各种描述符来识别设备的,有设备描述符,接口描述符,端点描述符,字符描述符,报告描述符(HID)等。和普通的......
USB复合HID设备报告描述符的区分
在USB规范中,设备的功能是通过接口来承载的,在USB规格书中就是接口描述符。对于一般的设备,一般一个接口就是一个功能,这个功能可以是鼠标,键盘或其它设备类型。当然这个只是对USB简易设备而言的,对于一些USB复杂设备如UVC摄像头,UAC音频等是多接口相互配合来实现其功能的,为了整合这么多接口使......
HID报告描述符详解
HID的报告描述符和其它描述符不一样,不是具有固定的数据结构,而是由固件开发商根据上报的数据自行组装的。这个组装的原材料是HID规范定义的ITEM。所以说HID报告描述符就像搭积木一样,其最终的数据结构和设计图纸是什么,都是由固件开发商决定的,但是其最终的产品又是由HID规范提供的各个标准积木模块搭......
Windows下使用Wireshark分析USB通信
USB技术的应用越来越广泛,我们常用的U盘、鼠标、键盘都是USB设备。我们有时也会遇见要对这种设备进行调试的情形,但是很少有人知道其实Wireshark也是可以胜任这一任务的。Wireshark可以像处理网络中的通信一样来捕获和解析USB设备的通信。Wireshark2.0之后就加入了对USB协议的......
UVC摄像头打开关闭数据分析
UVC相机在打开时,会使用SET_INTERFACE命令,在停止播放时,也会发送SET_INTERFACE命令。打开时,数据抓包为:CTL 01 0b 01 00 01 00 00 00 SET INTERFACE停播放时,数据抓包为:CTL 01 0b 00 00 01......
USB键盘报告描述符数据格式分析
USB键盘的HID报表描述符的内容参见下表。数据的输入端点为中断方式,当有键盘敲击事件时,会上报数据长度为8字节的数据报告。0x05,0x01,// Global Generic Desktop0x09,0x06,// Local KeyBoard 0xA1,0x01,// Main app col......
USB鼠标HID报告描述符数据格式分析
注意:这里的鼠标为普通鼠标报告描述符的信息解释,其并不适用于全鼠标报表描述符。一个示例如下:0x05,0x01, // Global Generic Desktop0x09,0x02, // Local Mouse0xa1,0x01, // Main app collection0x09,......
USB中文网出品-HID报告描述符分析工具
HidReportParser.exe工具已经网页化,可访问http://www.usbzh.com/tool/usb.html 在线分析USB-HID报告描述符USB HID规范中有一个很重要的概念,就是HID的报告描述符。本人搞了这么久的HID设备开发,其中一项最头疼的是HID报告描述符的......
为什么Windows7重新安装系统后插在USB3.0端口的鼠标不能使用?
在 Windows 7 及更早版本的操作系统中,USB 3.0 驱动程序堆栈由第三方提供,操作系统不提供USB3.0驱动栈。 因此,Windows7重新安装系统后插在USB3.0端口上的所有设备都无法工作,需要安装第三方提供的USB控制器和集线器驱动,这样才能识别出挂接在该USB总线下的设备。从Wi......
Linux源码分析UVC摄像头的打开流程及抓包分析
和关闭摄像头类似,Linux使用uvc_video_start_streaming函数打开摄像头int uvc_video_start_streaming(struct uvc_streaming *stream){ int ret; ret = uvc_video_clock_init......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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