从 ascii 字符串逆向工程校验和?
Reverse engineering checksum from ascii string?
我目前正在对具有串行协议的设备进行逆向工程。
我大部分时间都在那里,但是我无法弄清楚字符串的一部分。
对于每个字符串,机器 returns 它总是有 !XXXX,其中 XXXX 以十六进制值变化。据我所知,这可能是 CRC16?
但是我不知道如何自己计算CRC来确认它是正确的。
下面是 3 个响应的示例。
U;0;!1F1B
U;1;!0E92
U;2;!3C09
数字可以用一系列的ascii字符替换。例如,这是我最常使用的。
U;RYAN W;!FF0A
如何计算校验和的生成方式?
有一个工具可用于对 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。
您需要更多不同长度的示例。
使用 reveng,您需要反转 CRC 字节,例如1b1f
,而不是 1f1b
。看起来 CRC 是根据分号之间的内容计算的。通过 reveng,我知道多项式是 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 寄存器的初始值以及与什么结果异或。
我目前正在对具有串行协议的设备进行逆向工程。
我大部分时间都在那里,但是我无法弄清楚字符串的一部分。
对于每个字符串,机器 returns 它总是有 !XXXX,其中 XXXX 以十六进制值变化。据我所知,这可能是 CRC16?
但是我不知道如何自己计算CRC来确认它是正确的。
下面是 3 个响应的示例。
U;0;!1F1B
U;1;!0E92
U;2;!3C09
数字可以用一系列的ascii字符替换。例如,这是我最常使用的。
U;RYAN W;!FF0A
如何计算校验和的生成方式?
有一个工具可用于对 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。
您需要更多不同长度的示例。
使用 reveng,您需要反转 CRC 字节,例如1b1f
,而不是 1f1b
。看起来 CRC 是根据分号之间的内容计算的。通过 reveng,我知道多项式是 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 寄存器的初始值以及与什么结果异或。