从ascii字符串反向工程校验和?

时间:2017-03-05 13:00:25

标签: checksum crc16

我目前正致力于对具有串行协议的设备进行逆向工程。

我大部分时间都在那里,但是我无法找出字符串的一部分。

对于机器返回的每个字符串,它始终具有!XXXX,其中XXXX以十六进制值变化。根据我的发现,这可能是CRC16?

但是,我无法弄清楚如何自己计算CRC以确认它是正确的。

以下是3个回复的示例。

U;0;!1F1B
U;1;!0E92
U;2;!3C09

该数字可以替换为一系列ascii字符。例如,这是我经常使用的内容。

U;RYAN W;!FF0A

如何计算校验和的生成方式?

2 个答案:

答案 0 :(得分:2)

有一种工具可用于逆向工程CRC计算:CRC RevEng http://reveng.sourceforge.net/

您可以给它输入和校验和的十六进制字符串,并询问它与输入匹配的CRC算法。这是前三个字符串的输入(假设消息是U; 0;,U; 1;和U; 2;):

$ reveng -w 16 -s 553b303b1f1b 553b313b0e92 553b323b3c09 
width=16  poly=0xa097  init=0x63bc  refin=false  refout=false  xorout=0x0000  check=0x6327  residue=0x0000  name=(none)

校验和遵循输入消息。不幸的是,如果我尝试RYAN W消息,这不起作用。您可能希望尝试编辑输入消息,以查看字符串的哪一部分正在输入CRC。

答案 1 :(得分:2)

您需要更多不同长度的示例。

有了这个,你需要反转CRC字节,例如: 1b1f,而不是1f1b。似乎CRC是根据分号之间的内容计算的。我知道多项式是0x1021,这是一个非常常见的16位多项式,并且反映了CRC。

% reveng -w 16 -s 301b1f 31920e 32093c 5259414e20570aff
width=16  poly=0x1021  init=0x1554  refin=true  refout=true  xorout=0x07f0  check=0xfa7e  name=(none)
width=16  poly=0x1021  init=0xe54b  refin=true  refout=true  xorout=0xffff  check=0xfa7e  name=(none)

通过更多示例,您将能够确定CRC寄存器的初始值以及结果的独占或结果。