当前位置: 首页 > news >正文

STM32驱动开发(二)--USB Device RNDIS虚拟网卡(usb hound抓包完整数据流分析)

一、简介
  抓包工具:usb hound,本例使用安卓手机作为device, 使用RNDIS功能连接电脑虚拟网卡。抓取完整数据流包按流程进行分析。数据流程熟悉之后,查看stm32或者其他厂家的USB库开发RNDIS设备代码也能懂大概。

二、USB标准请求相关概念
  USB接入时,电脑主机host会往控制端点0使用标准请求描述符。USB往端口0请求的过程都是控制传输。

下图截取自USB标准协议4.7.1章节。 

       每一次控制传输都有三个阶段:setup阶段,data阶段(无数据传输的只有两个阶段),status阶段,每个阶段又有三种包组成(token包, data包,handshake包)。下面的图展示的PID的类型,取自USB协议8.1。

     在抓包工具中只显示了数据包。还有对应的token包:CTL(setup),IN和OUT。

每个请求都是8个字节的标准。标准协议的内容截取自USB协议第九章。  

 

三、CDC类请求相关概念
  CDC类请求如下,图片源自CDC类协议第6章。

四、RNDIS协议消息相关概念
  内容来自上一篇文章中的RNDIS标准协议。 

 

整体的传输流程如下,
  (1)host先通过控制端点(0)发送SEND_ENCAPSULATED_COMMAND, 发送RNDIS消息;
  (2)device接受完消息后通过中断端点(notification端点)发送RESPONSE_AVAILABLE通知到host, 准备回复数据:
  (3)host在收到RESPONSE_AVAILABLE之后通过控制端点(0)发送GET_ENCAPSULATED_RESPONSE请求device回复RNDIS消息。

 五、USB标准请求流程分析
   下面开始讲述,可以看到从1-15次传输都是请求描述符(除去第4次传输是设置配置):

可以知道依次请求的描述符类型为:
   (1) wValue(00 01)设备描述符 ,请求wLength (12 00), 十八个字节(设备描述符的大小标准)。因此在数据阶段,device回复host自己的设备描述符(1.2)。

(2)(3) wValue(00 02)配置描述符,请求wLength (09 00), 9个字节(配置描述符的大小标准,会先读九个字节),再根据所读到的大小(79 00),一次读入所有配置描述符。

 4)(5)(6) 设置配置,wValue(00 01)这条配置对照协议我也不太清楚,跳过。

USB标准协议对此请求的解释是这样的: 

(7)-(12) 获取string描述符。  

 (13)-(15) 又重新获取了一次设备描述符和配置描述符。此时的配置描述符比第一次短,当前是(0x43),第一次是(0x79), 这一块我也不理解为什么。

六、CDC类请求流程分析(传输内容为RNDIS协议)

  根据上面第四章的描述,从(17)-(65)为CDC类标准请求中的SendEncapsulatedCommand。因此可以知道当host从描述符中识别到是RNDIS设备之后,直接发送SendEncapsulatedCommand请求进行封装的RNDIS协议交互。

(17) CTL 对应为SendEncapsulatedCommand请求,通知device需要发送(0x18个字节的数据), OUT 对应RNDIS协议的内容,MessageType为(02 00 00 00)

 因此是初始化消息REMOTE_NDIS_INITIALIZE_MSG ,共(0x18)24字节,协议格式为:

 

 (18) 在RNDIS中还有一个关键点就是host发送完消息之后需要用中断端点(通知端点)发送一条AVAILBALE通知host发送GetEncapsulatedResponse请求来获取device的消息回复内容。 

 (19) 根据上面第四章描述,CTL 对应为GET_ENCAPSULATED_RESPONSE请求
之后便开始回复REMOTE_NDIS_INITIALIZE_CMPLT(0x80000002)消息。

 (20)- (49) 对应的RNDIS消息是查询OID, OID的定义来源于微软定义的ndis.h头文件。

 20) 获取支持的OID列表, Message Type(0x04), Oid(0x010101 OID_GEN_SUPPORTED_LIST)

(21) 通知端点。

(22) 请求回复OID 列表。根据协议解析,回复的列表如下: 

 因此 (23)- (49) 是host请求device相关OID的信息,获取建立以太网必要的初始化数据。
因此 (50)- (66) 交替进行查询OID和设置OID的动作。
因此 (69) 上报NDIS初始化状态,

 七、以太网数据包交互

 因此 (70)-- (81) 为以太网数据包(对应IP类型为IPV6),至此已在USB基础上通过RNDIS协议,传输以太网数据包。

 根据TCP/IP协议卷一的定义,网络数据包的格式依次为:


http://www.taodudu.cc/news/show-6310438.html

相关文章:

  • 【physx/wasm】在physx中添加自定义接口并重新编译wasm
  • excel---常用操作
  • Lora训练Windows[笔记]
  • linux基础指令讲解(ls、pwd、cd、touch、mkdir)
  • InnoDB 事务处理机制
  • 启明云端ESP32 C3 模组WT32C3通过 MQTT 连接 AWS
  • Android上的RNDIS
  • USB RNDIS实现
  • Air780E模块RNDIS应用开发指南
  • 指南-安卓/Linux应用指南-RNDIS
  • Photoshop如何修改图片的颜色
  • 计算机网络实验以太网帧分析,实验二 用Ethereal捕获并分析以太网帧格式
  • 数据链路层的功能和以太网帧格式的总结
  • 计算机网络-MAC地址与以太网帧格式
  • 关于开车
  • 学会开车
  • 贴完车衣开车就走?
  • 程序员应该学开车
  • 新手开车九大恶习
  • 看完就能开车了
  • 开车的26条教训!开车的人一定看看!
  • 开车啦开车啦
  • 开车之始
  • 学开车起步停车口诀
  • 学开车
  • 开车上班
  • 老司机开车记
  • 一个人开车
  • 用d开车
  • 开车仪式
  • 老司机要开车啦!
  • 开车,开车!!!
  • 你为什么喜欢开车?
  • dmesg介绍
  • Linux--常用命令--dmesg
  • dmesg命令手册