本帖最后由 dffzh 于 2025-4-11 16:25 编辑
#技术资源# #申请原创#@21小跑堂
之前在我发的一篇帖子([size=1em]USB的HID协议怎么会这么复杂??,https://bbs.21ic.com/icview-3444392-1-1.html)里通过一个设备描述符协议简单说明了USB协议的复杂性;那到底怎么样对USB协议数据进行抓包和解析呢?今天就带大家一起,通过使用网络抓包常用的Wireshark工具对USB鼠标进行抓包,并执行简单的解析学习。
以下将从三个方面逐步进行,先搭建抓包环境,再设置抓包过滤条件,最后再解析几条USB报文。
一、安装Wireshark和USBPcap可以从官网https://www.wireshark.org/下载Wireshark的最新版本:
然后按以下步骤进行:
可以勾选一下安装桌面图标和快速启动图标:
指定安装路径,尽量不要放到带有中文字符的路径下面:
如果没有安装Npcap,这里勾选安装:
勾选安装USBPcap:
安装USBPcap:
安装路径保持和Wireshark的安装路径在同一个根目录下面:
以上软件安装完成后,立即重启电脑: 至此,软件安装完成。
二、确认安装环境重启电脑后,打开USBPcap的安装路径下的USBPcapCMD.exe并执行: 如果界面如下,即可以识别到电脑上已连接的USB设备,说明安装成功: 该界面会按USB类型将USB设备显示到不同的端口号里面。 再打开Wireshark的安装路径下的文件夹extcap,查看是否有USBPcapCMD.exe: 执行后,如果也成功,说明Wireshark软件里已经包含有USBPcap的插件了。 打开Wireshark,进入以下页面: 即可看到USBPcap的插件信息了。
在Wireshark主界面的输入捕获接口选项(网卡)里,也可以看到USBPcap: 在以下界面,也可以看到或者重新选择输入捕获接口:
三、USB鼠标抓包测试1、进入抓包操作
进入Wireshark的安装路径下的文件夹extcap,在该文件夹路径下鼠标右键打开“在终端中打开”命令窗口: 运行“.\USBPcapCMD.exe”命令后,可以查看当前已连接的USB设备属于哪个分支和端口: 在抓包和实际调试、测试时,如果发现USB设备异常了,可以执行一下,以确认USB设备是否和主机处于正常连接状态。
从以上命令执行接口可以看出,目前USB设备都挂载在USBPcap2上面,并且鼠标设备属于端口1的USB输入设备,USB串口属于端口4。 在Wireshark主界面里,在输入捕获接口选项里选择网卡USBPcap2并双击打开,可以看到正在通讯的USB协议数据包: 其中目的地址/或源地址2.12.0的数字结构含义如下: 2:PORT2 12:USB设备地址 0:端点地址
这里简单介绍一下URB: USB Request Block USB请求数据块 可变长度 是USB设备驱动中用来描述与USB设备通信所用的基本载体和核心数据结构; 是USB主机与设备之间传输数据的封装; 一个URB包含了执行USB传输所需要的所有信息; 进行数据传输时,需要分配一个URB结构体,并对其进行初始化,并将其提交给USB核心;
USB核心解析URB,将控制信息提交给主机控制器,由其负责数据到设备的传输。
2、设置抓包的过滤条件 有时候由于设备太多,报文太多,但我们只需要查看和分析指定USB设备的报文时,可以通过设置过滤过滤器的方式来拦截不需要显示的报文,常见的过滤条件包括: usb.device_address == x 按设备地址过滤,其中x表示设备地址的值 备注:过滤条件的输入框显示为绿色:过滤条件符合语法要求,红色:不符合; usb.bus_id == x 按总线ID过滤 usb.src == x.x.x 按源地址过滤 usb.dst == “x.x.x” 按目的地址过滤,一定要加英文双引号,否则会查不到报文 usb.endpoint_address == x 按端点地址过滤,其中x表示端点地址的值 usb_endpoint_address_direction == x 按报文的传输方向过滤 x=0,表示过滤掉主机到设备的报文
x=1,表示过滤掉报备到主机的报文 其他的过滤条件: 在过滤条件输入框里输入信息时,会显示所有子成员信息供选择: 另外,可以通过运算符“&&”来组合过滤条件: 比如过滤出设备地址为19,由主机到设备的报文:
3、抓包分析以我们常用的USB鼠标为例
开启wireshark抓包=>插入USB鼠标=>关闭wireshark抓包,经过以上操作后即可显示主机和鼠标的通信报文: 第1条报文(host->device, h2d,请求设备描述符) 主机向设备请求(Request)设备描述符信息(Device Descriptor) 设备描述符介绍: 设备描述符说明了USB设备的通用信息,提供了关于设备、设备的配置以及任何设备所归属的类的信息; USB设备只有一个设备描述符,并且是在设备连接时主机读取到的第一个描述符; 设备描述符所含的信息,被主机用来取得设备的额外内容。 如下: 主机向设备请求(Request)设备描述符信息(Device Descriptor) 设备描述符介绍: 设备描述符说明了USB设备的通用信息,提供了关于设备、设备的配置以及任何设备所归属的类的信息; USB设备只有一个设备描述符,并且是在设备连接时主机读取到的第一个描述符; 设备描述符所含的信息,被主机用来取得设备的额外内容。 主机请求设备的设备描述符的报文解析如下:
第2条报文(device->host, d2h,响应设备描述符) 设备响应(Response)主机的获取设备描述符信息(Device Descriptor)
设备响应主机请求的设备描述符的报文解析如下:
其中设备描述符的帧格式如下:
以下链接可以查阅上述各字段的详细说明:
https://blog.csdn.net/u012028275/article/details/109272115
第3条报文(host->device, h2d,请求配置描述符)
主机向设备请求(Request)配置描述符信息(Configuration Descriptor) 配置描述符介绍: 描述了USB配置,包含有关配置及其接口、备用配置等信息。 主机请求设备的配置描述符的报文解析如下: 与主机请求设备描述符的报文格式一致,都占36字节,数据内容有不同,区别在于: 1、 USB URB包的IRP ID(帧ID)字段数据不同; 2、 Setup Data包的bDescriptorType字段数据不同,为“CONFIGURATION(0x02)”.;
3、 Setup Data包的wLength字段数据不同,为9,表示请求的包数据长度为9个字节。
第4条报文(device->host, d2h,响应配置描述符) 设备响应(Response)主机的获取配置描述符信息(Configuration Descriptor) 设备响应主机请求的配置描述符的报文解析如下: 以上介绍了4种电脑(主机)和USB鼠标(从机)之间的通信协议数据包,其他的还有很多协议数据包,不一一介绍!
总之,如果要想深入理解类似于USB这种比较复杂的协议,还是需要自己实际动手操作,并逐个字节数据分析,才能真正理解和掌握!
|