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