我需要对由
Windows CE可执行文件实现的CRC /校验和算法进行逆向工程.作为提议协议,它没有说明CRC /校验和算法.但是,有控制台接口报告正确/计算的校验和,如果消息协议正确,我可以使用随机位构造自己的消息:
我观察到了,
>更改消息中的单个位会完全更改校验和字节.
>算法似乎与位置有关,因为我在各种消息数据位置输入了一些单个1位消息,其余的位为零,并且所有时间控制台都报告了不同的校验和.如果它是简单的加法校验和,则校验和将是相同的.
我应用了常见的XOR,LRC,附加校验和算法,常见的CRC多项式(Standerd,CCITT,X-modem)并经历了[CRC逆向工程论文] [2],但不幸的是我不能超过推导多项式,因为消息类型是固定的,所以无法创建单个1位消息.
我的问题:
>是否有任何CRC /校验和算法属性,我可以测试消息,以确定算法是校验和还是基于多项式的CRC?
>有没有办法将程序反汇编中看到的错误信息与相应的汇编指令联系起来?
>在控制台上报告正确的校验和时,有什么方法可以调试/查明反汇编代码?内存转储还是什么?
尝试
CRC RevEng.对您的数据进行一些快速尝试没有结果,但我并没有非常努力.考虑不仅要尝试所有十个消息字节,还要考虑最后八个和最后六个.
此外,您可以在同一站点找到我所知道的most comprehensive list of known CRCs.
更新:
这很可能是某种类型的CRC,或者至少是GF(2)的线性运算. CRC具有这样的属性:如果两个序列具有相同的异或,则它们的CRC也具有相同的异或.例如,从您的数据(删除公共前缀,但请注意包含前缀或其中的一部分不会更改结果):
00000000000122b5 ^ 0000000000022421 = 0000000000030694 0447080a300130A1 ^ 0447080a30023635 = 0000000000030694
和
0447080a300130A1 ^ 0447080a30043A36 = 0000000000050a97 00000000000122b5 ^ 0000000000042822 = 0000000000050a97
鉴于这一事实,有一种方法可以构建一个例程来计算检查值,而无需确定它是CRC还是CRC参数.
为所有单比特消息生成16比特校验值,即在六个字节的消息数据中设置一个比特,其余的消息数据比特为零.这些消息是该线性场的一组完整的基矢量.其中有48个.还生成全零消息的检查值.你已经有了一个开始,全部为0给出了2020,最后一位给出了22b5,等等 – 或者所有零(2020)的检查值与其他每个零.您现在有49个值,其中48个用于基向量,一个是零向量的校正(可能由于CRC的前后调节和前缀字节而非零).例如,最后一位设置的基矢量的值是0295.
现在,您可以使用这49个值来计算任何六字节消息的检查值.在该消息中设置为1的所有相应位的值的异或一起.独占或具有零值的检查值.结果将是该消息的检查值.