如何转储 USB 流量?

use*_*710 13 linux debugging usb

我有一个 USB 游戏手柄,我想查看并检查该外围设备实际发送到我的 PC/内核的信号和命令:我该怎么做?

我假设像

cat /dev/bus/usb/006/003
Run Code Online (Sandbox Code Playgroud)

足够了,但显然这个命令会立即返回并打印一些不可读的编码字符。

有没有办法“调试”这样的 USB 设备?

Cos*_*ușă 15

您可以使用 Wireshark 捕获 USB 流量。
从它的维基

要在 Linux 上转储 USB 流量,您需要该usbmon模块,该模块自 Linux 2.6.11以来就已存在。/usr/src/linux/Documentation/usb/usbmon.txtLinux 源代码树中提供了有关该模块的信息。根据您使用的发行版和发行版的版本,该模块可能内置于内核中,也可能是可加载模块;如果它是可加载模块,则取决于您使用的发行版和该发行版的版本,它可能会或可能不会为您加载。如果它是一个可加载的模块,并且未加载,则必须使用以下命令加载它

modprobe usbmon
Run Code Online (Sandbox Code Playgroud)

必须以 root 身份运行。

1.0 之前的 libpcap 版本不包括 USB 支持,因此您至少需要libpcap 1.0.0

对于2.6.21 之前的内核版本,唯一可用的 USB 流量捕获机制是基于文本的机制,它将为每个原始 USB 块捕获的数据总量限制为大约 30 个字节。如果不修补内核,就无法改变这一点。如果 debugfs 尚未安装在 上/sys/kernel/debug,请通过以 root 身份发出以下命令来确保将其安装在那里:

mount -t debugfs / /sys/kernel/debug
Run Code Online (Sandbox Code Playgroud)

对于内核版本2.6.21 及更高版本,有一个二进制协议用于跟踪没有大小限制的 USB 数据包。对于该内核版本,您将需要 libpcap 1.1.0 或更新版本,因为 libpcap 1.0.x USB 支持使用但未正确处理 USB 流量的内存映射机制,如果可用,libpcap 将使用该机制 - 它不能不可用,因此 libpcap 将始终使用它。

在 libpcap 1.0.x 中,用于在 USB 上捕获的设备的名称为,其中n是总线编号。在 libpcap 1.1.0 及更高版本中,它们的名称为.usbnusbmonn

您还需要 Wireshark 1.2.x 或更新版本


小智 6

更新是因为这是我查找时发现的第一个结果。我在 Debian Stretch 上找到的最佳方法如下:

# usbhid-dump --entity=all

这将转储从所有 USB 设备传入的数据。像对待美食一样拿起我的键盘,我可以读取流中的每个操作码。

  • 顾名思义,usbhid-dump 仅适用于“HID”USB 设备,不适用于其他类型的 USB 设备。 (2认同)