我正在对一个过时的电子控制系统的串行通信协议进行逆向工程,但我无法弄清楚 CRC 算法和多项式。
我对同一家公司过去制造的另一个类似系统进行了逆向工程。在之前的那个中,我能够从 中转储8051
微控制器程序EPROM
并将其反汇编。这是我用 C 编写的工作代码,8051
注释中有原始反汇编:
unsigned char CalculateChecksum(void) {
unsigned char r1 = 0; // MOV R1,#0
unsigned char r2, r3, c, a;
for (r2=1; r2<4; r2++) { // MOV R2,#07
a = out_buffer[r2]; // MOV A,@R0
r3 = a; // XCH A,R1
a = r1;
r1 = r3;
c = 0; // CLR C
if (a & 0x80) {
c = 1; // FAKE CARRY
}
a = a << 1; // RLC A
if (c == 1) { // JNC 0x03E8
a = a ^ 0x19; // XRL A,#19
}
a = a ^ r1; // XRL A,R1 (0x03E8)
r1 = a; // MOV R1,A
printf("%d: 0x%x ", r2, a);
}
return a;
}
问题是这个功能在这个较新的系统上不起作用。我已经尝试了所有 255 种可能的多项式,因此尚不清楚不同系统之间是否共享算法(也许进行了一些修改?),但是我相信算法之间存在关系。
这是从一个单元传输的一些消息的捕获:
7E 00 12 03 00 50 FB 01 60
7E 00 12 03 00 50 FB 01 60
7E 00 12 03 00 50 FB 01 60
7E 00 12 03 00 50 FB 01 60
7E 00 12 03 00 51 FB 01 61
7E 00 12 03 00 51 FB 01 61
7E 00 12 03 00 51 FB 01 61
7E 00 12 03 00 51 FF 01 65
7E 00 12 03 00 51 03 00 69
7E 00 12 03 00 51 09 00 6F
0x7E 似乎是一个前导码,后跟 7 个字节的数据,然后是校验和字节。任何人都可以弄清楚吗?