【问题标题】:Reverse engineering unknown CRC逆向工程未知CRC
【发布时间】:2014-10-29 22:22:59
【问题描述】:

我正在尝试对 CRC 进行逆向工程。 当我计算数据的 CRC-16 时,它与数据的 crc 发送非常相似,但并不完全相等。

找出计算此 CRC 的确切方法的最佳方法是什么? 是不是这里使用了另一个多项式,或者可能是另一个初始值?

以下是一些与 CRC-16 相比具有自己 CRC 的数据包:

Packet           CRC    CRC-16  Difference
118080009A28C0 - 603D   6021    28
918080009A28C0 - A8BD   A8A0    29
518080009A28C0 - A47D   A460    29
D18080009A28C0 - 6CFD   6CE1    28
318080009A28C0 - A27D   A200    125
B18080009A28C0 - 6AFD   6A81    124
718080009A28C0 - 6665   6641    36
F18080009A28C0 - AEE5   AEC0    37
098080009A28C0 - 61BD   61B9    4
898080009A28C0 - A93D   A938    5
C98080009A28C0 - 6D7D   6D79    4
298080009A28C0 - A39D   A398    5
A98080009A28C0 - 6B1D   6B19    4
698080009A28C0 - 67DD   67D9    4
B1808800372880 - BAFD   BAF0    13
E18080009A28F8 - BDDD   BDD0    13  
118080009A28FE - B0BD   B0A0    13
8080D728D72880 - 224C   224C    0   
80803728372880 - 02CC   02CC    0   
80803928392880 - 00C4   00C4    0   
8080B928B92880 - 36C4   36C4    0   
8080D728D72846 - 70CC   70CC    0   
80803728372846 - 504C   504C    0   
718080009A28C0 - 6665   6641    36
718080009A28FC - 7765   7741    36
F18080009A28C0 - AEE5   AEC0    37
F18080009A28FC - BFE5   BFC0    37
098080009A28C0 - 61BD   61B9    4
098080009A28FC - 70BD   70B9    4
898080009A28C0 - A93D   A938    5
898080009A28FC - B83D   B838    5
498080009A28FC - B4FD   B4F8    5
C98080009A28C0 - 6D7D   6D79    4
C98080009A28FC - 7C7D   7D79    4
298080009A28C0 - A39D   A398    5
298080009A28FC - B29D   B298    5
A98080009A28C0 - 7B1D   6B19    4
A98080009A28FC - 7A1D   7A19    4
698080009A28C0 - 67DD   67D9    4   
698080009A28FC - 76DD   76D9    4

CRC-16 似乎是正确的算法,但除此之外,de 值有一个小的变化。它似乎基于数据的第一个到十六进制数字,甚至可能是 CRC 的第一部分。

【问题讨论】:

  • 最简单的方法是查看计算CRC的代码。正如here 所建议的那样,我尽最大努力使用CRC RevEng (reveng -w 16 -s 603dc0289a00808011 a8bdc0289a00808091 a47dc0289a00808051 6cfdc0289a008080d1),表明它不是标准CRC 的任何正常变体(初始化值、多边形、最终异或)。标准 CRC 的实现可能存在错误......或者他们故意做了一些微妙的奇怪事情。
  • 我认为他们确实做了一些微妙的奇怪的事情。我试过 reveng,但使用超过 2 个数据包时没有得到结果。
  • 另一种可能性是他们将起始 CRC 值初始化为非零值,这相当于在输入流中预先添加一个字节,或者可能在流的末尾添加一个字节.

标签: checksum crc crc16


【解决方案1】:

您可能错误地识别了其中一个 CRC 字节的位置。 CRC 的一个字节始终与您的 CRC-16 一致这一事实强烈表明您拥有正确的 CRC 算法。

【讨论】:

  • CRC 字节的位置是什么意思?前 7 个字节肯定不是 CRC,因为它们包含我需要的二进制信息的确切数字。
  • 我的意思是与您的 CRC 计算不同的字节可能不是 CRC 字节。我想您在某处的消息中找到了603D3D 与您的 CRC 不匹配,但第一个字节,例如60, always 匹配。所以也许正确 CRC 的第二个字节,21 在其他地方。
  • 另一种解释是消息中只存储了 16 位 CRC 的一个字节。
【解决方案2】:

您是否正确实施了 CRC16。存在几个不同版本的 CRC16。例如,维基百科列出了 CRC16-IBM、CITT、DNP、VÖV 和其他一些。也可能是一个很大的小问题,或者 CRC 正在采样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2020-02-28
    • 2015-10-24
    • 1970-01-01
    • 2014-04-08
    • 2012-08-26
    相关资源
    最近更新 更多