当前位置: 首页 > 知识库问答 >
问题:

尝试反向工程包校验和/CRC/HASH

白哲茂
2023-03-14

开始感觉很好...但之后就被难住了。无法确定CRC-16多项式。很有可能这些数据包散列不是与CRC相关的,而是某种家庭酝酿的方案。

阅读Ross N.Williams的“CRC错误检测算法的无痛指南”

不幸的是,我无法访问任何设备的源代码/二进制代码

>

  • 在数据包的最后2个字节上找到CRC。
  • 如果我查看逻辑分析器上的位,我已经将字节表示为MSB-First
  • 因此,数据包0x47366B2EE00000000000751CEB5F3469543B585E2D在二进制中被视为:
  • 01000111..................................................................................
  • (0x47)....................................................................................................................................................................................

    我不知道我的系统是大的还是小的endian,但很确定字节是LSB优先的

    请参见数据包0x47366B2E部分后面的数据字节。

    任何帮助都很感激!

  • 共有1个答案

    丌官霖
    2023-03-14

    如果它遵循简单的异或关系(checksum(A^B)==checksum(A)^checksum(B)),那么就有一个简单的强力解决方案!

    插图。假设您有一个带有K位校验和的1字节值,其中K实际上并不重要,所以我们只将校验和表示为c(i)。

    第一步。实验:观察全零包的校验和c(-1)。

    0b0000000 => c(-1)
    
    0b00000001 => c(0)
    0b00000010 => c(1)
    0b00000100 => c(2)
    0b00001000 => c(3)
    0b00010000 => c(4)
    0b00100000 => c(5)
    0b01000000 => c(6)
    0b10000000 => c(7)
    
    0b11110011 = (0) + 0x80 + 0x40 + 0x20 + 0x10 + 0x02 + 0x01
    

    然后通过异或关系,

    checksum(0b11110011) = c(7) + c(6) + c(5) + c(4) + c(1) + c(0) + c(-1)
    

    也就是说,对于要输出的每一位,只需对该位的已知校验和进行XOR累加。

    如果你做了这个练习,并实验性地写出基向量的所有152个校验和,你可能还会在这个过程中发现一个简单的模式,解释校验和是如何来自基向量的。:)如果是这样的话,最好把它贴在这里!(也许告诉我们我们在逆转什么?)

     类似资料:
    • 对于每一个字符串,机器都返回!XXXX,其中XXXX以十六进制值变化。据我所知,这可能是CRC16? 然而,我不知道如何计算CRC自己来确认它是正确的。 这里有一个3种反应的例子。 如何计算校验和是如何生成的?

    • null 我不确定校验和是只在数据上计算还是在开始结构上计算(以十六进制为910H) 我附上了一些交流信息,每行是一条信息。我尝试了诸如、和等算法;不幸的是没有任何运气。 更新:我现在有了更多的进步,我现在不再确定它是校验和还是CRC。我已经生成并发送了从0到34的数据值,系统生成了以下“校验和” null Upadte2:我现在已经生成了数据,其中数据结构的一个位是1

    • 我最近想使用CRC-32校验和进行文件完整性检查,并试图以同样的方式验证它,但似乎这种“对比零技巧”在这里是不可能的?! 例如,如果我在CRC在线计算器上使用32位值0xdeadbeef: https://www.lammertbies.nl/comm/info/crc-calculation.html 谁能解释一下,为什么这个“零比零技巧”对CRC-32不起作用?

    • 为了避免多次重新计算一个项目的数据,我希望对这些项目使用已经计算好的crc。或以伪代码: 问题是combine_magic应该是什么。我使用boost crc库,但我没有在那里找到这样的功能。简单地使用xor是一个坏主意,因为我可能会完成一些指向偶数次的项--这将从等式中消除它们。Zlib似乎提供了这样的函数https://github.com/madler/Zlib/blob/master/cr

    • 我正试图反向工程一个BLE装置(万向节)。在嗅探之后,我已经成功地复制了精确的命令,下面是其中的一些命令: 更新:我使用reveng强制POLY&init: 步骤1:运行命令(电机命令中的最后两个字节反转): 步骤1-结果: 但是,如果我使用函数: CRC值仍然与原始值不匹配。在我的知识中,有些东西我漏掉了。 示例: 我得到十六进制的输出:。我不明白。为什么我生成Poly&Init的代码返回了错误

    • 正如你已经发现的,调试汇编代码非常的困难和容易受到挫折。 我建议你先把你需要优化的小段代码用高级语言写成一个子程序。 然后写个小的测试程序可以充分测试你的这个子程序。 确认测试程序可以测试到所有的分支和边界条件。 当高级语言的子程序可以工作了,你再把它翻译成汇编代码。 现在你可以开始优化了。 每次你做了点修改都应该运行测试程序看看能不能正确工作。 将你所有的版本都标上号并保存起来,这样在发现测试程