Proflame 2射频遥控器校验和计算逆向工程技术问询
引言
SIT Proflame系列壁炉控制器适配多品牌壁炉,配套使用315MHz频段的射频遥控器。我需要实现为任意序列号生成有效命令包,通过带射频发射器的自定义微控制器控制壁炉,最终集成到Home Assistant中,让所有人都能以此方式控制壁炉,核心需求是支持任意序列号的校验和计算。
目前校验和的大部分计算逻辑已逆向完成,但不同序列号遥控器的校验和差异原因尚未明确,推测序列号会修改校验和计算逻辑,需要逆向该关联逻辑,这是当前的核心问题。现有研究已接近目标,缺失的关键步骤是找出序列号如何使校验和计算唯一化,恳请技术指引。
细节
过往研究
已有多项针对该协议及校验和算法的逆向工程研究:
- John Ellinwood的初始研究项目
- 关于校验和计算及潜在位掩码的详细讨论项目
数据包格式
示例数据包:a4ed02013ecab5
| Serial | Version | Command 1 | Command 2 | Checksum 1 | Checksum 2 |
|---|---|---|---|---|---|
a4ed | 02 | 01 | 3e | ca | b5 |
该结构为逆向所得,Version字段为推测值——目前捕获的Proflame 2遥控器数据包中该字段均为0x02。Proflame 1与Proflame 2遥控器共享相同FCC ID及外壳设计。数据包长度固定,同一遥控器的Serial和Version字段始终不变。
已知的校验和计算逻辑
已逆向得到以下信息:
- Checksum 1与Checksum 2相互独立,分别对应Command 1和Command 2(仅修改Command 1时,仅Checksum 1变化)。
- 两者计算方式相同,公式为:
其中checksum = (init ^ ((cmd&0xf0) << 1) ^ (cmd&0xf0) ^ ((cmd&0xf0) >> 4) ^ (cmd&0x0f) ^ ((cmd&0x0f) << 5)) & 0xffinit值为缺失项,且Command 1和Command 2的init值不同。 - 相同命令字节在不同遥控器上生成不同校验和,推测序列号是决定
init值的因素。 - 对已有数据包可通过暴力破解得到
init值,能计算已知遥控器的校验和,但无法支持任意序列号。
我的目标是:随机生成序列号,推导对应的校验和计算所需init值,发送有效命令与控制器配对(控制器配对需进入配对模式后接收一次开、关信号),以替代故障或丢失的遥控器。
样本数据
已捕获多个不同遥控器的数据包,对应暴力破解得到的init值(原研究中称为C和D):
| Serial | Init1 (C) | Init2 (D) |
|---|---|---|
21dd | 7d | 8b |
47eb | 61 | a7 |
7d14 | 7e | 9e |
a4ed | eb | 28 |
bf39 | dd | 1c |
已尝试方法
使用reveng工具猜测校验和的CRC算法,尝试多种消息格式组合(完整数据包、单独/组合序列号字节、包含/排除Version字段)均未匹配成功。
现寻求技术指引,以找出序列号与init值的关联逻辑,实现任意序列号的校验和计算。
内容的提问来源于stack exchange,提问作者Felix

