淺談網絡游戲《天龍X部》的文件加密格式
轉自:http://bbs.sjtu.edu.cn/bbsgcon?board=Crack&file=G.1182450997.A發信人: aSB (Go), 信區: Crack
標 題: 淺談網絡游戲《天龍X部》的文件加密格式
發信站: 飲水思源 (2007年06月22日02:36:37 星期五)
作者:aSB@bbs.sjtu
三月份時玩了某狐公司的網絡游戲《天龍X部》,感覺還是蠻有意思的,遂研究了一下。
這個游戲是利用開源游戲引擎OGRE進行開發的,看了一下目錄里面的文件結構,主要的數
據都放在Data目錄下面。不過文件基本都是.AXP后綴的,每一個動輒幾十兆,料想肯定是
把游戲文件打包到一起并加密過的,GOOGLE未遂。開始用UE打開看了一下這個AXP文件,發
現里面居然大部分都是明文的,開始以為只是把文件羅列在一起,不過仔細看了一下,發
現每個文件都有一段間隔,前面還有一個數據頭,而且文件與名字也無法對應。于是打開
OD手動分析一下,主要過程其實比較簡單,CreateFile函數下斷,找到文件Buffer位置,
再下內存訪問斷點即可來到關鍵代碼區域。略過具體跟蹤細節及文件校驗部分不講,文件
格式主要分析如下:
整個AXP文件可以分成四個部分:1.文件頭 2.文件名索引 3.文件索引 4.文件數據
1.文件頭:
整個文件頭固定為0x28字節,其中第20個字節開始的一個整數乘以12代表了第三部分
即文件索引部分的長度(因為每個索引有三個整數構成)
2.文件名索引:
整個文件名索引固定為0x60000字節,其中包含了每個壓縮文件對應的文件索引位置
3.文件索引:
本部分長度由文件頭相關數據決定,其中包含了每個壓縮文件在.axp中的實際偏移位
置及文件大小
4.文件數據:
本部分包含所有壓縮文件的具體數據,每個文件之間用若干零填充。
首先說說解壓總體過程:比如我們要從A.axp中解壓出一個叫file.txt的文件,那么先根據
文件名file.txt到文件名索引中去找到對應的文件索引,然后再根據文件索引找到這個文
件在axp文件中的位置和大小,最后把其解壓出來。
解壓具體過程如下:
將待解壓的文件名轉為小寫(如果為英文字母),利用GetDisp(char* s,int v)函數
計算相關數據,其中s代表文件名,v代表計算參數,分別計算GetDisp(fname,1),GetDisp
(fname,2),
GetDisp(fname,3),得到三個值a1,a2,a3。其中a3低位與在文件名索引中的位置有關,a3最
高位及a1,a2用來進行校驗,如果三個值不能同時滿足要求,則將偏移位置順移繼續驗證,
具體細節懶得寫了。
以下為GetDisp函數具體內容,我直接將跟蹤代碼里面的匯編改造了一下拿出來用,其中s
ucks為一個隨機數數組,這里不列出來了。









































這個為解壓單個文件的函數GenerateFile,用到了QT作GUI,大家就當偽代碼看吧。















































得到待解壓文件在文件索引中的位置後就可以找出該文件在axp文件中的具體偏移量和文件
大小了,然后直接fseek一下然后在弄出來就OK了。
最后說一下,這個AXP壓縮包本身就含有一個文件列表文件叫做(list),所以每次只要先解
壓縮這個文件,然后按照里面的文件列表來一一解壓縮就OK了。
以上就是文件大致格式,感覺還是比較簡單的,也可以考慮在自己的項目中使用類似方法
進行文件壓縮。
PS:本文僅供學習,本人不負任何責任。。。。
附上一首解壓出來的游戲音樂,大理城山歌。。。
http://bbs.sjtu.edu.cn/file/Crack/1182450894261753.mp3