带校验和的解码算法

逆向工程 拆卸 解密 CRC 倾倒 内存转储
2021-06-11 11:48:07

我是新手,所以我请求你的帮助。

我必须解码来自设备的转储数据,因为我想尝试理解数据。

数据采用这种格式,一些信息是已知的:

7E 00 20 10 75 00 00 00 07 5F C7 6F 4F 01 05 C8 .. .. ..(每个数据包的其他一些相同的字节)

7e =开始取景(不改变)

20 =数据包长度(不变)

10 75 =数据包类型(不改变)

00 00 00 07 =增量编号,当它达到 00 00 00 FF 时,下一个是 00 00 01 00,当校验和失败时,设备以相同的编号重试。

5F C7 6F 4F hex timestamp(十六进制转换的unix时间戳)

01 ALTERNATING VALUE 01 或 21(此值在每个接收到的数据包上交替)

05 Mistery BYTE,我稍后会解释

C8校验和用增量数加十六进制时间戳计算,然后取模256,当交替值为21时减去0x03或当交替值设置为01时减去0x23。当结果值为负时,您必须丢弃所有FF FF和取最后一个字节。

问题是神秘字节。

乍一看似乎是:

当时间戳的最后一个字节大于校验和时,神秘字节为:06,否则为05。但有时此值为“07”

这是另一个例子:

7E 00 20 10 75 00 00 00 08 5F C7 71 73 21 06 0F .. .. ..

校验和计算方法:00+00+00+08+5F+C7+71=0x212(十进制530)

530 模 256 = 18

十进制 18 到十六进制 = 12

因为交替值是 21,我必须减去 0x3 -> 12 - 0x03 = 校验和 = 0F

现在校验和的最后一个字节 73 大于 0F,所以神秘字节的结果似乎是正确的 06

当 misery 字段有时是 07 时,问题就出现了。我认为这个值不仅仅是与时间戳的最后一个字节和校验和的比较,而且我错过了一些东西。

7E 00 20 10 75 00 00 00 87 5F C7 7B ED 21 07 12

7E 00 20 10 75 00 00 00 88 5F C7 7B FF 01 07 05

这里还有一些其他示例,似乎 06 与 07 交替出现:

7E 00 20 10 75 00 00 00 D0 5F C7 80 89 01 06直流

7E 00 20 10 75 00 00 00 D1 5F C7 80 8F 21 07 03

7E 00 20 10 75 00 00 00 D2 5F C7 80 95 01 06 EA

7E 00 20 10 75 00 00 00 D3 5F C7 80 96 21 07 0C

7E 00 20 10 75 00 00 00 D4 5F C7 80 9B 01 06 F2

但很快就会有很多行的 07

7E 00 20 10 75 00 00 00 D9 5F C7 80 A9 21 07 25

7E 00 20 10 75 00 00 00 DA 5F C7 80 AA 01 07 07

7E 00 20 10 75 00 00 00 DB 5F C7 80 AA 21 07 28

一些带有“05”神秘字节的例子。

7E 00 20 10 75 00 00 01 09 5F C7 82 00 21 05 AF

7E 00 20 10 75 00 00 01 0A 5F C7 82 05 01 05 95

7E 00 20 10 75 00 00 01 0B 5F C7 82 26 21 05 D7

7E 00 20 10 75 00 00 01 0C 5F C7 82 2C 01 05 BE

关于这个神秘字节的用途的任何线索?

1个回答

看起来它只是校验和的添加,在这方面做得很好。

神秘字节是校验和的一部分。

累加器是 2 个字节。

data = """0000AAAAAA7E00201075000000075FC76F4F0105C8
0000AAAAAA7E00201075000000875FC77BED210712
0000AAAAAA7E00201075000000885FC77BFF010705""".strip().split("\n")

import struct

for i,l in enumerate(data):
    xs = bytes.fromhex(l)
    body = xs[:-2]
    xsum = xs[-2:]

    v = 187
    for b in body:
        v+=b

    
    print("msg",i,"body",body.hex(),"checksum",xsum.hex(),"calcxsum",struct.pack(">H",v).hex())

跑:

$ python3 xsumtest.py 
msg 0 body 0000aaaaaa7e00201075000000075fc76f4f01 checksum 05c8 calcxsum 05c8
msg 1 body 0000aaaaaa7e00201075000000875fc77bed21 checksum 0712 calcxsum 0712
msg 2 body 0000aaaaaa7e00201075000000885fc77bff01 checksum 0705 calcxsum 0705