可以调查 USB 总线上的通信的 USB 协议分析仪是一种昂贵的设备,即使它很便宜,也要花费超过 100,000 日元,所以我犹豫是否要介绍它用于爱好开发。

因此,我们将通过将 usb-proxy 与每个家庭中的 Raspberry Pi 4 Model B 相结合来创建一个简单的 USB 协议分析器。

结构体

在 USB Host 和 USB Device 之间连接树莓派,并使用名为 usb-proxy 的软件来中继 USB 数据包。
此外,通过使用 usbmon 模块捕获树莓派和 USB 设备之间的通信,它可以用作 USB 协议分析器。

粗略地说,它看起来像这样:

[USB Host]  <---> [usb-proxy on Raspberry Pi] <---> [USB Device] 
                                                ↑
                                 usbmon でここの通信をキャプチャする

你需要什么

  • 树莓派 4 B 型
  • USB 电源分配器

Raspberry Pi 需要能够使用总共 2 个端口,一个用于连接 USB 主机的 OTG 兼容 USB 端口和一个用于连接 USB 设备的 USB 端口。在撰写本文时,唯一满足此要求的 Raspberry Pi 是 Raspberry Pi 4 Model B。

USB Power Splitter是一款USB通讯线和电源线分离的适配器。
从 USB Host 给树莓派供电时不需要,但在从外部电源给树莓派供电时很有用,例如 USB Host 的电源不足时,或者当你需要将 USB 主机和 Raspberry Pi 之间的电源分开。您将需要。
我自己做了,但可以在 Amazon.co.jp 上购买现成的产品。布法罗 AC-DC5PSC2“ 被推荐。附带的AC适配器的额定电流是2A,有点不尽人意,但我认为足够了,因为它不会负载那么多。

此外,如果您连接的 USB 设备消耗大量电量,您可能需要准备一个自供电 USB 集线器。

程序

这次使用的环境如下。

  • 树莓派 4 B 型
  • 操作系统:树莓派操作系统精简版(64 位)
    • 发布日期:2022 年 4 月 4 日
    • Debian 版本:11(靶心)

1.设置使用OTG端口

配置加载驱动程序以使用 OTG 兼容端口。
如果您已经设置,请跳过此步骤。

echo "dtoverlay=dwc2" | sudo tee -a /boot/config.txt
echo "dwc2" | sudo tee -a /etc/modules
sudo reboot

2. 安装并加载 raw-gadget 模块

usb-proxy 是用于在用户空间中实现 USB Gadgets 的低级接口USB 原始小工具使用。
由于 Raspberry Pi OS 内核中禁用了 raw-gadget,请按如下方式编译和加载 raw-gadget 模块。

# 必要なパッケージのインストール
sudo apt install build-essential linux-headers git

# raw-gadget のソースコードの取得してコンパイルする
git clone https://github.com/xairy/raw-gadget.git
cd raw-gadget/raw-gadget
make

# raw-gadget モジュールの読み込み
sudo ./insmod.sh

罕见的D眼。医学博士上面说运行./update.sh如果需要的话可以获取最新的源代码,但是当我尝试的时候,由于接口的变化,我无法编译,所以我没有运行它。

3. 编译运行usb-proxy

# 必要なパッケージのインストール
sudo apt install libusb-1.0-0-dev libjsoncpp-dev

# usb-proxy のソースコードの取得してコンパイルする
git clone https://github.com/AristoChen/usb-proxy.git
cd usb-proxy
make

执行lsusb查看要中继的USB Device的Vendor ID和Product ID。

$ lsusb
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 0590:001a Omron Corp. ERROR Device Unconfigured
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

这次,我将捕捉欧姆龙制造的名为ME56PS2的PS2专用USB调制解调器的通信。
lsusb 的结果中,我们知道 Vendor ID 是 0590 , Product ID 是 001a
另外,请记下巴士号码,以备日后使用。

接下来,执行usb-proxy 来中继USB Host 和USB Device 之间的通信。
使用两个选项指定要中继的 USB 设备,--vendor_id--product_id。请指定在 lsusb 中找到的每个 ID。
您还需要指定 USB 主机连接到的 UDC(USB 设备控制器)。有两个选项 --device--driver 但对于 Raspberry Pi 4 Model B 都指定 fe980000.usb

sudo ./usb-proxy --device=fe980000.usb --driver=fe980000.usb \
                 --vendor_id=0590 --product_id=001a

3. 使用 usbmon 和 tcpdump 进行 USB 数据包捕获

首先,加载 usbmon 模块。

sudo modprobe usbmon

也可以直接从 usbmon 抓包,不过这次我们将使用 tcpdump。
安装 tcpdump 因为它默认没有安装。

sudo apt install tcpdump

使用tcpdump 命令捕获时,使用-i 选项指定要捕获的接口。由于lsusb 确认的 USB 总线编号为 1,因此将其指定为 -i usbmon1
-X 选项以十六进制和 ASCII 字符串显示捕获的数据包。当您想轻松检查通信内容时,这很有用。

$ sudo tcpdump -i usbmon1 -X
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on usbmon1, link-type USB_LINUX_MMAPPED (USB with padded Linux header), snapshot length 245824 bytes
19:50:09.327416 USB CONTROL SUBMIT to 1:4:0
19:50:09.329079 USB CONTROL COMPLETE from 1:4:0
        0x0000:  1201 1001 0000 0008 9005 1a00 0101 0102  ................
        0x0010:  0301                                     ..
(...中略...)
19:51:35.478765 USB BULK SUBMIT to 1:4:2
        0x0000:  2141 5453 3338 3d30 0d                   !ATS38=0.
19:51:35.478837 USB BULK COMPLETE from 1:4:2
19:51:35.478951 USB BULK COMPLETE from 1:4:2
        0x0000:  3100                                     1.
19:51:35.479029 USB BULK SUBMIT to 1:4:2
19:51:35.479282 USB BULK COMPLETE from 1:4:2
        0x0000:  3160                                     1`
19:51:35.479390 USB BULK SUBMIT to 1:4:2
19:51:35.520979 USB BULK COMPLETE from 1:4:2
        0x0000:  3160 0d0a 4f4b 0d0a                      1`..OK..
19:51:35.521087 USB BULK SUBMIT to 1:4:2
19:51:35.528675 USB BULK SUBMIT to 1:4:2
        0x0000:  3d41 5444 5430 3132 3334 3536 3738 390d  =ATDT0123456789.
19:51:35.528759 USB BULK COMPLETE from 1:4:2
19:51:35.528825 USB BULK COMPLETE from 1:4:2
        0x0000:  3100                                     1.

由于这次捕获了USB modem的通信,可以看到AT命令是如何执行的。

您还可以将使用-w 选项捕获的数据包保存为 pcap 格式。

$ sudo tcpdump -i usbmon1 -w usb.pcap
tcpdump: listening on usbmon1, link-type USB_LINUX_MMAPPED (USB with padded Linux header), snapshot length 245824 bytes
^C1327 packets captured
1327 packets received by filter
0 packets dropped by kernel

您还可以使用 Wireshark 检查保存的 pcap 文件。
ラズパイとusb-proxyを使ったUSBプロトコルアナライザ

参考


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308623903.html

相关文章: