上午公司斷網(wǎng),晚上失眠頭痛沒精神,于是隨便打開了DNF游戲目錄下的資源文件。以
前一直對(duì)提取游戲資源存在好奇,需要對(duì)一些關(guān)鍵字節(jié)猜測(cè)其加密方式。
DNF游戲目錄下soundpacks下的npk文件看起來似乎比較簡(jiǎn)單,這里直接給出文件格式,
懶得寫分析思路了。
文件開頭的十六個(gè)字節(jié)是一個(gè)固定字符串:NeoplePack_Bill\0。
接下來四個(gè)字節(jié)表示本npk文件里打包了多少個(gè)WAV文件。npk文件是一個(gè)包含了很多聲
音或者圖片的打包文件。類似這種打包文件,一般文件頭都會(huì)保存一個(gè)文件列表。而這個(gè)列
表里又會(huì)附加上偏移量和大小等信息。
接下來的數(shù)據(jù)就是這里所說的列表。每一個(gè)列表項(xiàng)包含三個(gè)數(shù)據(jù)域:偏移、大小、文件
名。如下示意:
NeoplPack_Bill\0 (16 bytes)
file_count( 4 bytes)
item1:offset(4 bytes), size(4 bytes)
item2:offset(4 bytes), size(4 bytes)
...
itemn:offset(4 bytes), size(4 bytes)
...
文件列表之后,就是具體的每個(gè)文件的內(nèi)容。開始我還在擔(dān)心npk會(huì)為每一個(gè)聲音文件
加密。或者只保存聲音文件的具體數(shù)據(jù),而聲音文件文件頭則只保存一份(因?yàn)樗形募?br>文件頭很有可能全部是一樣的)。后來稍微搜索了下WAV的格式,只需要比對(duì)下npk中某一個(gè)
文件內(nèi)容的頭部是否和WAV格式的頭部相同,就可以基本斷定其是否加密。
結(jié)果是,npk對(duì)包內(nèi)的每一個(gè)WAV文件沒做加密。
然后立即寫了個(gè)程序,根據(jù)文件列表中的偏移值和大小值,將每一個(gè)WAV單獨(dú)取出來,就
OK了。
完整的格式為:
NeoplPack_Bill\0 (16 bytes)
file_count( 4 bytes)
item1:offset(4 bytes), size(4 bytes)
item2:offset(4 bytes), size(4 bytes)
...
itemn:offset(4 bytes), size(4 bytes)
file1
file2
...
filen
我想圖片資源也應(yīng)該差不多,不過圖片資源肯定要復(fù)雜些。下午公司網(wǎng)絡(luò)好了,網(wǎng)上搜
索了下,發(fā)現(xiàn)居然已經(jīng)有了DNF資源提取工具了,唉。
提供下源代碼和MingW編譯好的可執(zhí)行文件,另聲明:本文及相關(guān)工具代碼只作學(xué)習(xí)研究
用,任何后果與作者無關(guān)。