【问题标题】:Reverse engineering checksum from ascii string?从ascii字符串逆向工程校验和?
【发布时间】:2017-03-05 13:00:25
【问题描述】:

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

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

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

但是我不知道如何自己计算 CRC 以确认它是正确的。

这是 3 响应的示例。

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

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

U;RYAN W;!FF0A

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

【问题讨论】:

    标签: checksum crc16


    【解决方案1】:

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

    使用 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 寄存器的初始值以及结果与什么异或。

    【讨论】:

    • 你能解释一下你是如何格式化的吗? 301b1f 31920e 32093c 5259414e20570aff的输入是什么,输出是什么?
    • 每一个都是附加了 CRC 的消息。查看问题中的消息并将它们与这些十六进制字符串相关联。
    【解决方案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。

    【讨论】:

    • 谢谢。我发现 RYAN W 似乎在 U 处截断;在做一些实验的时候。我曾尝试过 reveng,但不太知道如何使用它。谢谢你教我怎么做。
    猜你喜欢
    • 2016-11-23
    • 1970-01-01
    • 2020-02-28
    • 2012-03-12
    • 2015-10-24
    • 2021-09-27
    • 2014-04-08
    • 2011-09-27
    • 2011-11-05
    相关资源
    最近更新 更多