照例,是用HEDIT打開一個PKX文件來看。
開頭是一句話,這個文件格式是一個叫做ZERO的程序員創(chuàng)建的,仰視ZERO三秒!接下來繼續(xù)。
從MOTIONDATA這個文件夾來看,這里面都是動畫動作相關(guān)的數(shù)據(jù)。在HEDIT里面,可以看到PKX里面有很多動作的名字。然后,跳過這些動作名字,可以看到熟悉的"DFX"三個字母,那些都是TGL文件。
取得DFX的OFS,在前面的表里查找,不過令人失望,里面找不到。
拉到文件尾,很多包裹文件都把文件列表放在文件尾。這時,我們看到了以字母順序排列的動作表。從第一個名字向上找,找到一個DFX,就是TGL文件,我們按照TGL文件格式往下推導(dǎo),結(jié)束點正好在第一個名字前面。所以我們可以得到文件列表數(shù)據(jù)接口的起點,就是名字的第一個字節(jié)開始。
我繼續(xù)往下找到第二個名字,計算下兩個名字的距離是284字節(jié)。根據(jù)名字長度沒有標(biāo)記來判斷,這個文件列表是固定長度的數(shù)據(jù)結(jié)構(gòu)。
繼續(xù),根據(jù)文件頭上那個表的第一個元素的名字猜測,他的數(shù)據(jù)在第一個DFX文件處。我找到第一個元素的文件列表中的數(shù)據(jù),對比他的DFX文件數(shù)據(jù)的OFS和LENGTH,發(fā)現(xiàn)它的OFS和LENTH保存在文件列表數(shù)據(jù)結(jié)構(gòu)的第0x104位置。從那里開始,順序存儲著64位的Ofs和32位的原始大小,以及32位的壓縮后大小。當(dāng)然這只是猜測。
接下來,我計算了下尾部的所有文件列表數(shù)據(jù)的長度,除以單個列表數(shù)據(jù)結(jié)構(gòu)長度,得到了一個文件數(shù)目。然后,回到頭部,來尋找這個數(shù)據(jù)。
很顯然,肯定有這個數(shù)據(jù)的。最終我在 ofs為0x108的地方找到了,是一個32位的整數(shù)。而他前面,是64位的包文件總長度。用這兩個,加上文件列表的數(shù)據(jù)結(jié)構(gòu)長度,就可以定位到文件列表的位置了。
好了,有了以上數(shù)據(jù),PKX文件就可以解開了。不過仍然還有很多數(shù)據(jù)是未知含義的,不過這不影響我們解開PKX文件。下面是文件格式的整體描述:
@packinfo(0x100) {
int64 = packsize
int32 = filecount
int32 = 0
int32 = 2
} * 1
@filedata {}
@infotable(packsize-filecount*284) {
char[10] = name
@filepos(+0x104) {
int64 = offset
int32 = originsize
int32 = compresssize
}
} * filecount
這次挺簡單的,就沒工具了。最后再說下,解出來的是TGL文件。