嵌入式开发笔记:Wireshark USB抓包完全指南——从环境搭建到协议分析

1. 前言:为什么要用Wireshark抓USB包

在嵌入式开发中,USB通信的调试一直是个让人头疼的问题。设备枚举失败、描述符解析异常、批量传输数据错乱……这些问题往往难以通过打印日志来定位,因为你根本不知道主机端到底发了什么、设备端又回了什么。

Wireshark + USBPcap 的组合,正是解决这些问题的利器。它让你像分析网络包一样,逐帧查看USB总线上的所有数据传输。

本文将从零开始,完整讲解如何在Windows环境下使用Wireshark进行USB抓包,涵盖环境搭建、设备定位、抓包操作、过滤分析全流程。

> **🖼️ 豆包配图提示词**:绘制一张Wireshark USB抓包架构图,左侧为“USB设备(鼠标/键盘/串口/CAN设备)”,中间为“USBPcap驱动(捕获层)”,右侧为“Wireshark(分析层)”,箭头标注数据流向:USB总线 → USBPcap → pcapng文件 → Wireshark显示,整体风格为清晰的软件架构图,分辨率1920x1080。

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接口:

  1. 打开Wireshark
  2. 在 “捕获(Capture)” 接口列表中,双击对应的 USBPcapX 接口
  3. 或者点击接口旁边的 “开始捕获(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/PIDusb.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数据包

应用过滤后,你会看到类似以下的数据包列表:

序号时间源目的协议信息
10.000host2.3.0USBGET DESCRIPTOR Request DEVICE
20.0012.3.0hostUSBGET DESCRIPTOR Response DEVICE
30.005host2.3.0USBSET_ADDRESS Request
40.0062.3.0hostUSBSET_ADDRESS Response
50.010host2.5.0USBURB_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)

更多推荐