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

时间:2014-04-04 01:58:23

标签: hash checksum crc crc16 error-detection

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

任何有敏锐眼光,有敏锐数学技能的人都可以破解这个东西吗?

这是我目前所知道的......

  • 每个数据包总是21个字节。对于CRC / checksum / hash
  • ,19字节数据加上2字节结尾
  • 因此,这里没有长度或头部字节。哈希计算中涉及所有19个字节。
  • 我有能力使用设备生成一定数量的数据包
  • 我的第一个想法是数据包具有某种CRC-16计算
  • 所以我跟着在www.cosc.canterbury.ac.nz/greg.ewing/essays/CRC-Reverse-Engineering.html
  • 中反转了提示
  • 已验证我的数据包样本观察到上述网络链接中概述的“叠加原则”。这表明它们具有数学XOR关系。

  • 开始感觉很好......但后来又难过了。无法确定CRC-16多项式。这些数据包哈希很可能不与CRC相关,而是一些家庭酿造方案。

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

  • 请参阅http://www.ross.net/crc/download/crc_v3.txt
  • 也用于应用程序:CRC Reveng - 逆向工程应用程序
  • 请参阅reveng.sourceforge.net
  • 仍然没有运气......
  • 不幸的是,我无权访问任何设备源/二进制代码

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

以下是我的数据包的各种样本。

  

0x47366B2EE00000000000751CEB5F3469543B585E2D
  0x47366B2ED00000000000751CEB5F3469543B582A2C
  0x47366B2EC80000000000751CEB5F3469543B580B2B
  0x47366B2EC40000000000751CEB5F3469543B58BB2A
  0x47366B2EC20040000000751CEB5F3469543B58DFE7
  0x47366B2EC10000000000751CEB5F3469543B58A328
  0x47366B2EC08000000000751CEB5F3469543B584127
  0x47366B2EC04000000000751CEB5F3469543B588126
  0x47366B2EC02000000000751CEB5F3469543B580525
  0x47366B2EC01000000000751CEB5F3469543B580124

请注意以下有关这些数据包的信息......

  • 在数据包的最后2个字节上找到CRC。
  • 如果我查看逻辑分析仪上的位,我已将字节表示为MSB-first
  • 因此,数据包0x47366B2EE00000000000751CEB5F3469543B585E2D在二进制文件中显示为:
  • 01000111 .............................................. ............... 00101101
  • (0X47)......................................... ............................(0x2D)

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

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

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

  • 这最后一个字节不是某种序列号,因为我可以随时以相同的值生成它们。
  • 但它可能会暗示使用的数学哈希。

感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

如果它遵循简单的XOR关系(校验和(A ^ B)==校验和(A)^校验和(B))那么就有一个简单的强力解决方案!

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

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

0b0000000 => c(-1)

步骤2.实验:观察所有二进制序列的校验和c(i),其中单个1位于 i

0b00000001 => c(0)
0b00000010 => c(1)
0b00000100 => c(2)
0b00001000 => c(3)
0b00010000 => c(4)
0b00100000 => c(5)
0b01000000 => c(6)
0b10000000 => c(7)

您观察到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)

即。对于要输出的每一位,只需异或者累加该位的已知校验和。

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

答案 1 :(得分:0)

我通过名为“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 =====

也许试一试,看看它们是否适合你?

祝你好运!