linux下的usb抓包方法

首先确保系统下安装usbmon

比如我们这里使用的是loongnix系统,root用户下
(1) yum install usbmon
之后按照提示安装就好。

(2)终端上执行

mount -t debugfs none_debugs /sys/kernel/debug

检查是否存在目录 /sys/kernel/debug/usb/usbmon

ls /sys/kernel/debug/usb/usbmon会现实如下内容

0s 0u 1s 1t 1u 2s 2t 2u 3s 3t 3u
这里需要注意1u 1t 是保存包的两种数据格式,1u 采用的是最新的数据格式,最好使用这个格式。而1/2/3这种数字代表的是对应的usb 总线号。

然后使用

cat /sys/kernel/debug/usb/devices 确定你要抓取usb设备所在总线号和设备号(主要看Product字段 是不是你要的设备)

#       选择包含有 : Vendor=148f ProdID=5370 Rev= 1.01 的段落
#       as follows:
#                T:  Bus=01Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=480  MxCh= 0
#                D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
#                P:  Vendor=148f ProdID=5370 Rev= 1.01
#                S:  Manufacturer=Ralink
#                S:  Product=802.11 n WLAN
#                S:  SerialNumber=1.0
#                C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=450mA
#                I:* If#= 0 Alt= 0 #EPs= 5 Cls=ff(vend.) Sub=ff Prot=ff Driver=rtusbSTA
#                E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
#                E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
#                E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
#                E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
#                E:  Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
#       可以从第一行看到 Bus= 01,设备号是2

确定好总线号之后,保存 usb raw packet ,如果总线号是1,则是1u,如果总线号是2,则是2u,依次类推。特殊情况是0u表示监听所有总线,我们这里要抓的设备是总线1

cat /sys/kernel/debug/usb/usbmon/1u > ./1.data

抓取到的usb包之后,我们就要分析这些数据:
下面是我们抓取的数据

9000000875b355c0 4082760017 S Ci:1:006:0 s 80 06 0100 0000 0012 18 <
9000000875b355c0 4082760099 C Ci:1:006:0 0 18 = 12010002 09000140 6b1d0701 00010302 0101
9000000875b355c0 4082760116 S Ci:1:006:0 s 80 06 0200 0000 0019 25 <
9000000875b355c0 4082760220 C Ci:1:006:0 0 25 = 09021900 010100e0 00090400 00010900 00000705 81030100 0c
9000000875b355c0 4082760230 S Ci:1:006:0 s 80 06 0301 0409 00ff 255 <
9000000875b355c0 4082760345 C Ci:1:006:0 0 18 = 12033000 30003000 30003000 30003000 3000
9000000875b355c0 4082760355 S Co:1:006:0 s 00 09 0001 0000 0000 0
9000000875b355c0 4082760469 C Co:1:006:0 0 0 
9000000875b34b40 4082760525 S Ci:1:006:0 s 80 00 0000 0000 0002 2 < 
9000000875b34b40 4082760594 C Ci:1:006:0 0 2 = 0100
9000000875b34b40 4082760607 S Co:1:006:0 s 23 03 0008 0001 0000 0
9000000875b34b40 4082760718 C Co:1:006:0 0 0 
9000000875b34b40 4082760726 S Co:1:006:0 s 23 03 0008 0002 0000 0
9000000875b34b40 4082760843 C Co:1:006:0 0 0 
9000000875b34b40 4082760851 S Co:1:006:0 s 23 03 0008 0003 0000 0
9000000875b34b40 4082760968 C Co:1:006:0 0 0 
9000000875b34b40 4082760975 S Co:1:006:0 s 23 03 0008 0004 0000 0
9000000875b34b40 4082761093 C Co:1:006:0 0 0 
9000000875b34b40 4082761100 S Co:1:006:0 s 23 03 0008 0005 0000 0
9000000875b34b40 4082761218 C Co:1:006:0 0 0 
9000000875b34b40 4082868017 S Ci:1:006:0 s a3 00 0000 0001 0004 4 < 
9000000875b34b40 4082868221 C Ci:1:006:0 0 4 = 00010000
9000000875b34b40 4082868232 S Ci:1:006:0 s a3 00 0000 0002 0004 4 < 
9000000875b34b40 4082868343 C Ci:1:006:0 0 4 = 00010000
9000000875b34b40 4082868351 S Ci:1:006:0 s a3 00 0000 0003 0004 4 < 
9000000875b34b40 4082868468 C Ci:1:006:0 0 4 = 00010000
9000000875b34b40 4082868475 S Ci:1:006:0 s a3 00 0000 0004 0004 4 < 
9000000875b34b40 4082868593 C Ci:1:006:0 0 4 = 00010000
9000000875b34b40 4082868601 S Ci:1:006:0 s a3 00 0000 0005 0004 4 < 
9000000875b34b40 4082868718 C Ci:1:006:0 0 4 = 00010000
9000000875b37e40 4082868726 S Ii:1:006:1 -115:2048 1 < 
9000000875b37e40 4082870926 C Ii:1:006:1 -2:2048 0
9000000875b355c0 4082870939 S Co:1:006:0 s 00 03 0001 0000 0000 0
9000000875b355c0 4082871092 C Co:1:006:0 0 0

上面的是我们抓取的数据,这些数据具体怎么分析,可以参考内核文档源码 Documentation/usb/usbmon.txt
基本说明了这些数据的内容表示什么。

下面我们简单的直接的介绍一下:

首先,按列用空格分割开:

第一列9000000875b355c0:表示内核中的一个urb 请求的数据的内存地址
第二列4082871092:表示时间
第三列S/C:S(submission)/C(callback),S表示控制器和设备之间的一个request请求,C表示对应这个请求后,往来的数据段。
第四列表示传输的类型和方向和地址字段:传输类型主要包含四种类型

Ci Co Control input and output
Zi Zo Isochronous input and output
Ii Io Interrupt input and output
Bi Bo Bulk input and output
这里输入和数据是相对于控制器而言的,设备给控制器发数据包,就是input,控制器给设备发数据包就是输出output。
地址字段,格式如下:Bus number:Device address:Endpoint number
我们这里Ci:1:006:0 表示一个控制传输,是设备给控制器发的,设备的地址是bus1 device 6 Endopint 0

第五列S/0 表示urb的状态字,有两种可能,一种是“字母”;一种是“数字”,如果是前者则一般就是字母“s”,表示一个控制传输,而如果是数字,他们的格式则分两种情况:

如果是中断传输,格式如下: URB status:interval,注意状态字段只对C类型的事件有意义,对S类型的事件没有意义。

如果是同步传输,格式如下:URB status:interval:{start frame}:{error count}
我们就以s 80 06 0100 0000 0012 18 < 为例,s 就是完成了一个控制传输的submission,后面书对应的数据内容。
控制请求的数据格式如下:
bmRequestType(请求类型):bRequest(请求号):wValue:wIndex(下标):wLength(数据字段的长度,如果为0,说明没有数据段)
根据usb spec 2.0 的详细介绍:
bmRequestType 一个字节,bRequest 一个字节,wValue/wIndex/wLength/各两个字节,下面是详细的介绍。
在这里插入图片描述

在这里插入图片描述
80 06 0100 0000 0012 根据上面的分析可知,bmRequestType 是80 表示设备给主控发的,bRequest 是06表示获取描述符,wValue是0100,注意这里wValue的值在不同的bRequest上是不同的,在获取描述符的请求上wValue的值表示描述符的类型和描述符的index,如下图所示。所以描述符类型就是01,index是00 而01 根据上面的图是获取device的描述符
在这里插入图片描述
wIndex的值是0000 wLength是0012 表述数据的长度是0x0012。18 是十进至的数据长度,而下面
9000000875b355c0 4082760099 C Ci:1:006:0 0 18 = 12010002 09000140 6b1d0701 00010302 0101中的18=后面就是实际的数据段。
这里是获取的device 的描述符,所以就要看device 描述符的格式如下:
在这里插入图片描述
在这里插入图片描述
根据上图可知,数据段的长度刚好是18个字节,和上面的数据刚好对上。具体表示什么这里就不做详细的介绍了。

这是一个控制传输的数据分析,那么其他的中断传输以及其他的想分析请参考协议,这里就不做详细的分析了。

这是使用usbmon抓取usb数据包,还可以使用tcpdump去抓。

tcpdump 抓取 USB 数据包

首先安装tcpdump
yum install tcpdump

安装之后:

步骤:
(1)mount -t debugfs none_debugs /sys/kernel/debug
(2)cat /sys/kernel/debug/usb/devices 确定usb的总线号和设备号,找到你想抓取的设备所在的总线号
如下所示,这个设备就是我想抓的,那么bus就是1 就要抓取usbmon1 的数据包

# cat /sys/kernel/debug/usb/devices 确定你要监视的usb设备所在总线号和设备号
               #       选择包含有 : Vendor=148f ProdID=5370 Rev= 1.01 的段落
               #       as follows:
               #                T:  Bus=01Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=480  MxCh= 0
               #                D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
               #                P:  Vendor=148f ProdID=5370 Rev= 1.01
               #                S:  Manufacturer=Ralink
               #                S:  Product=802.11 n WLAN
               #                S:  SerialNumber=1.0
               #                C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=450mA
               #                I:* If#= 0 Alt= 0 #EPs= 5 Cls=ff(vend.) Sub=ff Prot=ff Driver=rtusbSTA
               #                E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
               #                E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
               #                E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
               #                E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
              #                E:  Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
               #       可以从第一行看到 Bus= 01,设备号是2

(3)查看tcpdump 目前都可以抓取哪些设备,找到想要抓的设备
tcpdump -D
1.eth0
2.usbmon1 (USB bus number 1)
3.usbmon2 (USB bus number 2)
4.usbmon3 (USB bus number 3)
5.any (Pseudo-device that captures on all interfaces)
6.lo

(4)tcpdump -i usbmon1 -w /sblog.pcap &killall tcpdump
或者tcpdump -i usbmon1 会直接现实抓取的数据信息
如下图所示:
在这里插入图片描述

参考文档:
https://www.cnblogs.com/listenerln/p/7263481.html
W:\wm8880\android\ANDROID_3.4.5\trunk\Documentation\usb\usbmon.txt
http://omappedia.org/wiki/USB_Sniffing_with_tcpdump

Logo

更多推荐