25

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

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

这是我到目前为止所知道的......

  • 每个数据包总是 21 个字节。19 个字节的数据加上 2 个字节用于 CRC/校验和/哈希
  • 因此,这里没有长度或标题字节。哈希计算涉及所有 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 位)

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

任何帮助表示赞赏!

4

2 回答 2

1

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

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

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

0b0000000 => c(-1)

步骤 2. 实验:观察所有二进制序列在位置i处的校验和 c(i),其中有一个 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)

您观察到的校验和的值形成了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 个校验和,你可能还会在这个过程中发现一个简单的模式,它解释了校验和是如何来自基向量的。:) 如果是这样的话,把它发回这里会很好!(也许告诉我们我们正在逆转什么?)

于 2014-12-03T08:04:04.830 回答
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 =====

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

祝你好运!

于 2015-11-10T04:11:47.420 回答