确定Windows CE可执行文件使用的16位CRC/校验和算法的方法



我需要对windows CE可执行文件实现的CRC/校验和算法进行逆向工程。作为专有协议,它没有说明任何关于CRC/校验和算法的内容。然而,有一个控制台接口可以报告正确/计算的校验和,如果消息协议正确,我可以用随机位构建自己的消息:

我观察到,

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

  • 算法似乎取决于位置,因为我在不同的消息数据位置输入了一些1位的消息,其余的位为零,所有时间控制台都报告了不同的校验和。如果是简单的加法校验和,校验和就会完全相同。

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

我的问题:

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

  2. 有没有任何方法可以将程序反汇编中看到的错误消息与反汇编指令联系起来?

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

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

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

更新:

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

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

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

考虑到这一事实,有一种方法可以构建一个例程来计算校验值,而无需确定它是否是CRC或CRC参数是什么。

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

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

最新更新