ZigBee抓包指南(Silicon Labs EM3585)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZigBee抓包指南(Silicon Labs EM3585)相关的知识,希望对你有一定的参考价值。

参考技术A

首先用USB线连接计算机和ISA3;然后用网线连接路由器和ISA3,并确保计算机和ISA3处于同一个局域网内;最后将ISA3的 Target Power 切换到 INT 位置,如下图1.2.1.1所示:

采用非官方Kit套件进行烧录与抓包时,对于Package Trace Port端的接线一定要注意线序引脚,具体如下图1.2.1.2、图1.2.1.3、图1.2.1.4、图1.2.1.5所示:

用USB线连接计算机和ISA3时,会自动安装J-link驱动,如下图1.2.2.1所示:

在安装Ember_Desktop_Installer_3.3b1937时,会提示需要安装1.5版本以上、32位的jdk;安装好Ember Desktop后,计算机桌面会出现这样一个图标,如下图1.2.2.2所示:

打开Ember Desktop,如果出现 “ No adapters found ” 提示,说明要修改ISA3的ip地址,使计算机、ISA3和路由器三者在同一局域网内;如下图1.2.2.3所示:

此时就需要确保ISA3和计算机的ip是在同一网段;按下快捷键 “ Win + R ” ,输入命令 “ em3xx_isa --admin "ip static 192.168.100.111 255.255.255.0 192.168.100.1" ” ,然后回车确认。如下图1.2.2.4所示:

随后输入命令 “ em3xx_isa --admin "ip dhcp off" ” ,然后回车确认。如下图1.2.2.5所示:

重新打开Ember Desktop软件,点击 “ File->Preferences->Device Manager->InSight Adapters ” 进入 “ InSight Adapters ” 界面,按如下图1.2.2.6所示进行配置:

点击确认后回到主界面,在左侧栏中已经显示出了已发现的ISA3设备(注意:此时并未发现并识别到EM3585芯片),如下图1.2.2.7所示:

在左侧对应的ISA3上单击右键,然后在出现的下拉菜单中点击 “ Connect ” ,如下图1.2.2.8所示:

此时已经成功识别到EM3585芯片啦,如下图1.2.2.9所示:

成功识别到芯片后,我们就可以进行接下来的固件烧录啦,在左侧对应的ISA3上单击右键,然后在出现的下拉菜单中点击 “ Upload application... ” ,如下图1.2.2.10所示:

来到 “ Select binary image ” 界面,此处可以选择固件来进行烧录,具体配置如下图1.2.2.11所示:
选择的第一个文件为设备相关固件,第二个文件为配套的启动固件。

弹出的信息如下所示,就表示烧录成功啦,如图1.2.2.12:

取得EM3585的抓包固件如下图2.1.1所示,按照上述方法烧录固件,之后就可以开始抓包啦。

右键点击ISA3,然后在出现的下拉菜单中点击 “ Adapter properties... ” ,如下图2.2.1所示:

弹窗如下图2.2.2所示,“ Radio application ” 处选择 “ Sniffer ”:

右键点击ISA3,然后在出现的下拉菜单中点击 “ Start capture ” 或 “ Start capture with options... ” 就可以开始抓包啦。“ Start capture with options... ” 可以在有多个协调器的环境中使用,设置PAN ID,监听指定PAN ID协调器的数据。如下图2.2.3、图2.2.4所示:

对于ZigBee无线抓包而言,是需要设置信道的;右键点击ISA3,然后在出现的下拉菜单中点击 “ Sniffer channel... ” ,如下图2.2.5所示:

在弹窗中,选择信道,如下图2.2.6所示:

执行设备入网操作,可在 “ Transactions ” 和 “ Events ” 窗口,看到所捕获的zigbee数据包,如下图2.2.7所示:

由于ZigBee的数据传输全都采用了AES加密,所以即使成功抓到了数据包,也不一定能成功解密出来;只有知道了秘钥才能解密出具体的数据包内容。简单来说就是 “抓包必须要从ZigBee设备入网开始抓起,这样才能获取秘钥,才能解密数据包”。如果要将数据包保存到本地文件中,也必须要保存秘钥,不然将抓包文件发给别人的时候,别人是无法解密的。
在Ember Desktop中,点击 “ File->Preferences->Network Analyzer->Decoding->Security Keys ” 进入“ Security Keys ” 界面勾选 “ Save decryption keys in ISD files ” 选项,为要保存的抓包文件添加解密秘钥,如下图2.3.1所示:

一旦添加了解密秘钥后,直接按照普通方式保存抓包文件即可;这样第三方便可随意查阅啦,如下图2.3.2所示:

用命令行修改ISA3参数配置的时候,如果出现 “ ‘em3xx_isa’不是内部或外部命令,也不是可运行的程序或批处理文件。 ” 这样的错误,如下图3.1.1所示:

解决方法:

用命令行修改ISA3参数配置的时候,如果出现 “ Error: Failed to connect to InSight Adapter ” 这样的错误,如下图3.1.2所示:

解决方法:

在用命令行修改参数配置的时候,如果出现 “ Error: expected “ip [static|dhcp|read]” ” 这样的错误,如下图3.1.3所示:

解决方法:

当连接好模组后,如果发现Node EUI为0xFFFFFFFFFFFFFFFF,如下图3.2.1所示:

解决方法:

Silicon Lab zigbee芯片HOST端程序移植

Silicon lab的EFR32MG系列芯片可以同时支持BLE,zigbee,thread等2.4GHZ的无线通信协议。但是网上关于这款芯片的资料却不多。前段时间将该芯片的zigbee功能移植到了openwrt系统上,现在将其中的一些需要注意的细节记录下来,方便自己查阅也方便跟大家一起讨论。

这里采用的是NCP(Network Coprocessor)即协处理器的模式,silicon lab的芯片作为一个独立工作的单独模块实现zigbee的功能,HOST端程序运行与主机上,通过串口或者SPI的方式来与芯片通信。主机和模块的通信被封装成EZSP的一个通信协议,用户可以通过HOST端操作从网络建立,设备加入,消息发送,安全设置等等功能,这些操作及参数指令被封装成特定的帧通过串口或者SPI发送给模块。NCP模块上的firmware通过silicon lab的开发sdk生成出来,注意选择好对应的芯片以及通信方式即可。这里需要注意的一点是不同的通信方式要选好对应的bootloader。 这里当使用串口通信的时候选择"UART XMODE Bootloader", 当使用SPI通信的时候选择"EZSP SPI Bootloader"。在模块的Applacation固件里要确认好相关的配置参数,如串口的默认针脚,波特率,流控方式等等。

HOST端的程序其实也是在SDK里生成出来的,但是该HOST程序只能在Linux下编译运行,在其他的操作系统下会编译出错。我们的任务就是排查出这些错误,然后让这个HOST端在openwrt系统下也能正确的编译运行。

首先第一步是在SDK下生成出HOST端程序,选择ZCL Application Framwork V2->EmberZNetPro GA HOST->Z3GateWay, 然后Generate出代码。下一步把整个V2.2文件夹拷贝到Linux虚拟机下,注意要拷贝整个文件目录,因为编译过程依赖这个文件夹下的目录树,破坏目录结构编译就会出错。这个文件夹看起来比较大,其实里面有很多不需要的东西,可以把蓝牙,thread的文件夹删除,然后zigbee文件夹下也有很多不需要的芯片配置表之类的东西,可以都删除掉,最后必要的源文件大概就几十MB大小。

第二步创建openwrt的package包。将V2.2的文件夹直接改名src,按照openwrt的ipk包的组织形式创建package包的目录结构。这时候HOST端的主Makefile文件是在src目录深处的,而且不能移动出来,否则破坏了相对目录结构。在src里的package主Makefile里引导到实际的HOST端Makefile上。

all:
        make -C app/builder/Z3GatewayHost

clean:
        make -C app/builder/Z3GatewayHost clean

  在package的Makefile里要添加依赖库“+libncurses +libreadline”。 app/builder/Z3GatewayHost下的Makefile不需要做太多改动,只要将链接语句里的$(LD)改成$(CC),这里与openwrt的编译方式有关,openwrt会将这里的CC替换成他的编译工具,比如ARM或者MIPS的编译工具。如果这里的LD没有被替换,结果就会在链接的时候使用X86平台的GCC链接器,导致链接错误。

如果编译的时候出现CSTOP和CSTART未定义的错误,去staging_dir目录下,找到使用的交叉编译工具链,然后在include/termios.h里加一句“#include<sys/ttydefaults.h>”。这个错误的原因是tty端口初始化的时候在Linux下有一个默认配置表,但是在openwrt下没有包含这个表,在端口初始化头文件“termios.h”里包含上这个表即可。

另一个需要改动的地方是在源代码里,在HOST端源码protocol/zigbee/app/ezsp-host/ezsp-host-io.c里,这是串口初始化的一段代码,这里找到这两句代码:

tcsetattr(*serialPortFdReturn, TCSAFLUSH, &tios);  // set EZSP serial port options
tcgetattr(*serialPortFdReturn, &checkTios);      // and read back the result

  在这两段代码前面加上一句"memset(checkTios.c_cc, _POSIX_VDISABLE, NCCS); " 这里是一个奇怪的问题,代码在设置TTY端口参数之后会读取设置后的参数,与原来要设置的参数对比,确认端口已经被正确的设置。但这里的一个问题是,用来读取设置后参数的结构体checkTios.c_cc,本身在声明之后未被清零处理。本来也没什么问题,因为在读取TTY端口参数的过程中会被填充上读取到的数值,但是这个结构体里有32BIT,从17开始后面都是保留位,读取过程中保留位不会被设置,所以若申明之后未清零,保留位上随机的数值可能会保留下来,下一步检查是否设置正确的时候就会出错。这里应该是源码里的一个小bug,在Linux下可能不会出错,但是移植到其他平台的时候这个错误就会显现出来。最简单的方法就是在检查之前先做清零处理。

最后编译出来的程序会包含一个Z3GateWay的ipk包,以及libreadline,libncureses,terminfo的ipk包,这三个包是依赖库,如果openwrt上原本没安装这三个库,那就需要先装上这三个库。安装上Z3GateWay的IPK之后,连接好模块的串口线,找到该目录下运行./Z3GateWay就可以运行zigbee HOST端的程序了。

SPI的设置跟这个大同小异,只有一些小地方需要修改一下,下回再接着写。

以上是关于ZigBee抓包指南(Silicon Labs EM3585)的主要内容,如果未能解决你的问题,请参考以下文章

物联网ZigBee3.0协议E18-2G4U04B模块无线数据抓包调试的方法

silicon labs 代理商

Silicon labs Gecko bootloader 升级用的GBL文件格式

基于E18-2G4U04B的ZigBee3.0无线数据抓包安装方法

Silicon Sandbox中的ASIC设计:构建混合信号集成电路的完整指南

BUUCTF做题Upload-Labs记录pass-01~pass-10