以USB鼠标为例使用BUSHOUND抓取HID设备报告描述符
普通的USB设备的设备描述符、配置描述符、字符串等常用的描述符可通过UsbTreeViewer来查看,但对于HID设备,其有一个特别的描述符,那就是报告描述符。
报告描述符定义了HID设备的功能和数据格式,相对于普通用USB其它标描述符,相对复杂些。
HID报告描述符报告给主机,一般发生在HID设备枚举时,详细的HID设备枚举过程可详见:Windows系统HID设备的启动过程
一般情况下,我们都是使用BUSHOUND来进行抓包:
我们可以在BUSHOUND中选中我们要抓取的HID设备,如本人电脑中的鼠标
我们可以通过插拔设备来让设备重新枚举,来抓取设备枚举过程中的信息,当然这里的枚举过程就有获取HID报告描述符。
但对于随整机封装的USB设备,我们无法进行插拔,这里可以通过USBTreeViewer自带的工具通过HUB的端点复位来达到复位设备,最终实现HID设备重新枚举。
注意,这里的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报告描述符的内容比较长,故会需要多个事务进行传输,所以需要读者自己组包。