需要帮助找出 chksum

逆向工程 部件 数学
2021-06-15 00:59:34

我正在查看一个 32 字节的序列,我认为 chksum 是第一个两个字节或最后一个 2 个字节(我倾向于最后 2 个字节)。我认为它是一个直接的 16 位异或,但我找不到与之抗衡的紧缩数字。也可能是 crc 或 citt,我不能肯定。

这里有 3 个数据包可以使用,任何帮助将不胜感激。

55 00 53 4D 34 34 51 49 00 00 00 00 00 00 4F 1F DF F1 00 00 00 00 00 00 00 00 00 00 00 00 C7 CC

16 02 53 4D 31 30 30 54 51 47 00 00 00 00 C8 7F A8 F4 00 00 00 00 00 00 00 00 00 00 00 00 41 F5

11 00 53 4D 34 38 44 00 00 00 00 00 00 00 69 DC 9C F3 00 00 00 00 00 00 00 00 00 00 00 00 F3 48

1个回答
unsigned int seed=0x3412;
unsigned int len=15;

unsigned int vec1[] = {
        0x5500,0x534D,0x3434,0x5149,0x0000,0x0000,0x0000,0x4F1F,0xDFF1,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
        // 0xC7CC
};

unsigned int vec2[] = {
        0x1602,0x534D,0x3130,0x3054,0x5147,0x0000,0x0000,0xC87F,0xA8F4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
        // 0x41F5
};

unsigned int vec3[] = {
        0x1100,0x534D,0x3438,0x4400,0x0000,0x0000,0x0000,0x69DC,0x9CF3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
        // 0xF348
};


// poly = 0xffff

unsigned int fcalc(int len, unsigned int s, unsigned int *v)
{
        unsigned int ret, i;

        ret = s;
        for (i=0; i<len; i++)
                ret ^= *v++;

        return ret;
}

main()
{
        unsigned int c;

        c = fcalc(len, seed, vec1);
        printf("c = %04x\n", c);

        c = fcalc(len, seed, vec2);
        printf("c = %04x\n", c);

        c = fcalc(len, seed, vec3);
        printf("c = %04x\n", c);

}

在此处输入图片说明