尝试对数据包校验和/CRC/hash进行反向工程

尝试对数据包校验和/CRC/hash进行反向工程,hash,checksum,crc,crc16,error-detection,Hash,Checksum,Crc,Crc16,Error Detection,我有一个旧的,不再制造的带有串口的电子设备。我正在尝试对此设备中使用的数据包CRC/校验和/哈希进行反向工程 有谁有敏锐的眼睛,敏锐的数学技能,谁能破解这个东西 这是我目前所知道的 每个数据包总是21字节。19字节的数据加上CRC/校验和/哈希的2字节 因此,这里没有长度或头字节。哈希计算涉及所有19个字节 我有能力生成一定数量的数据包与设备 我的第一个想法是数据包有某种CRC-16计算 所以我就跟着倒过来的提示进去了 验证了我的数据包样本遵守了上述web链接中概述的“叠加原理”。这表明它们具

我有一个旧的,不再制造的带有串口的电子设备。我正在尝试对此设备中使用的数据包CRC/校验和/哈希进行反向工程

有谁有敏锐的眼睛,敏锐的数学技能,谁能破解这个东西

这是我目前所知道的

  • 每个数据包总是21字节。19字节的数据加上CRC/校验和/哈希的2字节
  • 因此,这里没有长度或头字节。哈希计算涉及所有19个字节
  • 我有能力生成一定数量的数据包与设备
  • 我的第一个想法是数据包有某种CRC-16计算
  • 所以我就跟着倒过来的提示进去了
  • 验证了我的数据包样本遵守了上述web链接中概述的“叠加原理”。这表明它们具有数学异或关系

  • 开始感觉很好。。。但在那之后,我就被难住了。无法确定CRC-16多项式。这些数据包散列很可能与CRC无关,而是与某种自制方案有关

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

  • 也用于应用:CRC Reveng–反向工程应用
  • 请参见reveng.sourceforge.net
  • 还是没有运气
  • 不幸的是,我无法访问任何设备源代码/二进制代码

  • 还运行了测试,以查看是否使用了其他哈希,如Fletcher的校验和

下面是我的数据包的各种示例

0x47366B2EE0000000000751CEB5F3469543B585E2D
0x47366B2ED0000000000751CEB5F3469543B582C
0x47366B2EC8000000000751CEB5F3469543B580B2B
0x47366B2EC400000000751CEB5F3469543B58BB2A
0x47366B2EC204000000751CEB5F3469543B58DFE7
0x47366B2EC1000000000751CEB5F3469543B58A328
0x47366B2EC080000751CEB5F3469543B584127
0x47366B2EC4000000000751CEB5F3469543B588126
0x47366B2EC0200000000751CEB5F3469543B580525
0x47366B2EC01000000751CEB5F3469543B580124

请注意以下关于这些数据包的内容

  • CRC位于数据包的最后2个字节
  • 如果我查看逻辑分析器上的位,我首先将字节表示为MSB
  • 因此,数据包0x47366B2EE0000000000751CEB5F3469543B585E2D以二进制形式显示为:
  • 01000111 00101101
  • (0x47)

  • 我不知道我的系统是大端还是小端,但相当确定的字节首先是LSB

  • 注意,对于上述10个数据包样本,每个数据包通过10位位置移动1位而不同。除了第五个包,我必须改变2位
  • 请参阅数据包0x47366B2E部分后面的数据字节

  • 我看到出现的唯一模式是每个数据包上的最后一个字节递减1(2D,2C,…)。(除了第五个数据包,我必须更改2位)

  • 最后一个字节不是某种序列号,因为我可以随时用相同的值生成它们
  • 但它可能给出了一个关于所使用的数学散列的提示

感谢您的帮助

如果它遵循简单的异或关系(校验和(A^B)=校验和(A)^校验和(B)),那么有一个简单的暴力解决方案

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

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

0b0000000 => c(-1)
第二步。实验:观察所有二进制序列的校验和c(i),其中在位置i处有一个1

您观察到的校验和值构成GF(2)的线性基础,XOR关系现在允许您计算任何校验和

现在,您可以通过将每个位位置的校验和与1相加来计算校验和,例如,假设您想要0XF3的校验和,其二进制形式为0b11110011。自

0b11110011 = (0) + 0x80 + 0x40 + 0x20 + 0x10 + 0x02 + 0x01
然后通过XOR关系

checksum(0b11110011) = c(7) + c(6) + c(5) + c(4) + c(1) + c(0) + c(-1)
i、 对于要输出的每一位,只需XOR累积该位的已知校验和


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

我通过一个名为“SRP16”的应用程序运行了一些数据包,该应用程序搜索并显示CRC16 Rocksoft参数。结果如下:

===== Result parameter sets =====
CRC=$2a2c  Poly=$2817  init=$3141  xorout=$ffff  refin=true   refout=true 
 *** Second data set verified
CRC=$2a2c  Poly=$2817  init=$70f4  xorout=$0000  refin=true   refout=true 
 *** Second data set verified
CRC=$2a2c  Poly=$2817  init=$9bf3  xorout=$0000  refin=false  refout=true 
 *** Second data set verified
CRC=$2a2c  Poly=$2817  init=$da46  xorout=$ffff  refin=false  refout=true 
 *** Second data set verified
CRC=$2a2c  Poly=$4777  init=$1263  xorout=$0000  refin=false  refout=true 
 *** Second data set verified
CRC=$2a2c  Poly=$4777  init=$6f2d  xorout=$0000  refin=true   refout=true 
 *** Second data set verified
CRC=$2a2c  Poly=$4777  init=$a127  xorout=$ffff  refin=true   refout=true 
 *** Second data set verified
CRC=$2a2c  Poly=$4777  init=$dc69  xorout=$ffff  refin=false  refout=true 
 *** Second data set verified
CRC=$2c2a  Poly=$7354  init=$1dab  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$7354  init=$417e  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$7354  init=$a401  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$7354  init=$f8d4  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$8a23  init=$0fa0  xorout=$0000  refin=false  refout=true 
 *** Second data set verified
CRC=$2c2a  Poly=$8a23  init=$3f6a  xorout=$ffff  refin=false  refout=true 
 *** Second data set verified
CRC=$2c2a  Poly=$8a23  init=$cc70  xorout=$0000  refin=true   refout=true 
 *** Second data set verified
CRC=$2c2a  Poly=$8a23  init=$fcba  xorout=$ffff  refin=true   refout=true 
 *** Second data set verified
CRC=$2c2a  Poly=$9656  init=$3460  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$9656  init=$ff4b  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$a644  init=$195b  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$a644  init=$70ca  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$a644  init=$a3e8  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$a644  init=$ca79  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
===== done =====
也许可以试试看,看看它们是否适合你


祝你好运

你怎么知道所有19个字节都参与了散列计算?通过装置的LCD接口,我可以发送消息。这允许我更改19个“数据”字节中的任何一个。我不能完全控制字节中的每一位,但非常接近。它似乎不是16位CRC。检查值似乎是数据GF(2)上的线性函数。它可能类似于32位CRC的低两个字节。谢谢马克。我会做更多的窥探,并研究被截断的CRC-32的可能性。我看不到文本中的任何地方,你说什么设备是道歉,如果它在那里像白天一样清晰,但如果没有,它可以帮助了解设备的品牌和型号或任何芯片标记-只是从某人可能记得使用过的角度来看设备,可以给出提示,甚至可能有一个旧的数据表-这是一个远大的希望,但看起来你需要所有的帮助,你可以得到。
===== Result parameter sets =====
CRC=$2a2c  Poly=$2817  init=$3141  xorout=$ffff  refin=true   refout=true 
 *** Second data set verified
CRC=$2a2c  Poly=$2817  init=$70f4  xorout=$0000  refin=true   refout=true 
 *** Second data set verified
CRC=$2a2c  Poly=$2817  init=$9bf3  xorout=$0000  refin=false  refout=true 
 *** Second data set verified
CRC=$2a2c  Poly=$2817  init=$da46  xorout=$ffff  refin=false  refout=true 
 *** Second data set verified
CRC=$2a2c  Poly=$4777  init=$1263  xorout=$0000  refin=false  refout=true 
 *** Second data set verified
CRC=$2a2c  Poly=$4777  init=$6f2d  xorout=$0000  refin=true   refout=true 
 *** Second data set verified
CRC=$2a2c  Poly=$4777  init=$a127  xorout=$ffff  refin=true   refout=true 
 *** Second data set verified
CRC=$2a2c  Poly=$4777  init=$dc69  xorout=$ffff  refin=false  refout=true 
 *** Second data set verified
CRC=$2c2a  Poly=$7354  init=$1dab  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$7354  init=$417e  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$7354  init=$a401  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$7354  init=$f8d4  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$8a23  init=$0fa0  xorout=$0000  refin=false  refout=true 
 *** Second data set verified
CRC=$2c2a  Poly=$8a23  init=$3f6a  xorout=$ffff  refin=false  refout=true 
 *** Second data set verified
CRC=$2c2a  Poly=$8a23  init=$cc70  xorout=$0000  refin=true   refout=true 
 *** Second data set verified
CRC=$2c2a  Poly=$8a23  init=$fcba  xorout=$ffff  refin=true   refout=true 
 *** Second data set verified
CRC=$2c2a  Poly=$9656  init=$3460  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$9656  init=$ff4b  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$a644  init=$195b  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$a644  init=$70ca  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$a644  init=$a3e8  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
CRC=$2c2a  Poly=$a644  init=$ca79  xorout=$0000  refin=false  refout=true 
 *** Third  data set verified
===== done =====