BIOS下HID鼠标枚举实例及数据抓包分析
通过BIOS下识别USB键盘一节可以知道,一个鼠标想要在BIOS下使用,使用系统默认的报告描述符即主机不再主动获取报告描述符,并且这的一个前提条件是接口描述符的bInterfaceSubClass必须为1,表示HID设备符是一个启动设备(Boot Device)。
实际在使用时,发现有获取这个报告描述符,至于有没有用,这就不清楚了。
有了以上的基础内容之后,我们结合手中的一个USB鼠标,来进行实例分析。
分析的条件是:将目标机开机进行BISO模式,然后我们通过USB Packet Viewer工具来进行设备数据的枚举过程分析。
USB Packet Viewer:一款国产的USB总线分析仪,价格相对于同类产品,价格低的感人,功能确异常的强大。
手动通过USB Packet Viewer抓包过程如下:
获取设备描述符
首先是获取设备描述符,其内容如下:
注意:这里只获取设备描述符18个字节的前8个字节
设备描述符指定了USB设备的基本信息,可以看到端点0的最大包长度为8字节。
分配设备地址
使用SET_ADDRESS进行设备地址分配,过程如下:
SET_ADDRESS的数据格式如下:
可以看到,设置地址为20。
再次获取设备描述符
这次获取了完整的18字节设备描述符。
可以看到,这里为了获取这18个字节,使用了3个IN事务,前2个IN事务获取总共16字节的,最后的一个获取2字节。
完整的18字节设备描述符分析如下:
获取配置描述符
这次的请求长度为0x00ff,不过设备按实际的长度进行返回
配置描述符的分析如下:
注意接口描述符的bInterfaceSubClass=1。
设备配置选择
使用SET_CONFIGURE标准请求实现
SET_CONFIGURE的请求如下:
系统第一次获取配置描述符
这里只获取前9个字节。
系统第二次获取完整的配置描述符
这个和上面的使用0x00f长度的返回数据长度并无区别,只是请求的长度不一样,一个是按255,一个是根据第一次解析的实际总长度来获取
获取完整的配置描述符分析如下
获取字符串描述符
字符串描述符就是设备描述符和配置描述符中相关的字符串,不过得获取字符串的语言类别,这里一般为0x0409.
字符串描述符这里就不分析了,比较简单。
又获取了一次完整的配置描述符
这???我编不下去了,你的系统你做主。。。。
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.