导语:几个月前,我爸爸买了大量的RAEX 433MHz射频的电动百叶窗,在房间里安上并取代了我们家现有的手动窗帘。然而,被我玩坏了……
我最近针对许多不同的DIY家庭自动化设备进行了黑客攻击,主要目的是想将他们逆向然后集成到我的DIY homekit中去。几个月前,我爸爸买了大量的RAEX 433MHz射频的电动百叶窗,在房间里安上并取代了我们家现有的手动窗帘。
注意:这些百叶窗是与Spotlight以“ Motion Motorized Roller Blind” 的名义销售的相同型号
说实话,这个自动百叶窗对我来说简直是梦幻般的,因为它能够让我我懒惰的打开/关闭我的窗户,但是为了控制他们,我需要购买RAEX品牌遥控器。RAEX制造许多不同类型的遥控器,我选择使用的是其中的两种类型,如下所示:
在房子的每个房间里都有一个遥控器是不可行的,因为许多走道都无法使用这些遥控器,所以也就不要去浪费钱购买很多遥控器。相反,多个房间其实是可以被编程到同一个遥控器上的。不幸的是,也正是由于这一点,遥控器其实是存在高度争议的。
使用RAEX遥控器的另一种解决方案是使用一块称为RM Pro的硬件。它能够使得允许您通过智能手机使用他们的应用程序来控制遥控器。
不过这个应用程序运行起来非常缓慢,对我来说完全不适合家庭自动化生态系统。我想让我的窗帘可以通过Apple Homekit进行操作。
为了控制这些百叶窗,我知道我需要做以下两件事中的任意一件:
1、逆向RM Pro应用程序与RM Pro是如何进行通信的并在这里用上。
2、将RF协议逆向并用于与百叶窗通信的遥控器。
我首先尝试了第一件事一段时间,但排除了,因为我无法拦截用于在iPhone和集线器之间通信的流量。因此,我开始了对RF协议进行逆向的冒险之旅。
我在Ebay上购买了Arduino的433MHz发射器以及接收器。你可以选择在Ebay 上尝试搜索Arduino的433Mhz RF发射机接收器链路工具包。
初步研究
我在谷歌上查找RAEX正在使用的协议的技术规范,但毫无头绪:
1.我通过FCC或专利查找找不到协议的任何技术规范 2.通过电子邮件发送RM Pro获取技术规范; 他们听不懂我的英文 3.通过电子邮件发送RAEX获取技术规范; 他们不会在没有保密协议的情况下发布。 4.我确实发现RFXTRX能够通过BlindsT4模式控制百叶窗,这似乎也适用于Outlook Motion 百叶窗。 5.在打开其中一个遥控器并识别正在使用的微控制器后,我无法找到解释所使用的通用RF编码方案的任何文档。 6.它可能已经能够通过逆向I2C工程远程固件上的ROM芯片的转储。看起来类似的遥控器允许在引导后的任何时候进行倾泄。
捕获数据
一旦我的包到达,我就会将接收器连接到Arduino,并开始搜索可以捕获正在发送的数据的Arduino草图。我尝试了许多事情都失败了,但是最终找到了一个似乎可以捕获数据的东西。
而在我捕获到我认为足够的数据后,我就开始分析了。说实话,这个数据真的很难理解,我甚至不知道捕获的内容是否正确。
我做了一些进一步的学习,了解了一些RF逆向工程的内容。很多人都曾尝试使用Audacity通过插入计算机麦克风端口的接收器;来捕获信号。所以我也决定这样试试。
这样子的做法让我捕获了大量数据。我收集了4种不同R类型的遥控器,以及2种不同X类型的遥控器,并在与Broadlink RM Pro(B类型)配对的8种不同的设备上获得了更多有趣的东西。
到这里,我已经能够确定一些事情了。
传输没有滚动码。因此,我可以简单地重播捕获的信号,使百叶窗每次都做同样的事情。如果我无法逆向工程协议,这将是最坏的情况。
传输重复至少3次(根据所使用的远程类型而改变)
放大波形,我们可以看到捕获的传输的不同部分。下面的示例是捕获远程1通道1,用于配对操作:
放大:
在缩放图像中,您可以看到传输以振荡0101AGC模式开始,接着是另一个双宽度前导码模式,然后是较长的标题模式,然后是数据。对于R型遥控器,该前同步码,报头和数据重复3次(AGC模式仅在发送开始时发送一次)。这可以在第一个图像中看到。看这个数据不会太有用。我需要一种方式来转换数字和分析位,并确定不同的遥控器,通道和动作之间的一些模式。
解码波形
我们需要确定波形是如何编码的。这些类型的硬件应用程序使用以下之一是非常常见的:
曼彻斯特编码, 三态/三位编码,附加信息 PWM编码
原始的?high long = 11,high short = 1,low long = 00,low short = 0?
通过做一些研究,我能够确定使用的编码最有可能的是曼彻斯特编码。我们需要记住这一点。
将数据数字化
我开始处理数据作为上述所说的原始方案(即使我认为是曼彻斯特)。这样做的原因是,如果碰巧不是曼彻斯特,我可以尝试用另一个方案来解码它。(另外用手写出来的东西比在我头上做曼彻斯特解码更容易)。
我将每个捕获记录写入Google表格电子表格。每个频道写出每个动作大概需要5分钟,每个遥控器有6个频道。我开始认为这需要一段时间才能真正得到足够的数据进行分析。(考虑到我有160次捕获数字化)
一旦收集了2个遥控器中8个不同频道的所有动作,我就停止了。这给了我32个捕捉。从这么多的数据,我能够推断出一些关于原始位的事情:
每个通道有一些位改变 每个遥控器有一些位改变。 对于每个频道/远程/动作组合,有些位似乎随机变化。
我仍然需要更多的数据,但是我手中有太多的捕获来解码。为了获得任何地方,我需要一个脚本来处理我通过Audacity捕获的WAV文件。我写了一个脚本,检测到标题和提取的数据作为其原始编码等价物(如我一直在做的)。该脚本生成了JSON输出,因此我可以添加额外的元数据,并用波形交叉检查捕获:
一旦验证,我就会对这些数据进行列表并将其插入我的电子表格进行进一步处理。不幸的是,这有太多的bits,使得每一次捕获都会让我保持理智:
我认为如果是以曼彻斯特编码来解密时最好的。为此,我写了一个脚本,将原始捕获数据处理为曼彻斯特(或其他编码类型)。将这些数据迁移到我的电子表格中,这时它开始变得更有意义了。
看看这些数据,我们可以立即看到这些bits和它们的目的之间的一些关系:
通道(C)6位 2位动作(A) 6位用于某些校验和,似乎是一个动作和通道的功能。 F(A, C) 行动改变时的变化 频道改变时的变化 由于没有信道是平等的,所以不能确定它们会在遥控器中发生变化。 1位似乎是Action的一个功能 F(A) 1位似乎是的函数F(A),从而,G(F(A))。它取决于F(A)值,有时是1-1映射,有时是反映射。
经过进一步的调查,我确定对于同一个遥控器和通道,对于每个不同的动作,F(A, C)增加了1.(如果你认为这些位是大端序列号)。
再看一下,我还确定,对于相邻的通道,与C(通道)相关的位向上/向后计数(X型遥控器向上计数,R型遥控器向后计数)。另外F(C)还一起增加/减少。注意C栏。
由此,我可以确认之间的关系F(A, C),并C,这样F(A, C) = F(PAIR, C0) == F(PAIR, C1) ± 1。在这个发现之后,我还确定了F(A, C)和A(Action)之间有另外的数学关系。
制作更多数据
根据我们现在收集的信息,我们可以通过改变6位通道数据并按照我们上面发现的数学关系,相应地使校验和变异来创建新的遥控器。这意味着我们可以从一个种子通道生成64个通道。这么多通道足以控制房子里的所有百叶窗,但是我真的想完全解码校验和字段,反过来又能够产生(几乎)无限远的遥控器。
我写了一个工具来输出种子捕获的所有通道:
生成更多数据的原因是,如果我们可以在同一个频道上查看不同的遥控器,也许我们可以确定校验和的形成方式。即R0CH0,R1CH0,X1CH0,等…
本质上我想做的是解决下列方程式的功能G:
然而,查看所有通道0的PAIR捕获,校验和仍然完全混乱且随机的:
然而,在看这些数据的同时,另一种模式也脱颖而出了。G(F(A))坐了整个字节偏移(8位)F(A)。另外,前2位F(A, C)位于字节边界,并与A(Action)对齐。随着行动的增加,F(A, C)也是如此。让所有bits在其字节边界排列,看看其有什么优势:
从这里,我们需要确定一些基于前4个字节产生已知校验和的函数。最初我尝试在字节上进行XOR:
但并不是很成功,输出显示为随机并使用校验和异或输出不产生常数键。因此,我推断出校验和不是通过异或生成的。会不会是加法呢?我们已经看到上面的加法/减法关系。
相同类型遥控器的通道之间有一个恒定的差异,这使得我们的猜测看起来非常有希望。由于我的生成程序有一个错误,所以不同类型的遥控器可能会有所不同吗?在通道或校验和突变时,我们是否没有包装正确的位数或使用错误的字节边界?
事实证明,这是� 的原因。
解决校验
查看原始捕获,并执行相同的模加法,我们确定校验和是通过添加前导的4个字节和添加3来计算的。我无法确定为什么在3这里使用,除了RAEX想要使其解码的校验和更多困难或确保正确的传输模式。
我重构了我的应用程序来处理我们刚刚确定的边界:
看这样的数据开始变得更有道理了。事实证明,这F(A)不是A(Action)的一个功能,它实际上是被传输的动作数据的一部分:
另外,通道和遥控器之间的分割也许是没有必要的。相反,这可能只是一个任意的24位整数,但是更容易将其拆分为8位int和16位int。基于此,我可以推断,协议有2 ^ 24遥控器(约1670万)的空间!这里有很多百叶窗!
因此,我正式的写出校验和功能:
附加工具
我的remote-gen程序是为了使用种子远程生成代码(尽管由于包装问题而不正确),但现在需要一些其他功能。
我需要一种从捕获中提取信息的方法,并验证其校验和是否与我们的规则集一致,以生成校验和。我写了一个info命令:
–validate如果猜测的校验和!=校验和,运行与出错与错误。在我们的所有捕获中运行这一过程证明我们的校验和函数是正确的。
该工具所需的另一个功能是能够生成任意代码来创建我们自己的遥控器:
好了到这里,我已经可以使用这个工具来生成任何我认为必要的遥控器了。