5

我需要对 Windows CE 可执行文件实现的 CRC/校验和算法进行逆向工程。作为专有协议,它没有说明 CRC/校验和算法。但是,有报告正确/计算校验和的控制台界面,如果消息协议正确,我可以用随机位构造自己的消息:

我观察到,

  • 更改消息中的单个位会完全更改校验和字节。

  • 算法似乎与位置有关,因为我在各种消息数据位置提供了一些单个 1 位消息,其余位为零,并且所有时间控制台都报告了不同的校验和。如果它是简单的附加校验和,校验和将是相同的。

我应用了常见的 XOR、LRC、加法校验和算法、常见的 CRC 多项式(Standerd、CCITT、X-modem)并完成了 [CRC 逆向工程论文][2],但不幸的是我无法通过推导多项式,因为消息类型是固定的,所以无法创建单个 1 位消息。

我的问题:

  1. 是否有任何 CRC/校验和算法属性,我可以针对消息进行测试以确定算法是校验和还是基于多项式的 CRC?

  2. 有没有办法将程序反汇编中看到的错误消息与相应的汇编指令联系起来?

  3. 当它在控制台上报告正确的校验和时,有哪些方法可以调试/查明反汇编代码?内存转储什么的?

4

1 回答 1

4

试试CRC RevEng。对您的数据进行的一些快速尝试没有结果,但我并没有很努力地尝试。考虑不仅尝试所有十个消息字节,还尝试最后八个和最后六个。

此外,您可以在同一站点上找到我所知道的最全面的已知 CRC 列表。

更新:

这很可能是某种 CRC,或者至少是 GF(2) 上的线性运算。它具有 CRC 所具有的特性:如果两个序列具有相同的异或,那么它们的 CRC 也具有相同的异或。例如,从您的数据中(删除通用前缀,但请注意,包括前缀或其一部分不会改变结果):

00000000000122b5 ^ 0000000000022421 = 0000000000030694
0447080a300130A1 ^ 0447080a30023635 = 0000000000030694

0447080a300130A1 ^ 0447080a30043A36 = 0000000000050a97
00000000000122b5 ^ 0000000000042822 = 0000000000050a97

鉴于这一事实,您可以构建一个例程来计算校验值,而无需确定它是 CRC 还是 CRC 参数是什么。

为所有单比特消息生成 16 位校验值,即在 6 个字节的消息数据中设置一个比特,其余的消息数据比特为零。这些消息是该线性场的一组完整的基向量。其中有 48 个。还为全零消息生成检查值。你已经有了一个开始,全零给出2020,最后一位设置给出22b5等等。互斥或全零的校验值 ( 2020)。您现在有 49 个值,其中 48 个用于基向量,一个是零向量的校正(由于 CRC 和前缀字节的预处理和后置条件,可能非零)。例如,最后一位设置的基向量的值为0295

现在您可以使用这 49 个值来计算任何六字节消息的校验值。在该消息中设置为 1 的所有相应位的值异或一起。异或校验值为零。结果将是该消息的检查值。

于 2012-09-15T18:02:36.423 回答