所以我正在反转游戏的文件格式。据我所知,我试图反转的文件包含压缩纹理。我已经能够找到纹理并解压缩它们,但我不完全确定它是压缩还是一些奇怪的编码。
在这个过程中,有一个巨大的缓冲区被访问了很多次,给出了当前正在绘制的像素的信息。缓冲区包含 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 和其他数字是“魔术”数字,用途广泛。