反向工程师UPS串行协议:校验和/ CRC?

问题描述 投票:1回答:1

我收到了一个APC SMC1000 UPS设备,该设备要用于为基于微控制器的应用程序供电,并在关闭之前执行一些任务。 UPS具有串行端口和USB端口,但是似乎没有记录串行端口协议。由于USB主机不在uC上,因此我想使用串行端口与之通信。

使用Python脚本四处摸索后,UPS开始讲话,我可以识别一些信息。但是,最终似乎还是希望在继续之前先返回一条消息,因此我想弄清楚该怎么做。

UPS总是发送19个字节的消息,其中第一个字节是ID,其次是16个字节的数据,然后大概2个字节的某些未知校验和或CRC。

[ Msg ID | 16 byte data | 2 byte checksum? ]

如何得出CRC或校验和类型?我已经尝试了一些方案,并最终在ID为7f的以下消息上使用了Reveng而不运气:

0x7f 0000000019c90013004e000001790000 3190
0x7f 0000000019ca0013004e000001790000 259b
0x7f 0000000019cb0013004e000001790000 19a6
0x7f 0000000019cc0013004e000001790000 0db1
0x7f 0000000019cd0013004e000001790000 01bc
0x7f 0000000019ce0013004e000001790000 f4c7
0x7f 0000000019cf0013004e000001790000 e8d2
0x7f 0000000019d00013004e000001790000 dcdd
0x7f 0000000019d10013004e000001790000 d0e8
0x7f 0000000019d20013004e000001790000 c4f3
0x7f 0000000019d30013004e000001790000 b8fe
0x7f 0000000019d40013004e000001790000 ac0e
0x7f 0000000019d50013004e000001790000 a015
0x7f 000000001c67001500530000017c0000 5eb8

任何有帮助的想法将不胜感激!

reverse-engineering checksum crc ups
1个回答
0
投票

我在此上花费了太多时间。但是,嘿,一旦您跌入兔子洞...

由于@rcgldr,我避免了寻找CRC检查,而是决定查找各种简单的校验和。最终,我得到了一个Python脚本,该脚本在上面的示例中运行各种校验和,并将其与最后2个字节进行比较。直到我将第一个字节添加到校验和中,这才给我带来了Fletcher的8位校验和。我为此使用了https://github.com/njaladan/hashpy中的代码。

7f0000000019c90013004e000001790000 0x3190 PASS
7f0000000019cb0013004e000001790000 0x19a6 PASS
7f0000000019cc0013004e000001790000 0xdb1 PASS
7f0000000019cd0013004e000001790000 0x1bc PASS
7f0000000019ce0013004e000001790000 0xf4c7 PASS
7f0000000019cf0013004e000001790000 0xe8d2 PASS
7f0000000019d00013004e000001790000 0xdcdd PASS
7f0000000019d10013004e000001790000 0xd0e8 PASS
7f0000000019d20013004e000001790000 0xc4f3 PASS
7f0000000019d30013004e000001790000 0xb8fe PASS
7f0000000019d40013004e000001790000 0xac0a FAIL
7f0000000019d50013004e000001790000 0xa015 PASS
7f000000001c67001500530000017c0000 0x5eb8 PASS

它还显示其中一个样本的校验和无效。不幸的是,我给人的印象是消息7f对主机来说是一种挑战字符串。也许我也可以解决这个难题:)

协议ID

到目前为止,我还只是通过检查数据并搜索APC PowerChute报告的值来标识了几个消息ID。>>

  • 0x00:带有协议信息的标头(16个字节)
    • 字节0:未知(我检查的设备始终为0A,也许是协议版本?)
    • 字节1:味精大小
    • 字节2:可用ID
  • 0x40:序列号(14字节)
  • 0x41:单元名称
  • 0x43:单位类型
  • 0x45:固件版本1
  • 0x46:固件版本2
  • 0x48:电池更换代码
  • 0x49:制造商
  • 0x7e:挑战的一部分(至)
  • 0x7f:挑战的一部分(来自)
  • 也许我会随着进度更新此列表

    更新9/11/2019

    我正在记录我在https://sites.google.com/site/klaasdc/apc-smartups-decode上的进度

    © www.soinside.com 2019 - 2024. All rights reserved.