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

2023-05-16

一、简介
  抓包工具: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(使用前将#替换为@)

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

  • 软件和与外部设备串行通信的波特率限制

    我使用 USB 端口作为虚拟 COM 端口运行 以使用 MATLAB 或 Visual Basic 6 实现与外部设备的串行通信 我面临波特率限制 具体取决于我用于与设备通信的软件 MATLAB 2018a 没有问题 因为它可以设置高波特率
  • 是否有可通过 USB 密钥在 Mac OS X 10.6 上运行的便携式 python 解释器?

    我一直在努力寻找一个可以通过工作计算机上的 USB 密钥运行的便携式解释器 Work comp 运行的是 Mac OS X 10 6 环境相当受限 无法访问终端 无法安装应用程序 但我知道便携式应用程序可以从 USB 驱动器运行 我一直在使
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • 如何识别“hw.machine”标识符可靠?

    我正在寻找最官方的来源来完成 维护此方法 NSString platformString NSString platform self platform if platform isEqualToString iPhone1 1 retur
  • Silverlight 能否访问可访问 USB 端口的 .Net 库?

    我们有一个 Net 库 可以通过 USB 端口访问一些自定义硬件 我读到 Silverlight 包含 Net 运行时的子集 所以 我的问题是 这个子集足以让 Net 库运行吗 不可以 您不能使用从 Silverlight 内部访问 USB
  • 如何获取 Windows 上的视频捕获设备(网络摄像头)列表? (C++)

    所以我们有一个简单的 C win32 控制台应用程序 我们想要的只是打印网络摄像头和其他可用视频捕获设备的列表 我们希望尽可能多地使用 Windows api 没有外部库 毕竟 我们想要的只是打印出一个列表 而不是飞到月球上 如何做这样的事
  • 我无法找到 libftdi 的 mpsse (SPI) 模式的示例代码

    这不是一个家庭作业问题 尽管这是一个工作问题 几个月前 我刚写完一份规范 老板就会把它外包出去 因为资金紧张 所以我正在尝试自己做这件事 我是一个很弱的 C 编码员 如果 gcc 能输出一些运行时不会出现段错误的东西 或者有时根本没有任何东
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • 适用于 Android 的 USB 主机

    I am trying to communicate with my freeduino board which is similar to arduino uno via usb through android device nexus
  • Android:如何以编程方式连接/断开 OTG

    我想在我的 Android 设备中以编程方式连接和断开 USB OTG 笔式驱动器 硬盘驱动器等 对于USB 我使用以下路径在连接到PC时绑定 取消绑定USB sys bus usb drivers usb bind or unbind 我
  • Android 版 usbmon

    我想分析我的设备的 USB 通信 SGS4 我到处都看到需要配置 usbmon 并将其编译到内核中 Afaik 这个模块没有内置在android linux系统中 我在编译内核方面没有太多经验 但如果有必要 我会这样做 您能说出这样做的步骤
  • Java 两个独立键盘的独立输入

    我有两个 USB 键盘插入同一台机器 我正在开发一个 Java 应用程序 是否有办法允许 Java 应用程序分离出它来自哪个 USB 键盘 即是否有类似的东西http docs oracle com javase 6 docs api ja
  • c#.NET USB设备持久标识符

    我正在寻找一种在 C 中为 USB 插槽 更具体地说是 SD 卡读卡器 提供持久标识符 在最终用户拔下集线器 重新启动计算机时 的方法 驱动器号并不总是分配给同一个插槽 但我需要一种方法来物理识别插槽 A 一旦我能够识别它 我就可以连接到驱
  • 尝试使用平板电脑下载时,我的 Android 应用程序出现设备不受支持的情况

    我在市场上有一个名为的 Android 应用程序D Bitly http bit ly mz6DIB我有一个平板电脑用户尝试下载它 但收到 设备不受支持 我仔细检查了市场设置 它说支持所有设备 我已经进行了快速谷歌搜索 但没有想到任何东西
  • 如何设置USB连接模式?

    我正在编写一个应用程序 该应用程序应该将数据转储到 SD 卡上 然后在 PC 上编写另一个应用程序 当设备连接到 PC 时 在光盘驱动器模式下 该应用程序应该读取数据 在我的 HTC Legend 上 有一个对话框可供选择 仅充电 HTC
  • LibUsb 声明接口访问被拒绝 Java

    我希望能够从 USB 计步器读取数据 我正在 Java 中尝试此操作 并且使用 LibUsb 和 Usb4Java 库 我似乎无法认领 USB 管道或类似的东西 我正在使用的代码 final Context context new Cont
  • 如何将 Android USB 连接模式更改为仅充电? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 在 Windows 上使用 Python 打开设备句柄

    我正在尝试使用 Giveio sys 驱动程序 该驱动程序需要先打开一个 文件 然后才能访问受保护的内存 我正在查看 WinAVR AVRdude 中的 C 示例 它使用以下语法 define DRIVERNAME giveio HANDL
  • 使用 BeagleBone Black 内核 >= 3.8 打开/关闭 USB 电源

    我需要 关闭 gt 睡眠几秒钟 gt 打开 beaglebone black 的 USB 电源 能够对连接到 USB 的设备 华为 E220 调制解调器 进行硬件重置 已经尝试过软重置 使用取消绑定 绑定和授权0 1 但软件重置不足以使设备
  • Android 两次请求 USB 许可

    我有一个运行 Android 4 0 4 的开发板 并将其用作 USB 配件 当我关闭板上的应用程序然后通过 USB 插入 Android 手机时 板会提示 连接此 USB 设备时打开 AppName 当我触摸 确定 时 应用程序启动并再次

随机推荐

  • 机器人框架

    ROS Rock Yarp Orocos
  • 列王的纷争-深度传感器已被巨头瓜分?

    origin http mt sohu com 20170325 n484729546 shtml 我们常常说苹果富可敌国 但是你这么说其实是在侮辱苹果 苹果可比美国政府有钱多了 根据最新消息 xff0c 美国政府账上的现金 xff0c 只
  • 不得不看!国内深度摄像头方案大起底

    origin http pieeco baijia baidu com article 517947 引言 xff1a 市场对深度视觉技术需求趋于井喷 xff0c 但可以提供产品和方案的公司寥寥无几 xff0c 本文分析了国内三家各具特点的
  • VR中的9轴传感器(重力加速度/陀螺仪/磁力计)

    origin http blog csdn net dabenxiong666 article details 53836503 前言 传感器的调试过程 xff0c 一般根据原厂提供demo代码 xff0c 调试数据接口 xff0c 将数据
  • STM32中AD采样的三种方法分析

    在进行STM32F中AD采样的学习中 xff0c 我们知道AD采样的方法有多种 xff0c 按照逻辑程序处理有三种方式 xff0c 一种是查询模式 xff0c 一种是中断处理模式 xff0c 一种是DMA模式 三种方法按照处理复杂方法DMA
  • 神经网络:比原来更容易学习了

    origin http geek csdn net news detail 195039 原文 xff1a NEURAL NETWORKS YOU VE GOT IT SO EASY 作者 xff1a Steven Dufresne 翻译
  • NuttX 编译系统

    origin http blog csdn net zhumaill article details 24400441 xff08 嵌入式 实时操作系统 rtos nuttx 7 1 makefile xff09 NuttX 编译系统 转载
  • NuttX 启动流程

    origin http blog csdn net zhumaill article details 23261543 xff08 嵌入式 实时操作系统 rtos nuttx 7 1 stm32 源代码分析 xff09 NuttX 启动流程
  • nuttx操作系统的移植以及下载

    origin http blog csdn net seawolfe article details 70244672 1 在ubuntu根目录下 xff1a root 64 ubuntu apt get update 更新包 2 root
  • 机器人峰会厂商

    origin http www chinarobtop com exhibition exhibition php 埃夫特 清能德创 芜湖瑞思 芜湖哈特 山东帅克机械 宁波慈兴轴承 A6 成都卡诺普 绿的谐波
  • 机器人公司

    1 螺趣科技 2 米兔机器人 3 360
  • 解:高性能MEMS IMU解决方案-ADXRS290

    origin https ezchina analog com message 34890 对于复杂且高动态惯性配置的MEMS IMU应用 xff0c 评估功能时需要考虑许多属性 在设计周期早期评估这些属性优于追逐开放性成果 xff0c 从
  • 关于DIY电池均衡器--被动均衡---蓄电池--电瓶车电池组电压均衡的经历

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 前言 随着电动车长时间的反复使用 xff0c 电池参数难免会发生变化 xff0c 当电池组中各节电池参数不一时 xff0c 便会出现充电时
  • CMakeLists.txt与Makefile 的区别

    我平时一般是在windows使用VS编程 xff0c 但是偶尔在网上查资料的时候也会下载一些别人的代码 xff0c 其中就经常对CMakeLists txt和Makefile文件产生疑惑 xff0c 下面我来分析一下这两个经常使用的地方 C
  • 链接提示 extern "C"

    在 C 43 43 中调用 C 代码时 xff0c 需要给编译器指定 xff23 代码要按照 xff23 语言的编译器编译 xff0c 否则编译器会将 xff23 代码按照默认的C 43 43 编译器来编译 xff23 代码 xff0c 这
  • C/C++实现你的浪漫表白:浪漫流星雨表白程序,

    想要讨女朋友欢心也巩固自己所学的知识 xff0c 各位小伙伴有自己的想法了吗 xff1f 准备好想要怎样实施了吗 xff1f 有什么美好的计划了吗 xff1f 如果没有的话那么别慌 xff0c 我知道 xff0c 在座的各位肯定都是有自己的
  • DDR4原理及硬件设计

    DDR4 DRAM的工作原理 其引脚按照功能可以分为7类 xff1a 前3类为电源 地 配置 后4类为 xff1a 控制信号 时钟信号 地址信号 数据信号 电源 地 配置信号的功能很简单 xff0c 在此不赘述 控制信号主要是用来完成DDR
  • RK3568最小系统四层板设计总结

    很久没有关注DDR4和DDR5相关知识了 xff0c 利用找工作在家休息间隙从网上下载了RK3568的原理图和6层板的PCB参考设计 xff0c 将6层板改为4层板设计 进行总结之前 xff0c 先将设计时关于Allegro设计小技巧进行总
  • 部门管理经验小结

    很久没有针对管理做总结了 xff0c 回武汉后一直做工程师 xff0c 现对管理知识体系进行总结 xff1a 部门管理按照如下框图1所示 图1
  • STM32驱动开发(二)--USB Device RNDIS虚拟网卡(usb hound抓包完整数据流分析)

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