蛮力或计算串行 RS232 校验和
Brute Force or Calculate Serial RS232 Checksums
我正在通过引导加载程序与控制面板通信,并且捕获了一些串行数据。它看起来采用修改后的 API 格式,每个命令的开头和结尾都是 7E
。
我似乎无法确定 CRC 是如何计算的。基于 API 格式,第一个字节构成消息,第二个和第三个字节是消息的长度,第四个字节看起来是命令的类型。接下来的几个字节是数据地址或请求的内容,倒数第三个字节和倒数第二个字节看起来是校验和,最后一个字节包含 7E
以关闭帧。
我找到了一些其他帖子,这些帖子是用 docklight 脚本回答的,该脚本使用一些标准的 CRC 类型强制执行 CRC,但这些脚本不适用于我的数据。
下面的一些示例消息
对引导加载程序的查询:
7e 07 00 0d 24 12 7f 00 40 00 e1 3b 7e
7e 07 00 1a 00 d0 3e 00 70 00 ad 3d 7e
7e 01 00 1f 0e 18 7e
7e 07 0 0d 34 00 7f 00 04 00 9f fa 7e
7e 0a 00 18 00 00 00 00 00 00 80 7b 00 83 c0 7e
引导加载程序的响应(随机,这些不是基于上述查询的响应)
7e 41 00 85 0b 03 03 03 04 00 03 03 00 03 00 00 07 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 45 9e 7e
7e 05 00 85 da 8c 66 01 e3 ce 7e
有人有什么建议吗?
编辑 2021 年 11 月 2 日
下面是一些附加信息。
7e 0a 00 18 00 00 80 00 00 00 00 01 00 c6 47 7e ~.....€......ÆG~
7e 0a 00 18 00 00 00 00 00 00 80 7b 00 83 c0 7e ~.........€{.ƒÀ~
These Commands appear to use
Polynomial: 1021
Initial Value: 2241
Final Xor: 0
Refin = True
RefOut= True
CRC Data Length = 12 Bytes
7e 07 00 0d 00 6a 4e 00 00 08 99 7b 7e ~....jN...™{~
7e 07 00 0d 00 72 4e 00 90 00 ec 00 7e ~....rN..ì.~
7e 07 00 0d 34 00 7f 00 04 00 9f fa 7e ~...4....Ÿú~
7e 07 00 0d 24 12 7f 00 40 00 e1 3b 7e ~...$..@.á;~
7e 07 00 1a 00 d0 3e 00 70 00 ad 3d 7e ~....Ð>.p.=~
7e 07 00 0d 00 5a 4e 00 00 08 48 af 7e ~....ZN...H¯~
7e 07 00 0d 00 62 4e 00 00 08 b9 21 7e ~....bN...¹!~
These Commands appear to use
Polynomial: 1021
Initial Value: 0daa
Final Xor: 0
Refin = True
RefOut= True
CRC Data Length = 9 Bytes
7e 02 00 14 00 b6 fd 7e ~....¶ý~
7e 02 00 14 01 3f ec 7e ~....?ì~
7e 02 00 14 02 a4 de 7e ~....¤Þ~
7e 02 00 14 03 2d cf 7e ~....-Ï~
7e 02 00 14 04 92 bb 7e ~....’»~
7e 02 00 14 05 1b aa 7e ~.....ª~
7e 02 00 14 06 80 98 7e ~....€˜~
7e 02 00 14 07 09 89 7e ~.....‰~
7e 02 00 14 08 fe 71 7e ~....þq~
7e 02 00 14 09 77 60 7e ~....w`~
7e 02 00 14 0a ec 52 7e ~....ìR~
7e 02 00 14 0b 65 43 7e ~....eC~
7e 02 00 14 0c da 37 7e ~....Ú7~
7e 02 00 14 0d 53 26 7e ~....S&~
7e 02 00 14 0e c8 14 7e ~....È.~
7e 02 00 14 0f 41 05 7e ~....A.~
7e 02 00 14 10 37 ed 7e ~....7í~
7e 02 00 14 11 be fc 7e ~....¾ü~
7e 02 00 14 12 25 ce 7e ~....%Î~
7e 02 00 14 13 ac df 7e ~....§~
7e 02 00 14 14 13 ab 7e ~.....«~
7e 02 00 14 15 9a ba 7e ~....šº~
These Commands appear to use
Polynomial: 1021
Initial Value: 90F8
Final Xor: 0
CRC Data Length = 4 Bytes
因此,用于计算 CRC 的初始值根据消息长度而变化,不包括帧字节 7e 和开始和结束,以及 2 个 CRC 字节。
我想我可以尝试发送一些导致不同消息长度的请求,并使用该方法计算 CRC,直到我认为我需要的任何消息大小。
您需要在 CRC 计算中不包括前两个字节(长度)。然后你会发现初始值为0xffff
,最后异或为0xffff
.
我正在通过引导加载程序与控制面板通信,并且捕获了一些串行数据。它看起来采用修改后的 API 格式,每个命令的开头和结尾都是 7E
。
我似乎无法确定 CRC 是如何计算的。基于 API 格式,第一个字节构成消息,第二个和第三个字节是消息的长度,第四个字节看起来是命令的类型。接下来的几个字节是数据地址或请求的内容,倒数第三个字节和倒数第二个字节看起来是校验和,最后一个字节包含 7E
以关闭帧。
我找到了一些其他帖子,这些帖子是用 docklight 脚本回答的,该脚本使用一些标准的 CRC 类型强制执行 CRC,但这些脚本不适用于我的数据。
下面的一些示例消息
对引导加载程序的查询:
7e 07 00 0d 24 12 7f 00 40 00 e1 3b 7e
7e 07 00 1a 00 d0 3e 00 70 00 ad 3d 7e
7e 01 00 1f 0e 18 7e
7e 07 0 0d 34 00 7f 00 04 00 9f fa 7e
7e 0a 00 18 00 00 00 00 00 00 80 7b 00 83 c0 7e
引导加载程序的响应(随机,这些不是基于上述查询的响应)
7e 41 00 85 0b 03 03 03 04 00 03 03 00 03 00 00 07 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 45 9e 7e
7e 05 00 85 da 8c 66 01 e3 ce 7e
有人有什么建议吗?
编辑 2021 年 11 月 2 日
下面是一些附加信息。
7e 0a 00 18 00 00 80 00 00 00 00 01 00 c6 47 7e ~.....€......ÆG~
7e 0a 00 18 00 00 00 00 00 00 80 7b 00 83 c0 7e ~.........€{.ƒÀ~
These Commands appear to use
Polynomial: 1021
Initial Value: 2241
Final Xor: 0
Refin = True
RefOut= True
CRC Data Length = 12 Bytes
7e 07 00 0d 00 6a 4e 00 00 08 99 7b 7e ~....jN...™{~
7e 07 00 0d 00 72 4e 00 90 00 ec 00 7e ~....rN..ì.~
7e 07 00 0d 34 00 7f 00 04 00 9f fa 7e ~...4....Ÿú~
7e 07 00 0d 24 12 7f 00 40 00 e1 3b 7e ~...$..@.á;~
7e 07 00 1a 00 d0 3e 00 70 00 ad 3d 7e ~....Ð>.p.=~
7e 07 00 0d 00 5a 4e 00 00 08 48 af 7e ~....ZN...H¯~
7e 07 00 0d 00 62 4e 00 00 08 b9 21 7e ~....bN...¹!~
These Commands appear to use
Polynomial: 1021
Initial Value: 0daa
Final Xor: 0
Refin = True
RefOut= True
CRC Data Length = 9 Bytes
7e 02 00 14 00 b6 fd 7e ~....¶ý~
7e 02 00 14 01 3f ec 7e ~....?ì~
7e 02 00 14 02 a4 de 7e ~....¤Þ~
7e 02 00 14 03 2d cf 7e ~....-Ï~
7e 02 00 14 04 92 bb 7e ~....’»~
7e 02 00 14 05 1b aa 7e ~.....ª~
7e 02 00 14 06 80 98 7e ~....€˜~
7e 02 00 14 07 09 89 7e ~.....‰~
7e 02 00 14 08 fe 71 7e ~....þq~
7e 02 00 14 09 77 60 7e ~....w`~
7e 02 00 14 0a ec 52 7e ~....ìR~
7e 02 00 14 0b 65 43 7e ~....eC~
7e 02 00 14 0c da 37 7e ~....Ú7~
7e 02 00 14 0d 53 26 7e ~....S&~
7e 02 00 14 0e c8 14 7e ~....È.~
7e 02 00 14 0f 41 05 7e ~....A.~
7e 02 00 14 10 37 ed 7e ~....7í~
7e 02 00 14 11 be fc 7e ~....¾ü~
7e 02 00 14 12 25 ce 7e ~....%Î~
7e 02 00 14 13 ac df 7e ~....§~
7e 02 00 14 14 13 ab 7e ~.....«~
7e 02 00 14 15 9a ba 7e ~....šº~
These Commands appear to use
Polynomial: 1021
Initial Value: 90F8
Final Xor: 0
CRC Data Length = 4 Bytes
因此,用于计算 CRC 的初始值根据消息长度而变化,不包括帧字节 7e 和开始和结束,以及 2 个 CRC 字节。
我想我可以尝试发送一些导致不同消息长度的请求,并使用该方法计算 CRC,直到我认为我需要的任何消息大小。
您需要在 CRC 计算中不包括前两个字节(长度)。然后你会发现初始值为0xffff
,最后异或为0xffff
.