Ubuntu 下USB抓包工具—usbmon

目录:/lib/modules/3.13.0-24-generic/kernel/drivers/usb/mon/usbmon.ko(ubuntu16.04)

使用方法:

sudo mount -t debugfs none /sys/kernel/debug 一般Linux已经默认挂上了

sudo modprobe usb_mon

于是在/sys/kernel/debug/usb目录下出现了devices和usbmon。
1、查看当前的usb device: sudo cat /sys/kernel/debug/usb/devices出现如下:

T:  Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=12   MxCh= 2
B:  Alloc= 17/900 us ( 2%), #Int=  1, #Iso=  0
D:  Ver= 1.10 Cls=09(hub  ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0001 Rev= 4.04
S:  Manufacturer=Linux 4.4.0-78-generic uhci_hcd
S:  Product=UHCI Host Controller
S:  SerialNumber=0000:02:00.0
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=  0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   2 Ivl=255ms

T:  Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=12   MxCh= 0
D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=0e0f ProdID=0003 Rev= 1.03
S:  Manufacturer=VMware
S:  Product=VMware Virtual USB Mouse
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=  0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=02 Driver=usbhid
E:  Ad=81(I) Atr=03(Int.) MxPS=   8 Ivl=1ms

2、监听全部bus上的USB数据包,cat /sys/kernel/debug/usb/usbmon/0u
监听Bus=2上的USB数据包,cat /sys/kernel/debug/usb/usbmon/2u
一旦有数据就打印出来如下:

f3e32840 3057696705 S Ci:2:003:0 s a3 00 0000 0007 0004 4 <
f3e32840 3057698865 C Ci:2:003:0 0 4 = 00010000
f584a900 3057699048 S Ii:2:003:1 -115:128 1 <
f584a900 3057700643 C Ii:2:003:1 -2:128 0
f40540c0 3057700673 S Co:2:003:0 s 00 03 0001 0000 0000 0
f40540c0 3057702725 C Co:2:003:0 0 0
f40540c0 3057702748 S Co:2:001:0 s 23 03 0002 0002 0000 0
f40540c0 3057703004 C Co:2:001:0 0 0
f53ca840 3058699594 S Ci:2:001:0 s a3 00 0000 0002 0004 4 <
f53ca840 3058699801 C Ci:2:001:0 0 4 = 07010000
f53ca840 3058700026 S Co:2:001:0 s 23 01 0002 0002 0000 0
f53ca840 3058700853 C Co:2:001:0 0 0
f3e32cc0 3058744460 S Ci:2:001:0 s a3 00 0000 0002 0004 4 <
f3e32cc0 3058744620 C Ci:2:001:0 0 4 = 03010400

3、usbmon 参数说明:

  1. urb标志,用来表示一个urb
  2. 时间戳
  3. 事件类型(S-submission, C-Callback, E-submission error)
  4. 端点类型I(中断),C(控制),B(Bulk)和Z(ISOC)
  5. 数据方向(i或者o)
  6. bus总线号
  7. 该bus总线分配到的设备地址[luther.gliethttp]
  8. 端点号,对于in端点,为异或^0x80,即去掉第8位1值的数据,比如0x81,那么这里数据为0x81 ^ 0x80 = 1;[luther.gliethttp]
    接下来的数据根据不同的端点类型将做不同的格式显示:
I(中断) : ep->status和ep->interval 显示端点的状态和端点interval中断间隔值[luther.gliethttp]
C(控制) : 如果事件类型为S,那么显示s bmRequestType bRequest wValue wIndex wLength
          如果事件类型非S,即C,那么只显示ep->status
B(Bulk) : ep->status 只显示状态
Z(ISOC) : 如果事件类型为S,那么显示ep->status, ep->interval, ep->start_frame
          如果事件类型非S,那么显示ep->status, ep->interval, ep->start_frame, ep->error_count
          同时显示ep->numdesc,dp->status, dp->offset, dp->length等信息,是组合最多的一个输出[luther.gliethttp]

接下来的数据就是ep->length长度了[luther.gliethttp].

再接下来就是mon_text_read_data填充数据了[luther.gliethttp].

  1. 如果数据长度ep->length为0,那么直接填入一个’\n’换行.
  2. 如果确实有数据部分,那么先追入’ =’,然后在=等号后面追加实际数据内容.
  3. 如果没有数据部分,比如那么将ep->data_flag作为char类型打印出来[luther.gliethttp]
    ep->data_flag共有5种数值,由mon_text_get_data()函数返回
    3.1 L – 表示期待数据长度为0
    3.2 < – 表示有数据要上传,后面有需要接收的数据,后面会有IN动作,
    表示in类型,后面还有In读取操作需要读取数据,
    同时为S-submission或者E-submission error
    3.3 > – 表示数据部分已经成功下发
    表示out类型,同时为C-Callback
    3.4 Z – 表示transfer_buffer为NULL
    3.5 0 – 表示成功获取data.
Logo

更多推荐