逆向工程 ps2 游戏纹理文件格式 - 得到了大部分但有一些问题

逆向工程 文件格式
2021-06-18 15:02:42

我在这方面花了很多时间,取得了很大进展,但仍有几个问题需要解决。

我有这个旧的 PS2 游戏,就像任何好奇的人一样,我将光盘放入我的计算机并在我的十六进制编辑器中打开数据文件。

经过大量挖掘,我发现了一种嵌入在较大容器文件中的纹理文件格式。我使用一起破解的 python 脚本提取了这些纹理,并设法对很多文件进行了逆向工程。注意:它是小端。然后我继续编写解析这些文件的 C++ 代码,然后使用 imagemagick 将它们转换为 jpg 或 png。

图像本身使用索引颜色,即它有一个颜色调色板并使用索引来引用它们。到目前为止,我发现的所有图像中调色板的大小始终为 1024 字节(256 色),并附加到图像数据的末尾。

对我来说,其中一个棘手的部分是 alpha 值令人困惑。它们似乎在 0 到 0x80(十进制为 128)之间,但我不知道如何处理它们。如果我将所有 alpha 值覆盖为 0xFF,则图像会在没有“真实”alpha 通道的情况下正常显示,但我最终需要能够解析它,以便我可以得到准确的原始图像。保留 alpha 值在技术上会导致转换失败,图像看起来不受欢迎。这是我的意思的一个例子:http : //imgur.com/a/GrkOQ

到目前为止,这是我设法逆向工程并编码到我的解析器中的当前结构

struct Header
{
    char header[4];
    unsigned long imageOffset;
    unsigned long paletteOffset;
    unsigned long fileSize;
    unsigned short width, height;
    char unknowndata[10];
    unsigned short id;
};

union colourU{
    unsigned long hex;
    unsigned char rgba[sizeof(long)];
};

struct Palette
{
    colourU colour[256];
};

我最近在反转标题中的未知数据方面取得了一些进展,但并不多。这是标题的示例

4B 32 54 78 20 00 00 00 20 00 01 00 20 04 01 00 00 01 00 01 00 00 00 00 05 00 05 00 00 00 02 00

前四个字节4B 32 54 78是一个魔法字符串 'K2Tx'

然后是imageOffset20 00 00 00和paletteOffset20 00 01 00

文件大小 20 04 01 00

再有就是00 0100 01其宽度和图像的高度(256×256)

未知字节部分是 0xA 字节长,可以被 2 整除,但不能被 4 整除。这对我说它要么是短裤,要么是其他东西。我不确定如何在不进入游戏代码的情况下真正理解这些字节。

我希望有人能够通过为我指明正确的方向来帮助我。

所有这些工作都是通过观察许多不同的示例文件完成的,我真的不想拿出反汇编器查看代码,尽管我可能在某些时候不得不这样做。(其 MIPS III)

如果您需要完整的文件样本,请告诉我

- - 更新 - -

我决定为游戏命名 - 天诛:致命阴影

在弄乱模拟器和作弊引擎之后,设法发现了一些东西。

未知数据的前两个字节实际上是某种像素 x 旋转,然后接下来的两个是 y 旋转。当我改变它们时,纹理像素会改变屏幕上的像素位置(在它们的边界内旋转)。

这可能不是那么重要,因为它们通常设置为零。

接下来的两个字节和之后的两个字节都是shorts,但我不确定它们到底是做什么的。当我改变它们时,整个纹理变得奇怪,它破坏了游戏本身的一些内存,可能是某种或偏移或数组索引。

鉴于这些可能只在游戏的内存上下文中使用,我现在将忽略这些

最初未知块的最后两个字节只是某种交错标志(猜测),如果将其设置为 0x02 或二进制 b10 则为真。这很有趣,因为我发现了一些采用这种格式的纹理。通常这些是在游戏中的 3d 模型上使用的。这是这些http://imgur.com/gallery/7VpZm 的2 个 jpg 示例 也许某种像素交错?

评论中有一个示例的链接

0个回答
没有发现任何回复~