需要帮助找出这个小型无线数据包中使用的校验和

逆向工程 开箱 去混淆 gnu-radio
2021-07-06 02:01:09

需要帮助找出用于这个小数据包的校验和。数据包有 48 位长,我已经弄清楚了大部分位。即使数据包的其余部分发生单个位更改,也至少会更改 8 位。所以我猜这一定是某种校验和。尝试了我所知道的所有校验和算法,但没有合适的。

数据包的问题是运动传感器发送的 RF 传输(历史记录如下)。这些位是,

4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 
7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
-----------------------------------------------------------------------------------------------
p p p p p s s s 0 0 m t 1 i i i i i i i i 1 i i i i i i i i 1 i i i i i i i i 1 c c c c c c c c


p = Preamble (11111), helps is demodulating the signal by providing enough transitions.
s = Some sort of status (only changed when sensor was initializing after power up)
m = '1' When motion is detected.
t = '1' when tamper switch is pressed.
i = Unique sensor ID which is also printed on the back of the sensor.
c = These bits change whenever any of the other bit change. I'm guessing this is checksum.

笔记:

  • 固定的 0 和 1 很可能是其他一些状态报告,在运动传感器的情况下不会改变。
  • ID (i) 以非字节偏移量嵌入到数据包中。似乎 ID 嵌入为“1”后跟 8 位,也许该协议最初是为八进制设计的。
  • 这个传输似乎没有使用任何滚动码。它总是一样的。
  • 这是一个已有 10 多年历史的系统,我不希望它使用任何复杂的东西。

我为三个不同的传感器捕获的示例数据包是,

FA 19 D4 3E 3B A7 (11111010 00011001 11010100 00111110 00111011 10100111)
F9 29 D4 3E 3B EE (11111001 00101001 11010100 00111110 00111011 11101110)
F9 39 D4 3E 3B 44 (11111001 00111001 11010100 00111110 00111011 01000100)

FC 29 D4 C7 11 D4 (11111100 00101001 11010100 11000111 00010001 11010100)
F9 39 D4 C7 11 19 (11111001 00111001 11010100 11000111 00010001 00011001)
F9 29 D4 C7 11 B3 (11111001 00101001 11010100 11000111 00010001 10110011)
FA 19 D4 C7 11 FA (11111010 00011001 11010100 11000111 00010001 11111010)

F9 29 AE 8E DF 57 (11111001 00101001 10101110 10001110 11011111 01010111)
F9 39 AE 8E DF FD (11111001 00111001 10101110 10001110 11011111 11111101)

这不是黑客攻击或类似的东西。这一切都始于使用 SDR 和 GnuRadio 来解调某些 RF 传输的简单练习。一旦正确解调,找出数据包格式就很有挑战性,但这个校验和问题现在让我抓狂。

任何帮助都非常感谢。

2个回答

(我没有足够的声誉发表评论,所以请原谅一个非常片面的答案。)

您需要考虑某些位是否不是数据包数据的一部分而是传输编码的一部分。例如,在规则间隔位位置 8、17、26、35 处的 1 很可能在那里防止 0 的运行时间过长。(了解调制方案可能会有所帮助。)

例如,您的消息数据实际上可能是:

1sss00mt iiiiiiii iiiiiiii iiiiiiii cccccccc

然后它可以传输为:

'1111' byte[0] '1' byte[1] '1' byte[2] '1' byte[3] '1' byte[4]

任何校验和都可能仅基于消息数据。

许多校验和,尤其是小数据包,非常容易减轻嵌入式设备的微小大脑的负担。

还要考虑校验和必须快速且易于验证。

通常,校验和的设计使最终结果为 0(零),因为这非常易于检查。

一些尝试:

  • 添加所有字节(8 位块)、示例结果和 0xFF(低 8 位),它是零吗?或者也许总是一个常数?

  • 减去字节。从零开始,减去每个块。你又归零了吗?还是每个数据包的恒定值?

  • xor 字节,同上。

  • 通常,微控制器可能有一个 4 位总线……一次使用 4 位重复前面的检查。它可能有 16 位总线的可能性很小,但对于较小的设备,不太可能。

  • 要记住的另一件事是,您可能polarity对解调的信号进行了反转。也许10,反之亦然?许多设备是逻辑低电平有效,这意味着它们在发出信号/指示某物而不是 1 时在其总线上显示零。(虽然我相信这种情况下校验和的最终结果可能全是 1)


                    Add Sub Xor 4A 4S 4X
FA 19 D4 3E 3B A7 : 07  F9  95  4  C  C    ; hmmm, dunno yet 
F9 29 D4 3E 3B EE : 5D  A3  EF  F  1  1    ; drat, nothing jumps out yet
F9 39 D4 3E 3B 44 : C3  3D  55  C  4  0    ; awww, maaaaaaannn!

FC 29 D4 C7 11 D4 :                        ; these entries left as an
F9 39 D4 C7 11 19 :                        ; exercise for the reader...
F9 29 D4 C7 11 B3 :
FA 19 D4 C7 11 FA :                        ; also, I'm being lazy tonight
                                           ; and these are painful to compute
F9 29 AE 8E DF 57 :                        ; by hand.
F9 39 AE 8E DF FD

您需要的是在稳态条件下来自单个传感器的许多数据包。你每次得到的包数据都一样吗?或者也许有一个计数器或I'm Alive的价值?

当然,然后对每个传感器都这样做,寻找趋势。但我很好奇在稳态期间有什么(如果有的话)变化。