LV02-01-天猫精灵IOT-07-SmartConfig-02-SmartConfig抓包分析
本文主要是天猫精灵IOT Smart config—— SmartConfig抓包分析相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows版本 | windows11 |
Ubuntu版本 | Ubuntu22.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
终端软件 | MobaXterm(Professional Edition v23.0 Build 5042 (license)) |
点击查看本文参考资料
分类 | 网址 | 说明 |
官方网站 | 阿里云 | 阿里云官网主页 |
阿里生活物联平台 | 生活物联网平台(飞燕平台)主页 | |
AliGenie | 天猫精灵开放平台AliGenie主页 | |
阿里物联网平台 | 阿里物联网平台主页 | |
Bluetooth 技术网站 | 蓝牙协议规范什么的可以来这里找 | |
Telink | Telink | Chips for a Smarter IoT (telink-semi.com) Telink中文官网 | |
开发手册 | AliOS Things开发指南 | AliOS Things开发指南,这里是最新版本,可以直接从官网找到 |
AliOS Things开发指南 | AliOS Things应用开发指南,这里应该是3.3版本的完整开发文档 | |
AliOS Things开发指南(3.0) | AliOS Things应用开发指南,这里应该是3.0版本的完整开发文档 | |
生活物联网平台开发文档 | 生活物联网平台(飞燕平台)开发文档 《设备端开发指南》 | |
Wi-Fi IoT品类定义与功能开发 | 天猫精灵IoT开放平台——Wi-Fi IoT品类定义与功能开发 | |
硬件平台 | mk3080 WiFi开发板 | WiFi开发板使用指南-阿里云开发者社区 |
esp8266开发板 | 一个教程:ESP8266-NodeMCU开发板详解-太极创客 (taichi-maker.com) | |
TLSR8258 Datasheet | Datasheet for Telink BLE + IEEE802.15.4 MultiStandard Wireless SoC TLSR8258 | |
参考资料 | AliOS Things 3.0 应用开发指南 | 这个只是一篇参考文章,里面是一些环境搭建相关的,可以参考 |
IP知识百科 - 华为 (huawei.com) | IP的一些相关知识点 |
点击查看相关文件下载
分类 | 网址 | 说明 |
蓝牙规范相关文档 | Core Specification 5.2 | 核心规格 5.2,该规范定义了创建可互操作的Bluetooth 设备所需的技术。 《Core_v5.2.pdf》 |
Mesh Model(v1.1) | 本Bluetooth 规范定义了模型(以及它们所需的状态和消息),这些模型用于在mesh 网络中的节点上执行基本功能,超出了Bluetooth Mesh 配置文件 规范中定义的基础模型。 本规范包括定义跨设备类型标准功能的通用模型,以及支持关键mesh 场景的模型,如照明控制、传感器、时间和场景。 《MshMDL_v1.1.pdf》 | |
Mesh Profile(v1.0.1) | 该Bluetooth 规范定义了基本要求,以实现可互操作的mesh 网络解决方案,用于Bluetooth 低能量无线技术。 《MshPRFv1.0.1.pdf》 | |
Mesh Device Properties | 本规范包含Bluetooth Mesh 配置文件 和Bluetooth Mesh 模型规范所要求的设备属性的定义。 但是跟之前的有些区别,我主要看的之前的版本:《MMeshDeviceProperties_v1.2.pdf》 | |
GATT Specification Supplement | GATT Specification Supplement | Bluetooth® Technology Website。 好像可以在线看:《GATT Specification Supplement》 | |
Assigned Numbers | GATT的一些类型定义可以在这里找。 | |
AliOS Things | alios-things/AliOS-Things | Gitee上的AliOSThings SDK源码仓库 |
alibaba/AliOS-Things | GitHub上的AliOSThings SDK源码仓库 | |
天猫精灵蓝牙Mesh协议栈 | alibaba-archive/genie-bt-mesh-stack | GitHub上的天猫精灵蓝牙Mesh协议栈源码仓库。 之前是在alibaba/genie-bt-mesh-stack这个仓库。 写笔记的时候最新提交为faf523618a6a2560090fc423222b9db80984bb7a |
蓝牙Mesh设备开发指南 | 阿里云生活服务平台开发手册——蓝牙设备开发一节中的内容 |
为了有一个更加清晰的认识,我们这一节抓包分析一下。
一、WiFi不配置密码
我们先看一下WiFi不带密码的话,配网过程是怎样的,因为路由器不设置WiFi密码的话,传输过程中的数据包都是明文传输,我们都是可以通过抓包软件抓取并看到内容的。
1. 路由器配置
我们进入路由器的配置页面(一个IP地址),一般路由器机身或者说明书上都有:
我们输入路由器的用户名和密码,就会进入路由器管理界面,我们打开无线设置:
我们配置路由器的信道为6,无线名称(SSID)为dlink,由于路由器比较老,所以只支持802.11g。不配置加密,所以passwd就没有,长度就是0。
2. OmniPeek设置
2.1 channel配置
我们这里只抓6信道就可以了,因为前面路由器已经配置了信道为6。
2.2 过滤器
我们要抓到自己需要的Smart Config报文,我们需要配置一下过滤器,怎么设置过滤器?我们要根据smart config报文的特点来抓。
首先,报文是手机发送到路由器的,所以我们需要我们查一下手机的mac地址。手机的mac地址在手机的设置里面应该都有。
然后我们知道手机发送的smart config报文数据是一个广播报文,它使用的是255.255.255.255广播地址,在下面,也会有mac广播地址,mac的广播地址为 FF:FF:FF:FF:FF:FF 。
smart config的数据报文是802.11的数据报文,所以过滤器的协议就可以选择802.11Data类型:
综上所述,过滤器参数如下所示:
然后我们使用这个过滤器,开始抓包即可。
3. 手机操作
首先,手机要接入WiFi,然后我们打开手机的天猫精灵,扫描我们物联网设备的配网二维码(产品管理 - 生活物联网平台 (aliyun.com)):
然后OmniPeek中应该就会抓到手机和路由器之间的smart config相关的包了:
像这种IP地址是255.255.255.255的包才是我们的smart config配网报文。
4. 数据包分析
我们准备一个表格来记录每次收到的数据:
4.1 起始帧:1314
我们前面知道配网过程中的WiFi报文起始帧的Length=0x4E0=1248,这也就意味着,我们起始帧的总长度为1248字节,我们上面抓到的包似乎没有长度为1248的,我们知道WiFi报文发出去的时候肯定是不可能只有起始帧的,还要经过其他的一些封装过程,会增加以下头部之类的。我们点开那个最长的1314的看一下:
我们会发现,报文里面有一个Application Layer,里面的数据长度刚好就是1248字节,所以这个就是我们的起始帧啦。在抓包过程中,数据包可能会抓到多次,数据包也可能没抓到,当不符合我们前面学习的规则的时候,就继续往后找就可以了。
4.2 数据帧:333
我们来看一下下面的这个长度为333的报文:
可以看到这个数据长度为267字节,十六进制就是0x10B,比对数据帧的Index取值,那么Index=0x100,Value = 0x10B-0x100 = B。
4.3 数据帧:465
可以看到这个数据长度为399字节,十六进制就是0x18F,比对数据帧的Index取值,那么Index=0x180,Value = 0x18F-0x180 = F。
4.4 数据帧:583
我们先看这个583的:
可以看到这个数据长度为517字节,十六进制就是0x205,比对数据帧的Index取值,那么Index=0x200,Value = 0x205-0x200 = 5。可以看到这个对应的SSID名字,我们的WiFi名称为dlink,刚好就是5.
4.5 数据帧:706
我们先看一下这个902数据包:
可以看到这个数据长度为836字节,十六进制就是0x344,比对数据帧的Index取值,0x344-0x280的值已经超出了一个字节长度。下一个应该是0x280附近的才对,这里直接0x344,说明他的Index应该是0x300。这就说明中间我们可能少抓了一个包,那么我们就继续往下翻,找找看:
可以看到这个数据长度为640字节,十六进制就是0x280,比对数据帧的Index取值,那么Index=0x280,Value = 0x280-0x280 = 0。可以看到这里表示的事Passwd Len字段,也就是密码的长度,我们得出为0,之前我们的路由器是不加密的,没有密码,所以这里也就对上了。
4.6 数据帧:902
可以看到这个数据长度为836字节,十六进制就是0x344,比对数据帧的Index取值,那么Index=0x300,Value = 0x344-0x300 = 44。
这里其实是有问题的,我们看一下这个44,十进制是68,这里的Token Len长度为68字节嘛?我们看后面的Token,实际规定是8字节,68显然,这里的68并非指Token Len,其实前面学习数据结构的时候有一张图,上面其实也是没有这个Token Len的,具体为什么,暂时我也不知道,后面再补充吧。貌似是因为这个Flag字段的值,没有找到Flag字段的值的含义,这里先这样吧。
这个68不是Token Len的话,它是啥?我们继续往后看,假设它是SSID,那么根据规则,这个值需要加上32,那么就是100,我们看一下ASCII码表,100就表示字母d,我们WiFi的首字母刚好就是d,所以是这样对应的:
4.7 数据帧:1038
再往下是这个581:
对应的Length=517,其实跟前面重复了,接下来是704,但是其实一看就知道它是不对的,因为上面我们的索引是往下发,越来越大的,这个比上面的902还小,肯定是有问题的:
可以看到,它的Length=640,跟前面还是重复了,接卸下来我们来看这个1038的:
以看到这个数据长度为972字节,十六进制就是0x3CC,比对数据帧的Index取值,那么Index=0x380,Value = 0x3CC-0x380 = 0x4C=76。我们把这个76加上32,得到了108,它对应ASCII码的小写字母l,所以有:
4.8 总结
前面分析到1038的包,我们大概就知道SSID是怎么得来的了。我们在寻找包的时候,由于索引是不断增大的,所以我们找的数据理论上也是不断增大才对,另外就是当索引达到0x480的时候会重新从0x100开始,这点需要注意,数据包其实都是有顺序的,我们抓的包可能有重复,也可能有丢包,我们发现异常的时候继续往后找就可以了。
需要注意的是,这里我们的WiFi是没有密码的,所以我们可以看到所有信息,那加密过的呢?我快慢看不到怎么办?我们后面就来尝试抓一下加密的WiFi在smart config配网过程中的包吧。
二、WiFi配置密码
1. 路由器设置
还是和之前一样的配置方式,这里选择加密,并且配置好WiFi的密码。
2. OmniPeek设置
channel和过滤器与上面的配置一样,然后开始抓包即可。
3. 手机操作
与上面操作流程一样。
4. 数据包分析
这一次抓到的报文,全部都是加密数据了,这里只有mac地址,IP地址都不见了。
这一次,我们其实什么有用的信息都看不到,那么怎么计算Length字段?我们根据前面的经验,我们的起始帧的Length长度为0x4E0,也就是1248。我们看前面呢么多的1334,我们猜测它是起始帧,我们用这个值减去1248,得到86,大概就可以得到前面一大堆的头部就是86字节,我们后面就直接计算差值来获取Length就可以啦。其实我们学过TCP/IP协议,WiFi协议的话,理论上来说,我们应该是可以根据每一层封装来计算头部长度的,但是,水平不到,这里直接减法,等于是拿着结果推起因,能理解这个过程就可以啦。
4.1 数据帧:362
我们找一个短一些的,这里有个362,我们用362减去86,得到276,十六进制就是0x114,我们对应Index1可以得到Value=0x114-0x100=0x14:
4.2 数据帧:485
我们用485减去86,得到276,十六进制就是0x18F,我们对应Index1可以得到Value=0x18F-0x180=0x0F:
4.3 数据帧:603
我们用603减去86,得到517,十六进制就是0x205,我们对应Index1可以得到Value=0x205-0x200=0x05:
4.4 数据帧:737
我们用737减去86,得到651,十六进制就是0x28B,我们对应Index1可以得到Value=0x28B-0x280=0x0B:
我们的密码不是12345678,这不才8个字节?怎么会是11?这是因为这里的WiFi密码是密文,是经过了8到6位格式转换的,后续我们还要对其进行解密才行。
4.5 数据帧:922
我们用922减去86,得到836,十六进制就是0x344,我们对应Index1可以得到Value=0x344-0x300=0x44,这个数字很熟悉,上面我们解析过的,它转换后就代表字母d:
4.6 数据帧:1058
我们用1058减去86,得到972,十六进制就是0x3CC,我们对应Index1可以得到Value=0x3CC-0x380=0x4C,这个数字很熟悉,上面我们解析过的,它转换后就代表字母l:
4.7 总结
按照上面的方式,我们就可以一步一步得到SSID和密码,具体怎么解析密码,后面代码会介绍。
我们来找个规律,我们看一下上面1058字节长度的这个包:
前面一堆的头,然后是802.11加密数据(Encrypted Data),这个加密数据长度为1020字节,1058-1020=38。
我们再计算一个长度为922的包:
这个加密数据长度为884字节,922-884=38。会发现都是38,我们用86减一下,可以得到86-38=48,这48字节其实就是加密数据的报文头。