逆向工程 CAN 消息中的 CRC/校验和算法

问题描述 投票:0回答:1

我有一个在 CAN 总线上交换信息的设备。我正在尝试对正在使用的协议进行逆向工程。

我可以解码协议(或大部分协议),但我正在努力对正在使用的校验和/CRC 进行逆向工程(没有它,设备不会将其作为有效消息接受)。这个CRC在“应用”层,CAN有自己的CRC,但这是CAN传输的data/payload(17 * 8 byte messages,共136 bytes)

消息示例:

07 55 AA AA 00 AA 12 94 
37 5A 00 00 2E 02 5C 03 
3A 02 0A 78 00 60 22 26 
02 00 00 00 00 DC 00 50 
4B 64 B8 0B E0 2E 70 17 
84 25 08 78 1E 0A 78 00 
8C AF B4 69 00 54 24 D4 
24 0A 70 10 19 00 00 06 
CC 0C E8 03 B0 04 51 44 
14 2C 01 88 13 28 00 0A 
00 C0 00 C0 80 C8 0B C0 
25 C0 11 C3 00 C0 00 58 
00 00 C0 0F C0 8A C0 09 
C2 10 C1 07 C2 00 C0 92 
CB 00 3A C7 0F DF 52 14 
00 00 00 00 51 00 D2 05 
00 00 00 ED 6D 00 00 00 

更多消息在这里: https://pastebin.com/uPsMNfyq

儿童权利委员会?在最后 8 个字节中似乎很明显是“ED 6D”。我不知道消息从哪里开始或结束,前 8 个字节似乎是某种序言,但它们有时会发生变化。第 16 行也是如此——它似乎是某种尾随标题,但它有时会发生变化。所以校验和/CRC(假设它是什么)可以覆盖消息的某些部分。

我尝试了几个工具,其中:

  • delsum同时尝试算法/宽度/初始值(0-255)和0-16的开始/结束偏移量的所有组合
  • find_CRC
  • crcbeagle

没有一个产生任何结果。

任何帮助/想法将不胜感激。

更新: 根据此处的评论,我制作了另外两条消息,其中修改的部分是最早的(字节 14)和最新的(字节 119)字节我知道如何修改:here.

我反转了 crc (6DED) 我还运行了 delsum 尝试 algo = 0x1021,不同的开始/停止字节和不同的初始值。我得到了一些看起来不错的结果(仍在运行),但不幸的是,这些似乎都没有验证其他消息的 CRC。

reverse-engineering checksum xor can-bus crc
1个回答
0
投票

这两个字节确实是一个 16 位的 CRC。它是具有多项式

0x1021
的前向(未反射)CRC,并且CRC以小端顺序存储在最后。

以小端顺序存储前向 CRC 有点奇怪。通常这将是大端顺序,因此对于具有正确 CRC 的消息,包括 CRC 字节在内的 CRC 计算将是一个常量。这可能就是为什么您尝试过的其他工具找不到它的原因。

仅根据您提供的示例无法确定 CRC 计算的确切开始或结束位置,因为消息中只有第 41、59 和 64 个字节不同。那些只绑定参与的字节,所以肯定是从第 41 个到 CRC 之前的那些是它的一部分,但可能在第 41 个之前。

如果不知道这些边界,也无法确定初始值和最终排他值,即使知道边界,也无法确定这两个参数,因为所有消息的长度都相同。

虽然你提到这是在 CAN 总线上,但这不是 CAN CRC,因为这些 CRC 是 15 位、17 位和 21 位。

对于提供的示例,CRC 计算可以从任何偏移量 0..40 开始。对于这些偏移量中的每一个,都存在一个初始 CRC 值,最终异或为零,这将给出正确的 CRC。以下是这些初始值:

0 -> 0x5188
1 -> 0xb233
2 -> 0xbec9
3 -> 0x9bb5
4 -> 0x9372
5 -> 0xc1da
6 -> 0x07cd
7 -> 0x8f94
8 -> 0x375a
9 -> 0x5a00
10 -> 0x0000
11 -> 0x0000
12 -> 0x0000
13 -> 0xc5ac
14 -> 0x05ab
15 -> 0x60dc
16 -> 0x80c5
17 -> 0xc391
18 -> 0x586d
19 -> 0x17b7
20 -> 0x2a49
21 -> 0xcc28
22 -> 0x5c66
23 -> 0xf959
24 -> 0x6392
25 -> 0xee87
26 -> 0x9be0
27 -> 0xd2d2
28 -> 0x393f
29 -> 0x987a
30 -> 0x7240
31 -> 0x1ed5
32 -> 0x7c0a
33 -> 0x4cb4
34 -> 0x116a
35 -> 0x4ec3
36 -> 0xdb61
37 -> 0xe638
38 -> 0x6044
39 -> 0x5631
40 -> 0x69e5

有趣的是,偏移量 10、11 和 12 的初始值为零。无法区分这些,因为示例在偏移量 10 和 11 处都有零,并且零不会更改具有初始值的 CRC零值。因此,如果我们假设初始值和最终值应该以某种方式“不错”,那么 10、11 和 12 可能是很好的候选者,因为它们的初始值和最终异或运算为零。

虽然没有人能保证世界会美好

也可以选择不同的最终异或值并获得另一组不同的初始值。所有生成的组合,从它们相关的偏移量开始,将在所有示例消息的消息中给出 CRC。

© www.soinside.com 2019 - 2024. All rights reserved.