使用 usbmon 抓取 usb 总线上的数据
usbmon 即 usb monitor,是 linux 内置的 usb 抓包工具。usbmon 本质是一个内核模块,在我的 ubuntu14.0 4中,模块的位置:/lib/modules/4.4.0-31-generic/kernel/drivers/usb/mon/usbmon.ko。
1、检测内核是否支持 debugfs 文件系统
linux 系统支持很多类型的文件系统,像 ext3、sysfs、ramfs、tmpfs等文件系统,首先检测内核是否支持 debugfs 文件系统。
2、挂载 debugfs 文件系统
执行 sudo mount -t debugfs none_debugs /sys/kernel/debug 命令,如果提示已经挂载,则下次抓包就无需运行该命令了,表示系统默认会挂载该文件系统。
如上图所示,我的 ubuntu 系统默认已经挂载了 debugfs 文件系统,无需再去手动挂载。
3、确认内核支持 usbmon 模块
如上图所示,目前内核不支持 usbmon 模块,需要手动安装 usbmon 模块。
4、安装 usbmon 模块
执行 modprobe usbmon 命令,可以看到系统成功安装了 usbmon 这个模块。
这里的原理是,usbmon是一个模块,使用 modprobe 安装该模块后,该模块内部调用 debugfs 相关的API,这样在 /sys/kernel/debug/usb 目录下便形成了 usbmon 这个目录。
查看 /sys/kernel/debug/usb/usbmon 目录,发现该目录下有以下内容:0s、0u、1s、1t、1u、2s、2t、2u,其中1代表 bus1,2代表 bus2,0代表所有 usb 总线。
5、监测 usb 总线上的数据
首先需要获取想要监测的设备所在的总线以及设备号。linux 中查看USB设备列表以及USB设备详细信息的两种方法:
方法1:执行 lsusb 命令
lsusb命令参数
-v:显示usb设备的详细信息
-t:以树状结构显示usb设备的层次
-s<总线:设备号>:仅显示指定的总线或设备号的设备
-d<厂商:产品>:仅显示指定厂商和产品编号的设备
方法2:cat /sys/kernel/debug/usb/devices
然后就可以根据上面的结果,查看 usb 总线上的数据。
cat /sys/kernel/debug/usb/usbmon/1u | grep "1:005" // 其中的1:005是根据第4步中确认的,分配给模块的设备号
执行该命令,就可以查看模块所挂载的usb总线上的数据传输。
关于该命令输出的数据所代表的含义,参考我的下一篇博文:详解 usbmon 抓取的 log 各字段的含义