嵌入式开发笔记:Wireshark USB抓包完全指南——从环境搭建到协议分析
嵌入式开发笔记:Wireshark USB抓包完全指南——从环境搭建到协议分析
文章目录
1. 前言:为什么要用Wireshark抓USB包
在嵌入式开发中,USB通信的调试一直是个让人头疼的问题。设备枚举失败、描述符解析异常、批量传输数据错乱……这些问题往往难以通过打印日志来定位,因为你根本不知道主机端到底发了什么、设备端又回了什么。
Wireshark + USBPcap 的组合,正是解决这些问题的利器。它让你像分析网络包一样,逐帧查看USB总线上的所有数据传输。
本文将从零开始,完整讲解如何在Windows环境下使用Wireshark进行USB抓包,涵盖环境搭建、设备定位、抓包操作、过滤分析全流程。

2. 环境搭建:安装Wireshark与USBPcap
2.1 下载Wireshark
访问Wireshark官网 https://www.wireshark.org/ 下载最新版本的安装包。
2.2 安装步骤(关键!)
安装过程中有几个必须注意的选项:
步骤1:运行安装程序,一路点击“Next”
步骤2:在组件选择页面,务必勾选“USBPcap” 。USBPcap是Windows下让Wireshark能够捕获USB流量的核心驱动。
步骤3:完成安装后,立即重启电脑。USBPcap驱动需要在系统启动时加载,不重启无法生效。
⚠️ 重要提示:如果在安装时忘记了勾选USBPcap,可以重新运行安装程序,选择“修改(Modify)”并补选该组件。
2.3 验证安装是否成功
验证方法一:打开命令提示符,进入USBPcap安装目录(通常在 C:\Program Files\USBPcap\),运行:
USBPcapCMD.exe
如果能看到类似以下的USB设备列表,说明USBPcap已正确安装:
Following filter control devices are available:
1 \\.\USBPcap1
\??\USB#ROOT_HUB30#...
[Port 3] GCAN USBCANFD Device
[Port 5] USB Serial Device
...
验证方法二:打开Wireshark,在主界面的捕获接口列表中应该能看到 USBPcap1、USBPcap2 等选项。
3. USBPcap的工作原理
在开始抓包之前,有必要先理解USBPcap的工作机制。
3.1 一个USBPcap对应一个Root Hub
USBPcap的每个接口(USBPcap1、USBPcap2…)对应电脑上的一个USB根集线器(Root Hub)。如果你的电脑有多个USB控制器(例如一个USB 2.0控制器和一个USB 3.0控制器),就会看到多个USBPcap接口。
这意味着:选择 USBPcap1 会捕获连接到该根集线器上的所有USB设备的流量。因此,抓包时通常会捕获大量无关数据,需要通过过滤器来筛选目标设备。
3.2 URB:USB通信的基本单元
Wireshark捕获的USB数据以 URB(USB Request Block,USB请求块) 的形式呈现。URB是USB设备驱动中用来描述与USB设备通信的基本数据结构,包含了执行USB传输所需要的所有信息——目标端点、传输方向、数据长度、实际数据等。
常见的URB类型包括:
- URB BULK OUT:主机发送给设备的数据
- URB BULK IN:设备发送给主机的数据
- URB SETUP:控制传输的设置阶段(如获取描述符)
4. 定位目标设备
抓包前最关键的一步:找到你要分析的设备在哪个USBPcap接口、端口号是多少。
4.1 方法一:使用USBPcapCMD.exe(推荐)
这是最直接的方法:
步骤1:打开命令提示符,进入USBPcap安装目录:
cd "C:\Program Files\USBPcap"
步骤2:运行USBPcapCMD:
USBPcapCMD.exe
步骤3:查看输出列表,找到你的目标设备:
Following filter control devices are available:
1 \\.\USBPcap1
\??\USB#ROOT_HUB30#4&29e0cecf&0&0#{...}
[Port 3] GCAN USBCANFD Device ← 目标设备在这里!
[Port 4] STMicroelectronics STLink dongle
[Port 5] USB 串行设备
[Port 7] UGREEN Wi-Fi 6 USB Adapter
从输出中可以确定:
- USBPcap接口:
USBPcap1(抓包时选择这个) - 端口号:
Port 3(后续过滤时使用)
4.2 方法二:使用USBView(获取Device Address)
USBView是Windows SDK自带的USB设备查看工具,可以显示设备的Device Address。
步骤1:下载并运行USBView(通常位于 C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\usbview.exe)
步骤2:在设备树中找到目标设备,查看其 “Device Address” 值(如 0x09)
步骤3:在Wireshark中使用过滤器 usb.device_address == 9
4.3 方法三:通过VID/PID定位
每个USB设备都有唯一的VID(供应商ID) 和PID(产品ID) ,可以通过设备管理器查看。
步骤1:打开设备管理器,找到目标设备 → 右键“属性” → “详细信息” → 在“属性”下拉菜单中选择“硬件ID”
步骤2:记录VID/PID值(如 VID_0483&PID_374B)
步骤3:在Wireshark中使用过滤器 usb.idVendor == 0x0483 && usb.idProduct == 0x374B
5. 开始抓包
5.1 选择正确的USBPcap接口
根据第4节中USBPcapCMD的输出结果,在Wireshark主界面中选择对应的USBPcap接口:
- 打开Wireshark
- 在 “捕获(Capture)” 接口列表中,双击对应的
USBPcapX接口 - 或者点击接口旁边的 “开始捕获(Start)” 按钮
💡 提示:如果不确定选哪个,可以先选
USBPcap1试试。如果抓不到目标设备的数据,再换USBPcap2。
5.2 执行操作触发数据
开始抓包后,对目标USB设备执行你想要分析的操作:
- 如果是USB转串口设备:打开串口、发送数据、接收数据
- 如果是USB鼠标/键盘:移动、点击
- 如果是U盘:读写文件
- 如果是自定义设备:执行对应的应用层操作
5.3 停止抓包
操作完成后,点击Wireshark工具栏的 红色方块(停止捕获) 按钮。
此时Wireshark会显示捕获到的所有USB数据包——可能包含成百上千个包,其中大部分与你关心的设备无关。
6. 过滤与分析
6.1 常用显示过滤器
(1)按设备地址过滤
usb.device_address == 5
其中 5 是目标设备的设备地址。
(2)按USB端口路径过滤
usb.src == "1.3" || usb.dst == "1.3"
其中 1 是USBPcap接口编号,3 是端口号。1.3 表示“连接到第1个根集线器第3端口的设备”。
(3)按VID/PID过滤
usb.idVendor == 0x0483 && usb.idProduct == 0x374B
适用于设备地址会变化(重新插拔)的场景。
(4)按传输类型过滤
usb.transfer_type == 0x03 # 批量传输(Bulk)
usb.transfer_type == 0x02 # 中断传输(Interrupt)
usb.transfer_type == 0x01 # 等时传输(Isochronous)
(5)按方向过滤
usb.endpoint_number.direction == 0 # OUT(主机→设备)
usb.endpoint_number.direction == 1 # IN(设备→主机)
(6)组合过滤
多个条件可以使用 && 和 || 组合:
usb.device_address == 5 && usb.transfer_type == 0x03
6.2 常用显示过滤器参考表
| 过滤目标 | 过滤器表达式 |
|---|---|
| 特定设备地址 | usb.device_address == 5 |
| 特定端口路径 | `usb.src == “1.3” |
| 特定VID/PID | usb.idVendor == 0x0483 |
| 批量传输(BULK) | usb.transfer_type == 0x03 |
| 中断传输(INT) | usb.transfer_type == 0x02 |
| 控制传输(CTRL) | usb.transfer_type == 0x00 |
| 主机→设备(OUT) | usb.endpoint_number.direction == 0 |
| 设备→主机(IN) | usb.endpoint_number.direction == 1 |
| 获取描述符请求 | _ws.col.info == "GET DESCRIPTOR Request DEVICE" |
| 组合过滤 | usb.device_address == 5 && usb.transfer_type == 0x03 |
6.3 如何解读USB数据包
应用过滤后,你会看到类似以下的数据包列表:
| 序号 | 时间 | 源 | 目的 | 协议 | 信息 |
|---|---|---|---|---|---|
| 1 | 0.000 | host | 2.3.0 | USB | GET DESCRIPTOR Request DEVICE |
| 2 | 0.001 | 2.3.0 | host | USB | GET DESCRIPTOR Response DEVICE |
| 3 | 0.005 | host | 2.3.0 | USB | SET_ADDRESS Request |
| 4 | 0.006 | 2.3.0 | host | USB | SET_ADDRESS Response |
| 5 | 0.010 | host | 2.5.0 | USB | URB_BULK OUT |
关键字段解读:
- 源/目的地址:如
2.3.0表示 USBPcap接口2 → 设备地址3 → 端点0 - host:表示数据来自/发往主机
- URB_BULK OUT:主机通过批量端点发送数据给设备
- URB_BULK IN:设备通过批量端点发送数据给主机
- GET DESCRIPTOR Request:主机正在请求设备描述符(枚举过程)
6.4 查看数据内容
点击具体的数据包,在下方的 “Packet Details” 面板中可以展开查看:
- USB URB → Data:查看传输的实际数据内容
- 右侧 “Packet Bytes” 面板显示十六进制和ASCII两种格式
7. 实战案例:抓取USB转串口数据
以抓取CH340 USB转串口设备的通信数据为例:
步骤1:运行 USBPcapCMD.exe,找到CH340设备所在的端口(如 Port 5)
步骤2:在Wireshark中选择对应的USBPcap接口开始抓包
步骤3:打开串口工具,连接到CH340对应的COM口,发送几帧数据(如 AT\r\n)
步骤4:停止抓包,应用过滤器 usb.src == "1.5" || usb.dst == "1.5"
步骤5:在数据包列表中寻找 URB_BULK OUT(主机发送的数据)和 URB_BULK IN(设备返回的数据)
步骤6:点击 URB_BULK OUT 包,在Data字段中应该能看到你发送的 AT\r\n 数据
8. 常见问题与排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| Wireshark中没有USBPcap接口 | 安装时未勾选USBPcap | 重新运行安装程序,选择“修改”补装 |
| USBPcapCMD无输出 | 驱动未正确安装 | 重启电脑后重试 |
| 抓不到目标设备的数据 | 选择了错误的USBPcap接口 | 用USBPcapCMD确认设备所在的Root Hub |
| 数据包太多难以分析 | 捕获了所有USB设备的数据 | 应用显示过滤器过滤目标设备 |
| 设备地址每次插拔都变 | USB设备地址是动态分配的 | 使用VID/PID过滤 |
| Linux下如何抓USB包 | 使用usbmon内核模块 | sudo modprobe usbmon,然后选择usbmon接口 |

9. 总结
| 步骤 | 关键操作 | 要点 |
|---|---|---|
| ① 安装 | 安装Wireshark + USBPcap | 务必勾选USBPcap,安装后重启 |
| ② 定位 | 运行USBPcapCMD | 确定目标设备所在的USBPcap接口和端口号 |
| ③ 抓包 | 选择USBPcap接口开始捕获 | 执行目标操作触发数据传输 |
| ④ 过滤 | 应用显示过滤器 | usb.device_address == X 或 usb.src == "X.Y" |
| ⑤ 分析 | 查看URB详情 | 关注 URB_BULK OUT/IN 和数据字段 |
Wireshark + USBPcap的组合,让USB协议分析变得像网络抓包一样直观。无论是调试USB设备枚举问题、分析自定义协议通信,还是逆向未知USB设备,这套工具都能成为你得心应手的利器。
掌握USB抓包技能,你就能从“盲猜”进阶到“眼见为实” ,让每一个USB通信问题都无所遁形。
📚 参考资料
- Wireshark官方文档:https://www.wireshark.org/
- USBPcap项目主页:https://desowin.org/usbpcap/
- Wireshark USB显示过滤器参考:https://wireshark.marwan.ma/
- USBView工具(Windows SDK)
更多推荐

所有评论(0)