需要帮助对狗项圈发射器进行逆向工程

逆向工程 编码 二元诊断
2021-06-11 06:06:57

我有一个 Petrainer PET998DRU 防震项圈(类似于这个),它被它应该训练的狗部分咬坏了。我将它打捞到有以下按钮的地步:

  • 模式(选择灯光、蜂鸣声、振动和电击
  • 激活(发送适当的刺激)
  • 向上箭头(增加刺激量)

显示器不起作用,所以除了反复试验之外,我不知道设置(哪种刺激和刺激程度)是什么。

我遵循了这里的方法:http : //brettleaver.com/collar/以达到我所得到的程度,但该模型的协议有所不同,我只能找出设备 ID 和刺激类型(我认为)。我可以在单独的 433Mhz 发射器上重放数据包,项圈会做出适当的响应,但我想弄清楚整个数据包。刺激量是我需要帮助解码的。

蜂鸣器的逻辑 哔声的图像(没有持续时间是由设计编码的)

我将其解码为0xDF 7E DE ED 7F D6 AB 如果这是错误的,那么请告诉我,因为它可能会给我一个关于为什么我无法弄清楚其余部分的线索。

zap 的逻辑 zap 的图像(持续时间未知)

我将其解码为0x‭DF DE DE ED 6F 7A AA C0‬. 完成最后一个八位字节的最后一位被假定为逻辑 0。不过,也许这个假设是错误的。

我类似地解码了其他数据包,但我不会发布所有图像。

编辑:从那以后,我捕获了我知道持续时间为 0 的振动和 zaps。

  • 光: 0xDE FE DE ED 7F D5 AB
  • 嘟: 0xDF 7E DE ED 7F D6 AB
  • 电击: 0x‭DF DE DE ED 7F EA AB‬
  • 颤动 0x‭DF BE DE ED 7F DA AB

除了 Light 之外的所有数据包都以0XDF. 下一个位置(7、F、D 或 B)似乎决定了刺激类型。接下来的 5 个总是0xE DE ED这样,似乎可以确定设备 ID。之后的所有字符都对 zap 或 buzz 的持续时间进行编码,然后与某种校验和有关。

这是我按顺序获得的嗡嗡声。记录每一个后,我加一,然后再次发送命令:

  • 0x‭DF BE DE ED 7F AD 55 80
  • 0x‭DF BE DE ED 7F 6D 55 80
  • 0x‭DF BE DE ED 7F 56 AA C0
  • 0x‭DF BE DE ED 7E ED 55 80
  • 0x‭DF BE DE ED 7E D6 AA C0 ...

我发现的一件有趣的事情是始终存在以下模式之一,但我无法弄清楚其重要性:

  • 0x__ _B 55 60
  • 0x__ _D 55 80
  • 0x__ _6 AA C0
  • 0x__ _5 AA B0

编辑:另一件有趣的事情是,永远不会有 2 个连续的零。

假设我从一开始就没有犯过大错误(这是我第一次尝试逆向工程),有没有人看到正在使用的明显编码方案或校验和?

我的最终目标是编写一个新的 433MHz 发射器,并使其可通过尚未开发的移动应用程序进行控制。

1个回答

回答

将“间隙”视为两个连续“高”间隔之间的“低”间隔,忽略第一个最长的间隔。那么,一个位1对应一个长间隙,一个位0对应一个短间隙。

因此,以这种方式解码的消息是:

88 14 4b 00 ee   : Light
84 14 4b 00 de   : Beep
81 14 4b 00 7e   : Zap
82 14 4b 00 be   : Vibrate
82 14 4b 01 be   : Buzz stim in sequential order
82 14 4b 02 be
82 14 4b 03 be
82 14 4b 04 be
82 14 4b 05 be
82 14 4b 06 be
82 14 4b 07 be
82 14 4b 08 be

这遵循与http://brettleaver.com/collar/ 中描述的完全相同的模式,除了远程 UID14 4b不是20 89.

(引用上面的链接:

现在我们可以轻松解码遥控器发送的内容!在多次更改设置并查看它如何改变传输之后,信号代表什么就变得很清楚了。

81 20 89 32 7e
这将被设置为8,如果遥控器是信道1上
,这将被设置为f,如果遥控器是在信道2

81 20 89 32 7e
这将设置为1当遥控器请求震动时
这将设置为2当遥控器请求振动时
这将设置为4当遥控器请求哔声时
这将设置为8当遥控器请求 LED 闪光时

81 20 89 32 7e
这些字节代表遥控器的 UID,永远不会改变。

81 20 89 32 7e
该字节表示振动/冲击的强度。
项圈将忽略 100 以上的任何内容

81 20 89 32 7e
这将设置为7当遥控器请求震动时
这将设置为B当遥控器请求振动时
这将设置为D当遥控器请求哔声时
这将设置为E当遥控器请求 LED 闪光时

81 20 89 32 7e
这将被设置为E,如果遥控器是信道1上
,这将被设置为0,如果遥控器是在信道2

81 20 89 32 7e
最后一个字节等于第一个字节,但其位颠倒和反转。我认为这是某种错误检查机制,因为项圈将忽略所有并非如此的传输。

)


推导

考虑二进制信号:

110111111011111011011110111011010111111110 101101010101011 0000000
110111111011111011011110111011010111111101 101101010101011 0000000
1101111110111110110111101110110101111111010 101101010101011 000000
110111111011111011011110111011010111111011 101101010101011 0000000
1101111110111110110111101110110101111110110 101101010101011 000000
1101111110111110110111101110110101111110101 101101010101011 000000
11011111101111101101111011101101011111101010 101101010101011 00000
110111111011111011011110111011010111110111 101101010101011 0000000

请注意bold italic零件如何出现在所有序列中,而不是在固定位置?这让我怀疑消息的长度是可变的,尾随零无关紧要。

所有消息的公共前缀是11011111101111101101111011101101011111. 我们将剪掉这部分,但1在消息中留下一个——原因稍后会很明显。

剩下的部分是:

11110
11101
111010
11011
110110
110101
1101010
10111

请注意,这应该是(一部分)递增的连续数字序列。

从OP的观察(没有两个连续的零),并注意上面的数据中有3对,其中后一个是前一个0附加的,我猜a0被编码为a 10,a1被编码为a 1(或相反亦然)。

更换101得到:

1110
1101
1100
1011
1010
1001
1000
0111

看起来不错。这按降序计数,因此我们必须否定这些位(0编码为11编码为10)。

很明显,这些位的重要性递减(最重要的位在前)。因为表示的值是从 1 到 100,所以前 3 位也是该值的一部分。

我也怀疑

只是传输开始标记,对数据没有贡献,因为它比所有其他标记都大。