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(图形化解释器)的更新