Skip to content
Wireshark Wiki 中文翻译整理专题首页原始页面

USB 捕获设置

USB 抓包要先分清你要看的是“通过 USB 连接的网络接口上的 IP/Ethernet 流量”,还是“USB 总线上的原始 USB 交互”。前者像普通网卡一样抓;后者需要 USB 捕获能力,软件方式通常只能看到 URB(USB Request Block),硬件嗅探器才更接近总线上实际 USB packet。

适用场景:排查 USB 设备枚举、HID、USB 网络适配器、USB gadget、主机与设备之间的请求/响应。不要把 USB 网络接口抓包和 USB 总线抓包混淆;同一根 USB 线可能同时对应“网络接口流量”和“USB 总线流量”两个不同视角。

两种抓包对象

你要排查的问题应抓哪里看到的内容注意
USB 网卡、RNDIS、USB Ethernet gadget 的 IP 通信操作系统提供的 network deviceEthernet/IP/TCP 等网络包看不到 USB 总线层细节
鼠标、键盘、存储、HID 或设备枚举问题USB 捕获接口或 USBPcap 等工具USB URB 或 USB 传输记录软件抓包不是逐个原始 USB packet
黑盒主机与 USB 设备之间的交互MITM 硬件或硬件 USB sniffer中间设备转发或总线观测到的数据需要额外硬件,可能改变链路行为
精确观察总线上的 packet/transaction硬件 USB sniffer更接近物理总线上的原始 packet成本和速率支持受设备限制

USB bus 自身有额外开销;即使系统上只有 USB 网络适配器活跃,原始 USB 捕获量也会比对应的网络流量更多。如果还有其他 USB 设备,USB 捕获还会包含那些设备的收发活动。

软件 USB 捕获看到的是什么

软件 USB 捕获通常捕获 URB,而不是 USB 2.0 规范第 8 章意义上的单个原始 USB packet。URB 表示主机 USB stack 所看到的 transfer;它不等于线路上的每个 transaction。

这意味着:

  • 软件抓包适合看主机与设备之间提交了什么请求、返回了什么数据。
  • 如果问题发生在更底层的电气、packet、transaction 或总线时序层面,软件抓包可能不够。
  • 需要看到总线上真实 packet 时,应考虑硬件 USB sniffer。

平台差异概览

平台软件捕获方式权限/限制适合场景
Linuxusbmon,通过 libpcap/Wireshark 暴露为 usbmonX 或旧式 usbX需要 usbmon module;用户需可读 usbmon 设备通用 USB URB 捕获、USB gadget 调试
macOSXHC20 interface需将接口 up;Catalina 及以后原始页面提示可能需要禁用 SIP受系统版本限制的 USB 捕获
WindowsUSBPcap需安装驱动;历史上有过键鼠或总线识别问题Windows 主机上的 USB URB 捕获
黑盒主机MITM 或硬件 sniffer需要额外硬件无法在目标主机上安装抓包工具时

Linux

自 Wireshark 1.2.0、libpcap 1.0.0 和 Linux 2.6.11 起,可以通过 Linux usbmon interface 捕获 USB 流量。libpcap 1.1.0 及以后通常显示为 usbmonX,其中 X 是 USB bus number;Linux 2.6.22 及以后还提供 usbmon0,表示所有 USB bus 的组合事件流。libpcap 1.0.x 中设备名可能是 usbX

加载 usbmon

如果系统没有 /dev/usbmon*,且 /sys/kernel/debug/usb/usbmon 中也没有相关文件,可能需要加载 usbmon kernel module:

text
sudo modprobe usbmon

如果该模块必须手动加载,重启后可能需要再次执行。

对于 2.6.23 之前的 Linux kernel,原始页面还要求以 root 身份挂载 debugfs:

text
mount -t debugfs none /sys/kernel/debug

旧 kernel 的 usbmon 协议还会把每个原始 USB block 捕获的数据量限制在约 30 bytes。Linux 2.6.23 及以后配合 libpcap 1.1.0 及以后时,该限制被移除。

用户权限

先确认用户具备普通捕获权限,再确认该用户可以读取 usbmonX 设备。

一些发行版会通过 udev rules 让 /dev/usbmon* 属于 usbmon 组;另一些发行版可能复用 wireshark 组。处理思路是把运行 Wireshark 的用户加入对应组,重新登录后验证组成员关系。

也可以用 ACL 临时给当前用户读取权限:

text
sudo setfacl -m u:${USER}:r /dev/usbmon*

某些系统上,ACL 或设备权限可能在重启后失效,需要通过 udev 规则持久化。

Linux 上的简单 MITM 硬件

当 USB host 是无法安装抓包工具的黑盒设备,例如游戏主机,可以考虑简单 MITM 方案:

  • SerialUSB:用于拦截 USB HID traffic。原始页面提到它最初为 GIMX project 制作,需要 Linux computer 和基于 Arduino 的 USB dongle。
  • USBProxy:使用 Beaglebone Black 作为 USB gadget 中继设备,适用于更高速的非 HID USB traffic,但受 Beaglebone 硬件限制。

这类方案会引入中间设备,适合实验和受控环境,不应假定它完全透明。

macOS

自 Wireshark 2.4.0、libpcap 1.9.0 和 macOS High Sierra 起,原始页面说明可以使用 XHC20 interface 捕获 USB 流量。

捕获前需要把接口置为 up:

text
sudo ifconfig XHC20 up

原始页面还指出,在 macOS Catalina 及更高版本中,可能必须禁用 System Integrity Protection 才能捕获 USB 流量。禁用 SIP 会降低系统安全边界,应只在明确需要且可控的测试环境中考虑。

Windows

Windows 上可以使用 USBPcap 捕获原始 USB 流量。它是驱动级组件,安装和使用前应考虑对输入设备、USB 总线和系统稳定性的影响。

原始页面记录过 USBPcap 的早期问题,例如导致鼠标键盘不可用、Windows 7 重启后 USB bus 识别异常,以及 Windows 7/Server 2008 R2 上 SHA-2 code signing 支持相关事项。虽然这些问题后来应已解决,但在生产或唯一输入设备环境中仍应预留恢复手段。

还可以在 VirtualBox 中运行 Windows guest,并在 Linux host 上观察 USB bus。原始示例是 embedded Linux device 运行 g_ether(RNDIS ethernet gadget)连接到 Windows guest:Linux 仍能看到 USB device 所在 bus,VirtualBox 将设备挂接给 Windows,Linux 上 Wireshark 按 bus 捕获 USB 流量。

硬件 USB 捕获

硬件 USB sniffer 以 man-in-the-middle 方式连接目标 host 与 target device,用于观察 bus 上更接近原始的 packets。

典型连接方式:

  • target device cable 连接到 sniffer 的 USB A port。
  • 另一根 cable 从 sniffer 的 target device port 连接到 target host。
  • 第三根 cable 从 sniffer 的 host port 连接到 capture host。

建议 capture host 与 target host 分开,避免抓包工具本身干扰目标主机。

原始页面提到:目前还没有支持 Wireshark 的 USB 3.x capture hardware。

OpenVizsla

OpenVizsla 是 Open Hardware project,包含 32 MiB onboard SDRAM,适合 high-speed bus 上较高负载的捕获。通过 ovextcap 可让 OpenVizsla interface 出现在 Wireshark interface list 中。

Low-cost USB Sniffer

Low-cost USB Sniffer(LS/FS/HS)是不带 onboard RAM 的 USB 2.0 bus sniffer。通过 usb sniffer extcap 可让该接口出现在 Wireshark interface list 中。原理图以 KiCad format 提供,可手动组装。

排查建议

  1. 先确认目标是网络包还是 USB 总线交互。
  2. USB 网络接口问题,优先抓操作系统提供的 network device。
  3. USB 协议、枚举或 HID 问题,再抓 USB 捕获接口。
  4. Linux 上确认 usbmon module、设备权限和 bus number。
  5. Windows 上安装 USBPcap 前预留键鼠和系统恢复方案。
  6. 软件抓包无法解释底层 packet/transaction 问题时,再考虑硬件 sniffer。

相关页面

导入自 https://wiki.wireshark.org/CaptureSetup/USB ,时间为 2020-08-11 23:12:03 UTC

相关 Wireshark Wiki 页面

网络分析技术档案