Appearance
Appearance
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 device | Ethernet/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 捕获通常捕获 URB,而不是 USB 2.0 规范第 8 章意义上的单个原始 USB packet。URB 表示主机 USB stack 所看到的 transfer;它不等于线路上的每个 transaction。
这意味着:
| 平台 | 软件捕获方式 | 权限/限制 | 适合场景 |
|---|---|---|---|
| Linux | usbmon,通过 libpcap/Wireshark 暴露为 usbmonX 或旧式 usbX | 需要 usbmon module;用户需可读 usbmon 设备 | 通用 USB URB 捕获、USB gadget 调试 |
| macOS | XHC20 interface | 需将接口 up;Catalina 及以后原始页面提示可能需要禁用 SIP | 受系统版本限制的 USB 捕获 |
| Windows | USBPcap | 需安装驱动;历史上有过键鼠或总线识别问题 | Windows 主机上的 USB URB 捕获 |
| 黑盒主机 | MITM 或硬件 sniffer | 需要额外硬件 | 无法在目标主机上安装抓包工具时 |
自 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。
如果系统没有 /dev/usbmon*,且 /sys/kernel/debug/usb/usbmon 中也没有相关文件,可能需要加载 usbmon kernel module:
sudo modprobe usbmon如果该模块必须手动加载,重启后可能需要再次执行。
对于 2.6.23 之前的 Linux kernel,原始页面还要求以 root 身份挂载 debugfs:
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 临时给当前用户读取权限:
sudo setfacl -m u:${USER}:r /dev/usbmon*某些系统上,ACL 或设备权限可能在重启后失效,需要通过 udev 规则持久化。
当 USB host 是无法安装抓包工具的黑盒设备,例如游戏主机,可以考虑简单 MITM 方案:
这类方案会引入中间设备,适合实验和受控环境,不应假定它完全透明。
自 Wireshark 2.4.0、libpcap 1.9.0 和 macOS High Sierra 起,原始页面说明可以使用 XHC20 interface 捕获 USB 流量。
捕获前需要把接口置为 up:
sudo ifconfig XHC20 up原始页面还指出,在 macOS Catalina 及更高版本中,可能必须禁用 System Integrity Protection 才能捕获 USB 流量。禁用 SIP 会降低系统安全边界,应只在明确需要且可控的测试环境中考虑。
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 sniffer 以 man-in-the-middle 方式连接目标 host 与 target device,用于观察 bus 上更接近原始的 packets。
典型连接方式:
建议 capture host 与 target host 分开,避免抓包工具本身干扰目标主机。
原始页面提到:目前还没有支持 Wireshark 的 USB 3.x capture hardware。
OpenVizsla 是 Open Hardware project,包含 32 MiB onboard SDRAM,适合 high-speed bus 上较高负载的捕获。通过 ovextcap 可让 OpenVizsla interface 出现在 Wireshark interface list 中。
Low-cost USB Sniffer(LS/FS/HS)是不带 onboard RAM 的 USB 2.0 bus sniffer。通过 usb sniffer extcap 可让该接口出现在 Wireshark interface list 中。原理图以 KiCad format 提供,可手动组装。
导入自 https://wiki.wireshark.org/CaptureSetup/USB ,时间为 2020-08-11 23:12:03 UTC