用usbmon 来抓包.


author: hjjdebug

date: 2026年 04月 21日 星期二 15:27:31 CST

descrip: 用usbmon 来抓包.


文章目录

  • [1. 准备.](#1. 准备.)
    • [1.1 判断系统是否开启了debugfs](#1.1 判断系统是否开启了debugfs)
    • [1.2 安装usbmon 驱动](#1.2 安装usbmon 驱动)
  • [2. 俘获数据.](#2. 俘获数据.)
  • [3. 更高级的俘获.](#3. 更高级的俘获.)
    • [3.1 过渡. 用usbmon 俘获数据,让wireshark 来分析](#3.1 过渡. 用usbmon 俘获数据,让wireshark 来分析)

1. 准备.

1.1 判断系统是否开启了debugfs

$ mount |grep -i debugfs

debugfs on /sys/kernel/debug type debugfs (rw,relatime)

说明已经开启,

ubuntu 默认是开启的.

如果没有开启, 意味着你需要重新配置内核,开启debugfs选项

1.2 安装usbmon 驱动

$ sudo modprobe usbmon.ko

安装完成后, 用 $lsmod |grep usbmon 应能看到结果.

同时也会在 /sys/kernel/debug/usb 下创建usbmon 目录,

里面有若干个文件

2. 俘获数据.

$ sudo ls /sys/kernel/debug/usb/usbmon

0s 0u 1s 1t 1u 2s 2t 2u 3s 3t 3u

我的机器上是如上显示的. 1表示bus1, 2表示bus2,3表示bus3.

0表示所有的bus.

其中文件1s,1t,1u 的含义为:

1s, 对应setup 级别的事件

1t, 对应tranport 级别的事件

1u, 对应usb底层级别的事件

你可以进入该目录(需管理员权限),用cat 命令实时俘获数据.

如下示例:

鼠标为bus1 上的 device 3, 移动鼠标,得到如下输入,按ctrl-c 退出俘获

cpp 复制代码
root@hjj-laptop:/sys/kernel/debug/usb/usbmon# cat 1t
ffff8d159befe780 2096674020 C Ii:004:01 0 8 = 00000000 00000000
ffff8d159befe780 2096674135 S Ii:004:01 -115 8 <
ffff8d159befef00 2098508026 C Ii:003:01 0 4 = 00010100  //鼠标移动事件
ffff8d159befef00 2098508108 S Ii:003:01 -115 4 <
ffff8d159befef00 2098516020 C Ii:003:01 0 4 = 00030100
ffff8d159befef00 2098516080 S Ii:003:01 -115 4 <
ffff8d159befef00 2098524013 C Ii:003:01 0 4 = 00030100
ffff8d159befef00 2098524069 S Ii:003:01 -115 4 <
ffff8d159befef00 2098531920 C Ii:003:01 0 4 = 00020100
ffff8d159befef00 2098531969 S Ii:003:01 -115 4 <
ffff8d159befef00 2098539910 C Ii:003:01 0 4 = 00020100
ffff8d159befef00 2098539932 S Ii:003:01 -115 4 <
ffff8d159befef00 2098547995 C Ii:003:01 0 4 = 00040000
ffff8d159befef00 2098548025 S Ii:003:01 -115 4 <
ffff8d159befef00 2098555916 C Ii:003:01 0 4 = 00020000
ffff8d159befef00 2098555952 S Ii:003:01 -115 4 <
ffff8d159befef00 2098563942 C Ii:003:01 0 4 = 00020100
ffff8d159befef00 2098563970 S Ii:003:01 -115 4 <
ffff8d159befef00 2098571931 C Ii:003:01 0 4 = 0002ff00
ffff8d159befef00 2098571951 S Ii:003:01 -115 4 <
ffff8d159befef00 2098579929 C Ii:003:01 0 4 = 00040200
ffff8d159befef00 2098579949 S Ii:003:01 -115 4 <
ffff8d159befef00 2098587929 C Ii:003:01 0 4 = 00040000
ffff8d159befef00 2098587961 S Ii:003:01 -115 4 <
ffff8d159befef00 2098596001 C Ii:003:01 0 4 = 00020000
ffff8d159befef00 2098596039 S Ii:003:01 -115 4 <
ffff8d159befef00 2098603935 C Ii:003:01 0 4 = 00020000
ffff8d159befef00 2098603962 S Ii:003:01 -115 4 <
ffff8d159befef00 2098667996 C Ii:003:01 0 4 = 00020000
ffff8d159befef00 2098668024 S Ii:003:01 -115 4 <
ffff8d159befe780 2103930024 C Ii:004:01 0 8 = 01000000 00000000   //ctrl-c 按键
ffff8d159befe780 2103930138 S Ii:004:01 -115 8 <
ffff8d159befe780 2104234028 C Ii:004:01 0 8 = 01000600 00000000
ffff8d159befe780 2104234136 S Ii:004:01 -115 8 <

3. 更高级的俘获.

用wireshark 来监视鼠标事件, 图像化显示并带有文字解释.

如图示,

destination: 为X.Y.Z 格式, 总线.设备地址.端点号

协议: USB, usb 标准请求,

USBHUB, usb hub 的专有请求

看懂wireshark 中俘获的数据,就算usb总线协议入门了.

不过附图内核版本5.4,为iwireshark 版本v2.6,版本太旧,数据不完善就不分析包数据了.

而且以我的认知,高亮的这一条应该不存在最好, 这样后面请求的URB(submit) 和响应的URB(complete)正好一一对应,看着就比较顺了.

3.1 过渡. 用usbmon 俘获数据,让wireshark 来分析

用cat 1t 抓的是文本, text2pcap 转换得到的输出包是0个, 总之是实验没有成功.

环境是ubuntu18, 也许是环境的问题, 就不追究了.

如果用tcpdump -i usbmon1 -w /tmp/1.pcap. 再用wireshark 打开/tmp/1.pcap,

那和直接用wireshark 打开usbmon1 是一样的.

测试的环境是ubuntu18, 内核环境为5.4.0.150, wireshark 版本是v2.6.10

有点太老了, 数据抓包是被阉割过得, 只解析到URB 层,把链路层给阉割了,

看着不爽,难以学到真传.

还是等ubuntu26.04 出来, wireshark 版本也提高了, 到时再配上数据, 解析一下数据包,

希望那时的wireshark 抓包能真正解析到链路层.并且不丢弃数据.能够显示完整的数据.

只所以做这个笔记是因为毕竟usbmon 抓到了数据, 只是数据不完整,被舍弃了一部分. 所以期待后续的更新.

即期待usbmon (通过内核更新)的更新,也期待wireshark(图形化解释器)的更新