串行协议的反向校验和

逆向工程 去混淆 解密 密码分析
2021-07-09 00:55:29

我正在尝试对压缩机的串行协议进行逆向工程,但我没有计算校验和。

例如,这里有一些消息,包括消息末尾的 16 位校验和。

ff 02 ff 01 10 00 10 00 41 9e e2
ff 02 ff 01 10 00 10 00 42 9d e3
02 fe 03 00 00 00 00 00 00 fd c1
00 铁 02 83 01 10 00 00 00 00 6c c1

现在我知道以下八位字节

00 目标地址
fe 好像是一个分隔符
02 自己的地址
83寄存器地址
01 value1 高
10 value1 低
00 value2 高
00 值 2 低
00 value3 高
00 值 3 低
6c 校验和
c1 校验和

我试图用不同的 16 位 CRC 计算校验和,并用“报复”进行蛮力计算,但遗憾的是我没有运气。

也没有办法将自己的位放入校验和函数中,但我可以提供额外的消息。

有人可以帮忙吗?

1个回答

第一个字节是一个简单的校验和变体。在 C 中:

uint8_t firstbyte( uint8_t const *data, size_t bytes )
{
    uint8_t sum;
    for (sum = 0; bytes; --bytes)
        sum -= *data++;
    return sum;
}

第二个字节是一个移位并添加类似 BSD 校验和的东西:

uint8_t secondbyte( uint8_t const *data, size_t bytes )
{
    uint8_t sum;
    for (sum = 0; bytes; --bytes) {
        sum = (sum << 1) | ((sum & 0x80) ? 1 : 0);
        sum += *data++;
    }
    return sum;
}