可以调查 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 文件。
参考
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308623903.html