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

linux下usb 抓包方法和数据分析相关推荐

  1. Linux下USB抓包工具UsbMon的使用和包数据格式解析

    Linux下USB抓包工具UsbMon的使用和包数据格式解析 一.UsbMon的使用步骤 1.挂载debugfs 2.加载usbmon模块 3.确认usbmon是否可用 4.确认usb设备挂在哪条总线 ...

  2. ubuntu下usb抓包方法步骤--usbmon

    开发或者调试USB设备相关的工具或者驱动,一个调试的利器就是usbmon抓包. 在ubuntu下使用步骤如下: 1 运行命令  sudo  mount -t debugfs none  /sys/ke ...

  3. linux下usb抓包:wireshark+usbmon

    wireshark:介绍和安装方式请自行搜索: usbmon:即usb monitor,是linux内置的usb抓包工具:本质是内核模块,以ubuntu 14.04为例,模块的位置:/lib/modu ...

  4. Ubuntu 下USB抓包工具—usbmon

    Ubuntu 下USB抓包工具-usbmon 目录:/lib/modules/3.13.0-24-generic/kernel/drivers/usb/mon/usbmon.ko(ubuntu16.0 ...

  5. linux抓包库libpcap,linux下libpcap抓包分析.doc

    linux下libpcap抓包分析 HYPERLINK "/Seiyagoo/archive/2012/04/28/2475618.html" linux下libpcap抓包分析 ...

  6. linux端口抓包工具下载,linux下的抓包工具tcpdump

    linux下的抓包工具. 抓包工具比较好用的有两个,一个是snort,一个是tcpdump,这次不说snort了,觉得这个工具虽然很强大,但是比较复杂,还是tcpdump比较简单.tcpdump wi ...

  7. 使用Ubuntu下usb抓包工具(usbmon)进行数据抓取的一次记录

    前言 使用反汇编还原的库调试打印机网络作业设置,打印出来的日志与原库有出入,在usb传输处始终有偏差. 调用反汇编还原的库: DEBUG: Net_OnlyGetDataSizeFromReplyHd ...

  8. linux下的usb抓包方法【转】

    转自:http://blog.chinaunix.net/uid-11848011-id-4508834.html 1.配置内核使能usb monitor: make menuconfig       ...

  9. linux下libpcap抓包分析

    一.首先下载libpcap包http://www.tcpdump.org/#latest-release 然后安装,安装完成后进入安装根目录的tests文件夹,编译运行findalldevstest. ...

最新文章

  1. MyEclipse安装Freemarker插件
  2. oracle 与 client端执行结果不一致_不同模式下Spark应用的执行过程
  3. centos 6.4 /var/log/secure 不记录日志的問題
  4. 城市规划理论1 选址理论
  5. 1.5 编程基础之循环控制 10 满足条件的数累加
  6. 【Druid IO】Instantiation of [simple type, class druid.indexing.kafka.supervisor.KafkaSupervisorTunin
  7. [Axis2与Eclipse整合开发Web Service系列之二] Top-Down方式,通过WSDL逆向生成服务端
  8. mysql优化笔记,MySQL优化笔记
  9. python自动qq群发_用Python自动办公,做职场高手
  10. python手机能学吗_学习大数据是否可以不学习Python?
  11. 乐优商城(15)--订单服务
  12. 网页设计html5留言板代码,网页制作:( 留言板 ), 我想改变留言字体的颜色( 单项选择:红/黄/蓝 )代码改如何编啊?, 十分感谢!...
  13. 文件夹批量重命名的方法
  14. div 和 img 标签引入图片制作背景的小问题
  15. sql中的类型转换---学习
  16. Python强化知识之获取网络资源 Urllib(一)
  17. 多组两两比较用什么检验方法_手把手教你多组独立样本的非参数检验及两两比较...
  18. 【Android】音乐播放器APP的设计与实现
  19. hash,hashcode,hashmap以及bucket怎么理解
  20. VGGNet网络详解与模型搭建

热门文章

  1. pycharm中路径被识别为转义字符解决办法
  2. STM32+SD卡的原理图绘制以及用32完成对SD卡的数据读取(fat文件模式)
  3. Parzen-Window Density Estimation(PWDE)
  4. 禁用华为后果有多大?英国:相当于重建通信系统
  5. 【调剂】西安微电子技术研究所2023年硕士研究生入学考试复试分数线及复试安排...
  6. 三招!解决消息队列的数据积压问题
  7. 无聊游戏随笔--学院篇
  8. unity对3dmax模型的兼容问题
  9. 还敢用智能手表吗?三星Gear Live会泄露用户数据
  10. 聊一聊系列之:面对秒杀