我有一个旧的,不再制造的带有串口的电子设备。我正在尝试对此设备中使用的数据包CRC /校验和/哈希进行逆向工程。
任何有敏锐眼光,有敏锐数学技能的人都可以破解这个东西吗?
这是我目前所知道的......
已验证我的数据包样本观察到上述网络链接中概述的“叠加原则”。这表明它们具有数学XOR关系。
开始感觉很好......但后来又难过了。无法确定CRC-16多项式。这些数据包哈希很可能不与CRC相关,而是一些家庭酿造方案。
阅读Ross N. Williams撰写的“CRC错误检测算法的无意义指南”
不幸的是,我无权访问任何设备源/二进制代码
还运行测试以查看是否使用了其他哈希值,例如Fletcher的校验和
以下是我的数据包的各种样本。
0x47366B2EE00000000000751CEB5F3469543B585E2D
0x47366B2ED00000000000751CEB5F3469543B582A2C
0x47366B2EC80000000000751CEB5F3469543B580B2B
0x47366B2EC40000000000751CEB5F3469543B58BB2A
0x47366B2EC20040000000751CEB5F3469543B58DFE7
0x47366B2EC10000000000751CEB5F3469543B58A328
0x47366B2EC08000000000751CEB5F3469543B584127
0x47366B2EC04000000000751CEB5F3469543B588126
0x47366B2EC02000000000751CEB5F3469543B580525
0x47366B2EC01000000000751CEB5F3469543B580124
请注意以下有关这些数据包的信息......
(0X47)......................................... ............................(0x2D)
我不知道我的系统是大端还是小端,但是确定的字节是LSB优先
请参阅数据包的0x47366B2E部分后面的数据字节。
只有模式我看到出现的是每个数据包上的最后一个字节递减一(2D,2C,...)。 (除了第5个数据包,我必须更改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 =====
也许试一试,看看它们是否适合你?
祝你好运!