使用wireshark抓包
环境要求
安装wireshark,并且安装usbpcap插件,安装wireshark的过程中会有提示,直接安装即可
抓包过程
不多说直接上图,勾选USBPcap1,点击开始即可
进入抓包界面,因为我使用的台式机,已经插入了USB键盘和鼠标,所以上来就有大量数据涌现。
所以我加了过滤条件用来过滤只属于U盘通信的数据包,过滤方法是,打开抓包之后,先看看目前鼠标和键盘的地址,只要移动鼠标或者击键就能看到数据包,插入U盘后,会出现新的数据包,这时记下U盘的地址便可以过滤了.
注意: USB设备接入之后,USB数据线电平会发生变化,usb主机会根据电平状态判断是否有设备接入以及设备的类型,主要是区分全速还是低速设备,并且通过地址0获取设备描述符,根据描述符得到设备最大控制传输的字节长度,一般主机会对设备进行复位,复位完成后给设备分配地址,并用新地址获取设备描述符.由于我这里无法用wireshark抓取到枚举过程的数据包,我们的usb数据包分析只能从分配完地址之后开始。
下面是过滤好的结果,如下所示:
我的U盘地址是4,这里wireshark source给出的地址是 1.4.0,这里面1是总线号,4是usb设备地址,0是端点号。
关于设备地址: usb最多挂载127个设备,就有127个地址
关于设备端点: 我的简单理解就是一个端点代表usb设备的一个基本功能,是与主机通信的基本单位,每个sub设备都必须有一个端点0,用于基本控制功能实现,所以也称为控制端点,其数据传输也可以是双向的,其他端点均为单向,所以我们分析的U盘设备,至少具备三个端点。
包解析
URB包解析
通过wireshark抓取的第一个U盘设备的包,如下所示
蓝色背景选中的内容,就是USB URB包了,那么什么是URB包,它有什么用呢?URB包全名USB REQUEST BLOCK,顾名思义可得这个是usb请求数据块,这是一个可变长度的数据块,用于描述一个请求的详细信息以及已完成请求的状态信息。这个数据包不是分析的重点,每个数据包的内容根据请求类型不同有些许差异,但是根据抓包软件的标注也都好理解。
下面开始具体字段解析:
- 长度:前两个字节描述了URB请求的长度,这里为0X001C,表示URB请求块长度为28字节
- IRP ID :主机host生成的一个可以称作帧ID的一段数据,数据长度为8个字节,这个数据usb设备收到之后需要记下来,响应请求块的时候还需要一模一样的返回给主机,确保数据不出现异常
- USBD_STATUS:描述请求块请求状态信息,0为成功,其他值可以参考usb.h中的定义
- URB Function:请求类型
- Irp information:一个字节,最低位表示方向,PDO一般是总线上的设备,FDO是主机功能驱动,0表示 主机到设备,1表示设备到主机
- BUSID: 总线ID,这里是1,两个字节
- 设备地址:两个字节
- ENDPOINT:第8位表示数据方向1 表示IN 0表示OUT,IN为主机接收数据;低四位表示断点号,这里为0,表示控制端点
- Transfer Type:传输类型;
USB共有四种传输类型 :中断传输 控制传输 大容量数据传输bulk 同步传输 - Packet Data Length: 共四个字节,表示本次传输的数据长度。
- control transfer stage:控制传输的阶段,这里是第一个控制传输的setup包,处于第一阶段;控制传输的事务包含setup stage,data stage,status stage
SETUP包结构解析
控制传输的setup包都是有8个字节的数据组成的,具体8个字节代表的含义,我们结合抓包的数据进行详细分析
大小 | 1byte | 1byte | 2byte | 2byte | 2byte |
---|---|---|---|---|---|
字段 | bRequestType | bRequest | wValue | wIndex | wLength |
含义 | 请求特性 | 请求类型 | 设置值(参数) | 一般表示端点或接口号 | 数据阶段的数据长度 |
对应的C语言结构体定义如下:
typedef struct _USB_SETUP_PACKET
{
REQUEST_TYPE bmRequestType;
BYTE bRequest;
WORD_BYTE wValue;
WORD_BYTE wIndex;
WORD wLength;
} USB_SETUP_PACKET;
- bmRequestType解析
- D7数据传输的方向
- 0:Host-to-device
- 1:Device-to-host
- D6D5:type
- D7数据传输的方向
–未完 待续–