这个数字序列是什么意思?

逆向工程 静态分析 加密 十六进制
2021-06-26 16:29:09

所以我正在反转游戏的文件格式。据我所知,我试图反转的文件包含压缩纹理。我已经能够找到纹理并解压缩它们,但我不完全确定它是压缩还是一些奇怪的编码。

在这个过程中,有一个巨大的缓冲区被访问了很多次,给出了当前正在绘制的像素的信息。缓冲区包含 4 字节无符号整数,并通过以下函数生成:

for(uint32_t counter = 0; counter<0x400; counter++){

    //unk1 eax
    //unk2 edx
    //unk3 esi
    //unk4 ecx
    //loc_5115EB
    uint32_t unk1 = (counter >> 1) & 0x55555555;
    uint32_t unk3 = (unk1 * 2) ^ counter;
    uint32_t unk4 = ((unk3 >> 2) & 0x33333333) ^ ((counter >> 1) & 0x11111111);

    unk1 ^= unk4;
    unk3 ^= (unk4 << 2);

    unk4 = ((unk3 >> 4) & 0x0F0F0F0F) ^ (unk1 & 0x0F0F0F0F);
    unk1 ^= unk4;
    unk3 ^= (unk4 << 4);

    unk4 = ((unk3 >> 8) & 0x00FF00FF) ^ (unk1 & 0x00FF00FF);

    buffer[counter] = (((unk4 & 0xFF) << 8) ^ (unk3 & 0xFFFF)) | ((unk4 ^ unk1) << 16); 

}

十六进制的结果序列是:

00 00 00 00 01 00 00 00 04 00 00 00 05 00 00 00 10 00 00 00 11 00 00 00 14 00 00 00 15 00 00 00 40 00 00 00 41 00 00 00 44 00 00 00 45 00 00 00 50 00 00 00 51 00 00 00 54 00 00 00 55 00 00 00 00 01 00 00 01 01 00 00 04 01 00 00 05 01 00 00 10 01 00 00 11 01 00 00 14 01 00 00 15 01 00 00 40 01 00 00 41 01 00 00 44 01 00 00 45 01 00 00 50 01 00 00 51 01 00 00 54 01 00 00 55 01 00 00 00 04 00 00 01 04 00 00 04 04 00 00 05 04 00 00 10 04 00 00 11 04 00 00 14 04 00 00 15 04 00 00

或十进制 0, 1, 4, 5, 16, 17, 20, 21, 64, 65...

我试图在线搜索它,但找不到有关序列的任何信息。但我发现 0x55555555 和其他数字是“魔术”数字,用途广泛。

1个回答

问一个比我知识渊博的人,他能够回答!

这是Moser-de Bruijn 序列,看起来它用于二进制交织,这在这种情况下非常重要,因为我正在处理图像压缩。

顺便说一句,我必须道歉,因为我应该发布一个更重要的序列十进制表示,现在已添加到主要帖子中。