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

Windows ce 确定Windows CE可执行文件使用的16位CRC/校验和算法的方法?,windows-ce,reverse-engineering,checksum,crc,disassembly,Windows Ce,Reverse Engineering,Checksum,Crc,Disassembly,我需要对windows CE可执行文件实现的CRC/校验和算法进行反向工程。作为专有协议,它没有提到任何关于CRC/校验和算法的内容。但是,有一个控制台接口报告正确/计算的校验和,如果消息协议正确,我可以用随机位构造自己的消息: 我注意到, 更改消息中的单个位会完全更改校验和字节 算法似乎是位置相关的,因为我在不同的消息数据位置提供了一些单1位消息,其余的位为零,并且控制台一直报告不同的校验和。若它是简单的加法校验和,那个么校验和应该是相同的 我应用了常见的异或、LRC、加法校验和算法、常见

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

我注意到,

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

  • 算法似乎是位置相关的,因为我在不同的消息数据位置提供了一些单1位消息,其余的位为零,并且控制台一直报告不同的校验和。若它是简单的加法校验和,那个么校验和应该是相同的

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

我的问题是:

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

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

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

  • 试试看。对你的数据进行一些快速尝试是徒劳的,但我没有尽力。试着不只是尝试所有十个消息字节,也要尝试最后八个和最后六个。

    此外,你可以在我知道的同一个网站上找到

    更新:

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

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

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


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

    我认为这也应该标记为[反向工程]。将“算法”标记替换为“反向工程”我需要一些帮助,请您详细说明,我是否需要按位位置保留检查值的查找表?下面是checksum.txt中前5条消息的基本向量;最后一个位集,第二个最后一个位集等等…(1):2020^22b5=0295(2):2020^2421=0401(3):2020^2822=0802(4):2020^3024=1004(5):2020^0028=2008是。您需要一个包含48个检查值的表,每个位位置一个。当您将该表中对应于消息中1位的条目排他或组合在一起时,您将使用0x2020对答案执行另一个排他或操作。
    00000000000122b5 ^ 0000000000022421 = 0000000000030694
    0447080a300130A1 ^ 0447080a30023635 = 0000000000030694
    
    0447080a300130A1 ^ 0447080a30043A36 = 0000000000050a97
    00000000000122b5 ^ 0000000000042822 = 0000000000050a97