一、简介
抓包工具: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协议卷一的定义,网络数据包的格式依次为:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)