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

Mau*_*odi 5 checksum reverse-engineering crc disassembly windows-ce

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

我观察到了,

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

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

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

我的问题:

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

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

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

Mar*_*ler 4

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

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

更新:

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

00000000000122b5 ^ 0000000000022421 = 0000000000030694
0447080a300130A1 ^ 0447080a30023635 = 0000000000030694
Run Code Online (Sandbox Code Playgroud)

0447080a300130A1 ^ 0447080a30043A36 = 0000000000050a97
00000000000122b5 ^ 0000000000042822 = 0000000000050a97
Run Code Online (Sandbox Code Playgroud)

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

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

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