原创--某款温湿度传感器的无线信号解密和伪造方法

查看 82|回复 9
作者:gmg2719   
由于帖子的图有些不清楚,在这里贴上我写的帖子的pdf原文

传感器.zip
(1.23 MB, 下载次数: 2)
2025-1-27 11:33 上传
点击文件名下载附件
下载积分: 吾爱币 -1 CB


根据经验,很大一部分传感器采用433MHz左右频率,采用URH找到433.92MHz收到信号,采用软件无线电USRP B210记录此信号。采用urh加载此信号,可以发现每隔一段时间会有一定的波形传输。打开此信号,可以看到,每隔大概56.96s左右,传感器会发送一组信号。


image.png (21.01 KB, 下载次数: 0)
下载附件
2025-1-26 19:59 上传

而且是周期性的信号,故而可以选择其中一组信号,进行仔细分析。 选择Create signal from selection。


image.png (38.63 KB, 下载次数: 0)
下载附件
2025-1-26 20:00 上传

选择有信号的部分,进行放大 zoom selection



image.png (64.97 KB, 下载次数: 0)
下载附件
2025-1-26 20:00 上传

采用鼠标滚轮进行进一步放到到如下,可以看到大概有离散的波形大概是500us的时间范围, 而且如下图可以看到两个相邻的正弦波形的相位和频率是一样的。 可以大概猜一下,如果500us有正弦波,则翻译为bit 1, 如果接下来500us是没有正弦波则翻译为bit 0. 也就是说1个symbol是500个采样点。 所以下面的一段信号就可以翻译为100


image.png (21.29 KB, 下载次数: 0)
下载附件
2025-1-26 20:00 上传



image.png (24.52 KB, 下载次数: 0)
下载附件
2025-1-26 20:00 上传

所以可以大概猜测一下,肯定不是FSK,也不是PSK,因为这两种都是会改变频率或者相位的,故而选择ASK, 然后点击Autodect parameters按钮. 我们可以看到urh采用ASK的解码之后,我们选择了下图所示的信号,可以看到URH也把100给高亮显示了,所以我们前面的猜测是符合理论。


image.png (45.3 KB, 下载次数: 0)
下载附件
2025-1-26 20:01 上传

可以看到如下的码流的十六进制表示方式:


image.png (114.81 KB, 下载次数: 0)
下载附件
2025-1-26 20:01 上传

码流如下:92484924921212121210842424921080424849242492490909090908421212490840212424921249248484848484210909248420109212490924924242424242108484924210084909248492492121212121084242492108042484924249249090909090842121249084021242492124924848484848421090924842010921249092492424242424210848492421008490924849249212121212108424249210804248492424924909090909084212124908  那是不是这就是数据帧的最小单位呢? 我们再把信号进行适当的缩放,可以得到如下类似的概览图,我们发现每组相对密集的信号中间,貌似有一个相对比较宽的无信号的间隙。 这个间隙意味着有较多的0. 我们大概区分了一下,有10组这样的信号。


image.png (31.49 KB, 下载次数: 0)
下载附件
2025-1-26 20:01 上传

可见常规的zero部分占用了2ms,约为4个symbol.  而较长的zero部分占用了4ms, 为8个symbol.


image.png (23.54 KB, 下载次数: 0)
下载附件
2025-1-26 20:02 上传




image.png (22.8 KB, 下载次数: 0)
下载附件
2025-1-26 20:02 上传

根据Pulse Modulation的规律,我们可以假设8个symbol的这个zero部分为Pause信号。 那么我们需要在urh的设置中设置,让urh认为8个symbol的zero,就是pause,不能作为正常是数据传输。所以下面需要设置7, 这是因为urh是取大于这个阈值的值作为pause分割的。


image.png (92.21 KB, 下载次数: 0)
下载附件
2025-1-26 20:02 上传

我们可以看到最新解码出的数据帧,更有规律了。


image.png (45.43 KB, 下载次数: 0)
下载附件
2025-1-26 20:03 上传

可以看到除了第一帧和最后一帧的数据长度相同, 第2到第8帧的数据长度是一样的。9248492492121212121084242492108 [Pause: 3993 samples]
84909248492492121212121084242492108 [Pause: 3993 samples]
84909248492492121212121084242492108 [Pause: 3993 samples]
84909248492492121212121084242492108 [Pause: 3993 samples]
84909248492492121212121084242492108 [Pause: 3993 samples]
84909248492492121212121084242492108 [Pause: 3993 samples]
84909248492492121212121084242492108 [Pause: 3993 samples]
84909248492492121212121084242492108 [Pause: 3992 samples]
84909248492492121212121084242492108 [Pause: 3995 samples]
849092484924921212121210842424921 [Pause: 5105644 samples]
但是这些数据是否是已经是最原始的数据呢?根据相关资料,查询得到这个传感器的数据格式大概是这样的:一共采用了9个半字节(4bit),构成:
[id0-4bit] [id1-4bit] [flags 4bit] [温度0] [温度1] [温度2] [保留字段] [湿度0] [湿度1
id字段: 传感器标识信息. 具体详细定义未知.
flags: 4个bit,标识电量或者其他工作状态信息,具体详细定义未知。
温度: 占用12位, 12位有符号数除以10是实际温度
保留字段: 永远为 1111 (0x0F)
湿度字段: 8 无符号数. 代表相对湿度百分比。
从这个定义来看,我们得到的信息还是太长了,说明这个bit信息是经过了信道编码的,也就是原始的bit流,为了抗干扰和信息传递可靠性的考虑,进行了信源编码。 经过相关的研究,此bit流采用了反向的摩尔斯编码手段。 所以我们应该先将bit进行Inverse, 再采用Morse code 进行decode.具体操作如下:  选择edit --》 decoding


image.png (20.35 KB, 下载次数: 0)
下载附件
2025-1-26 20:03 上传

分别拖动invert和Morse code到 Your decoding页面.


image.png (22.42 KB, 下载次数: 0)
下载附件
2025-1-26 20:03 上传

设置摩尔斯编码的配置如下,进行取反之后的信号, 其中代表以1个0开头紧跟最多2个1代表逻辑0,以0开头紧跟至少4个1代表逻辑1。


image.png (30.12 KB, 下载次数: 0)
下载附件
2025-1-26 20:04 上传

将此自定义的解码器另存一个名字,以备后面使用。


image.png (31.5 KB, 下载次数: 0)
下载附件
2025-1-26 20:25 上传

然后选择我们的信号源为 new-signal.


image.png (40 KB, 下载次数: 0)
下载附件
2025-1-26 20:25 上传

可以看到原始的输入bit和解码后的Bit 信息如下:


image.png (80.16 KB, 下载次数: 0)
下载附件
2025-1-26 20:25 上传

关闭decoding窗口,点击Analysis页面, 选择我们刚才自己设计的decoder.


image.png (66.7 KB, 下载次数: 0)
下载附件
2025-1-26 20:26 上传

我们可以看到经过解码之后的10个帧的数据,其中第一帧解码出了32个bit,8个半字节,第二到第9帧解码了36个bit,9个半字节(符合我们前面的数据结构定义), 第10帧只有35个bit,应该是部分数据丢失导致的。 其中第一帧也缺了4个bit,也不知道具体是什么原因,可能是采集时丢失了。 所以我们暂且认为所有数据帧都是36个bit, 之前缺失的部分是采集错误导致。


image.png (36.13 KB, 下载次数: 0)
下载附件
2025-1-26 20:26 上传

为了方便分析,我们采用如下菜单功能把原有的第1行和最后一行不完整的信息给隐藏。


image.png (74.83 KB, 下载次数: 0)
下载附件
2025-1-26 20:27 上传

然后进行信息字段定义:
[id0-4bit] [id1-4bit] [flags 4bit] [温度0] [温度1] [温度2] [保留字段] [湿度0] [湿度1
id字段: 传感器标识信息. 具体详细定义未知.
flags: 4个bit,标识电量或者其他工作状态信息,具体详细定义未知。
温度: 占用12位, 12位有符号数除以10是实际温度
保留字段: 永远为 1111 (0x0F)
湿度字段: 8 无符号数. 代表相对湿度百分比。  
选中对应的bit,右键createLabel来定义字段。


image.png (51.12 KB, 下载次数: 0)
下载附件
2025-1-26 20:27 上传

从如下定义可以看出,此时传感器给出了温度为17.0度,湿度为67%


image.png (45.07 KB, 下载次数: 0)
下载附件
2025-1-26 20:28 上传

既然我们现在完全解密了这款传感器的数据帧,那么下面就采用urh的信号发生功能来尝试伪造信号了, 选择Generator页面,拖动new-signal到右面的空白处,工具就会调出之前我们的分析结果。


image.png (29.44 KB, 下载次数: 0)
下载附件
2025-1-26 20:28 上传

根据前面的分析,我们认为第1和第10帧的数据有未知的丢失的,那么我们人为的给他补全一下,并且将温度和湿度都篡改一下,改为其他值如下是修改后的数据, 温度值和湿度值都做了手脚。


image.png (31.39 KB, 下载次数: 0)
下载附件
2025-1-26 20:29 上传

确保enforce encoding 采用的是我们之前的解码器,在进行encoding的时候,工具会自动进行反向编码。


image.png (35.06 KB, 下载次数: 0)
下载附件
2025-1-26 20:29 上传

可以点击如下按钮,工具就生成了可以供软件无线电硬件发送的信号文件了。


image.png (36.66 KB, 下载次数: 0)
下载附件
2025-1-26 20:29 上传

或者直接点击send data按钮,直接用USRP B210发射篡改后的信号,就可以成功干扰到传感器的数据了。 如下图所示,USRP 硬件正在周期性发送右图所示的篡改后的信号。


image.png (43.33 KB, 下载次数: 0)
下载附件
2025-1-26 20:30 上传

大功告成!

宋体, 下载次数

xss517   

软硬结合hack  比较酷
zx360717966   

技术贴,泰裤辣!
mavericklaw   

第一次了解到433的捕获,牛逼!
Mocun   

我天,高人啊,硬核知识
wow999   

超级牛掰!!没有一定知识,还真看不懂这篇文章
qi1990   

非常不错收藏了
txj66   

自己试试,看看效果如何
aib0   

伪造这个有啥意义呢?
icho   

楼主厉害,不明觉厉
您需要登录后才可以回帖 登录 | 立即注册

返回顶部