试图找出 Fluke 233 无线显示万用表的 CRC 或校验和

逆向工程 CRC
2021-06-29 01:06:48

下载并编译CRC_reveng,但没有找到任何解决方案。也许我想多了?不知道在计算之前或之后可能对数据或 CRC 执行的太多其他技巧,我正在寻找指导。我尝试省略起始字节,并尝试了 8 位和 16 位宽度。没有运气。下面是一些示例数据包:

10020200C6FE2D00C5FE2D00047C000010038CEC 
10020200C5FE2D00C6FE2D00046D00001003DFA4 
10020200C6FE2D00C5FE2D00015B00531003C1C4 
10020200C5FE2D00C6FE2D0001A405534B000D004B1003F50D 
10020200C6FE2D00C5FE2D00047D00001003C7E7 
10020200C5FE2D00C6FE2D00046E0000100313B9
10020200C6FE2D00C5FE2D00015C155344000000000000000000008C4C08080000040D00201003BC41
10020200C5FE2D00C6FE2D0001A505534B000D004B1003D221

显示的数据是 Fluke 233 IR 端口的两个方向(每隔一行来自显示器或万用表本身)。似乎“C6FE2D00”和“C5FE2D00”可能是显示器和万用表本身的标识符,因为您会在每隔一行看到相同的模式。数据是用 DSLogic 逻辑分析仪收集的,看起来数据只是 19200 波特,8 位,没有奇偶校验。最常见的是,数据包的长度为 20 个字节,但正如您所见,情况并非总是如此。

任何想法我可能会如何继续reveng -w 16 -s [data]并且reveng -w 8 -s [data]不出现任何东西?

如果其他人拥有 Fluke 233 并且感觉像是嗅出相同的数据线来比较笔记,那会很棒。我也想知道无线显示器是否有唯一标识符,或者您是否可以简单地在设备之间更换显示器。

1个回答

您的算法可能如下:

width=16  poly=0x1021  init=0xffff  refin=true  refout=true  xorout=0xffff  check=0x906e  name="X-25"

对除前两个字节和后两个字节(CRC)之外的整个数据包进行操作。

玩巴卡鲁

如果 CRC RevEng 等 CRC 分析工具拒绝一组代码字,则值得从最小的一组开始并添加代码字,直到一个被拒绝,或者达到所需的确认强度。我只尝试使用 20 字节的数据包以避免任何并发症;前两个有结果,前三个也有结果,前四个没有。如果我跳过第四个数据包并添加第五个数据包,我仍然会得到答案:

$ reveng -w 16 -s "10020200C6FE2D00C5FE2D00047C000010038CEC" "10020200C5FE2D00C6FE2D00046D00001003DFA4" "10020200C6FE2D00C5FE2D00015B00531003C1C4" "10020200C5FE2D00C6FE2D00046E0000100313B9"
width=16  poly=0x1021  init=0xb37a  refin=true  refout=true  xorout=0x0000  check=0x006b  name=(none)

随机是罕见的

现在我有足够的信心尝试不同长度的数据包来获取 Init 和 XorOut。

$ reveng -w 16 -s "10020200C6FE2D00C5FE2D00047C000010038CEC" "10020200C5FE2D00C6FE2D00046D00001003DFA4" "10020200C6FE2D00C5FE2D00015B00531003C1C4" "10020200C5FE2D00C6FE2D00046E0000100313B9" "10020200C5FE2D00C6FE2D0001A405534B000D004B1003F50D"
width=16  poly=0x1021  init=0x7c90  refin=true  refout=true  xorout=0x07f0  check=0x5902  name=(none)
width=16  poly=0x1021  init=0x8c8f  refin=true  refout=true  xorout=0xffff  check=0x5902  name=(none)

对于这个多项式,得到一对结果是正常的。请注意 Check 值是相同的,因为这两个模型会产生相同的结果。其中之一具有xorout=0xffff,令人放心,因为它是典型的 XorOut 值。不过对应的Init值,0x8c8f有点出乎意料,但也不是不可能。

每当 Init 或 XorOut 值看起来“随机”时,值得再次查看数据包格式,以防某些字节毕竟没有进入 CRC 算法。这些意外的字节会抛出搜索代码并强制 Init 和/或 XorOut 值进行调整以适应它们。

我尝试从每个数据包的开头删除相同数量的字节,直到我得到这个:

$ reveng -w 16 -s "0200C6FE2D00C5FE2D00047C000010038CEC" "0200C5FE2D00C6FE2D00046D00001003DFA4" "0200C6FE2D00C5FE2D00015B00531003C1C4" "0200C5FE2D00C6FE2D00046E0000100313B9" "0200C5FE2D00C6FE2D0001A405534B000D004B1003F50D"
width=16  poly=0x1021  init=0xffff  refin=true  refout=true  xorout=0xffff  check=0x906e  name="X-25"

CRC RevEng 正在搜索预设模型并找到匹配的模型;该命令可以重复使用-F以表明它没有袖手旁观。如上所述,该算法将与其功能相同的别名一起重新出现。因此,我们可以说我们之前拒绝的数据包可能有一个错字:

$ reveng -m x-25 -c 0200C6FE2D00C5FE2D00047D00001003
c8e7