设为首页收藏本站官方微博

汉化资料 某热门游戏的资源文件格式揭秘

[复制链接]
查看: 1745|回复: 0
打印 上一主题 下一主题

[汉化资料] 某热门游戏的资源文件格式揭秘

跳转到指定楼层
楼主
发表于 2009-12-8 11:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

某热门游戏的资源文件格式揭秘

此文可以作为分析文件格式的参考。
1 Z! }- K0 K' J( l3 K( ^5 ^
8 d# l" X: U/ G7 ~' ~原文* c! Z: s- u7 f) p( A4 H0 S
http://vivimice.blog.163.com/blog/static/161001200952035527294/
2 H9 i0 y6 n' \9 h" x! t6 r3 V
* P& V! j$ K) l1 J" c美国某知名2D小游戏公司最近出了一个很好玩的小游戏,非常热门啊,最近水木和88的PCGame板都在讨论这个。玩了一下发现确实不错,尤其是音乐,做得很不错,颇有味道。于是想把它给扒出来。
6 z$ d9 q, @' U& a9 w6 W$ l+ J* [2 Y0 G" q: f9 n8 d
  自己观察了一下,发现游戏目录下的sounds文件夹只有一些RIFF格式的音效,没有音乐。倒是游戏可执行文件的下面有一个main.pak文件,体积庞大。估计就是在这个文件里面。
' ~2 O- t6 |8 g3 L* X1 p- s4 ~3 L9 j3 F6 e7 L
  去该公司的开发者论坛上转了一圈,得知这个文件格式尚未公开。网上能够找到的资源提取程序都不能读取这个文件。估计是比较新的打包格式。干脆自己人肉解解看,或许能够成功。# b; e/ p, i3 u7 ~+ E' B

9 h8 m# V, t" x" ?8 Z
. X. R9 K" K7 H. g' B   用UE打开这个文件,初步瞄了一眼,发现内容比较乱,用PNG、MP3等等常见文件的文件头搜索了一下,没有找到。文件内容比较紧凑,没有发现成段的连续同内容字节。这说明文件可能经过压缩。如果真是经过压缩的话,那么直接啃文件是基本上啃不动的,因为压缩算法实在是太多了,而且特征比较难找。于是想想换一条路试试看:如果这个文件是经过压缩的,那么程序在运行的时候肯定要将整个文件进行解压缩(因为压缩文件缺乏直接随机读写的能力),将解出来的资源放在内存里面,在内存里面找也许可以找到有价值的内容。
$ @0 A$ z! v6 n' j$ J
+ x( i% a9 B1 W8 @+ m. O" v% H  首先将程序启动,在资源全部加载完毕以后马上使用工具将程序运行时的内存完全dump到文件中,接下来开始分析,结果却只找到了一副PNG图。文件经过压缩的可能性变小了。0 P5 g9 s- n2 @
2 k& a& B4 M& W8 L/ t% ~& x$ U
' |9 g2 o2 v# F/ C. v4 x2 O0 K
  既然文件没有经过压缩,但是缺又缺乏常规文件的特征(文件头的地方一般比较稀疏),到底该怎么办呢?无聊之中无意将编辑模式切换到了纯文本模式,这个无意的操作却让我发现了一些蛛丝马迹。
1 ^; j% }3 u- ]; E1 b4 v" [; k  文本模式下,这个文件仍然是乱码,但是却发现文件头部有很多行的开头都一模一样。这种打包的文件,内容组织上一般都比较像文件系统,前面是子文件的入口列表,后面是子文件的具体数据。这些开头一模一样的行,可能说明这些是具有相同路径前缀的子文件。" M4 k. K& l' r7 A4 g8 x

6 V- V! J9 B6 f9 c" o1 C  不过路径名都是乱码,说明这些路径名被加密过了。首先想到的最常用也是最古老的加密方式就是XOR。尽管不知道XOR的密钥是什么,但是可以通过穷举的方式来尝试。可以长度为1的密钥开始尝试,如果不成功再尝试不同长度的。幸运的是,我找到了1个长度为1的密钥,它可以让这些乱码变成一串有意义的全大写的单词,尽管路径的分隔符是管道符,而不是反斜杠。' Q, `1 |  g& v1 G- f: `- G5 U) K
( V! M! ~. ?5 {/ r, D% o. k

$ u& l) d% ~! Q; J3 P  在这个之后,文件的内容看起来有意义多了。但是这个时候我使用常见资源的文件头进行搜索,仍然找不到匹配。这可能说明文件仍存在另外一层加密(要不就是根本就没有这些资源文件)。我想尽了办法,也没能找到这些文件的入口在哪里。
7 s/ n  Q# S" {1 O/ {7 h  e  忽然我想到前面XOR出来的文件名都是大写,这也许并不是程序员确定的原本文件名,原本文件名如果是小写的话,那么说明打包的时候把所有的小写字符变成了大写字符。而PNG的文件头是"\x80PNG",结果被我找到了"\xA0png"的若干个匹配,在这若干个匹配的后面,可以找到"ihdr"继以"iend"的匹配,而在正常的PNG中,应该是"IHDR"继以"IEND"。这起码说明了存在如下的映射:"\x80A-Z"到"\xA0a-z",即上述区间的所有字节被加上了0x20,也就是左移了5位。9 i3 t0 _" x5 n5 g4 O  L

- u" ?# u, o; f4 Y! E9 X1 ~  在我准备编写针对这个算法的还原程序之前,我发现的另外一个现象,让我陷入了混乱。我在这个文件里面发现了OGG文件的文件头,OGG的文件头"OggS"如果按照上面的推测,应该被编码成为"o\x87\x87s"("g"的十六进制表示为0x67),但是文件中的实际编码是"oGGs",也就是说对于所有的小写字符而言,他们被减去了0x20,也就是右移了5位。这说明编码的时候针对不同的字节范围进行了不同的移位。
& P7 u( [1 G' G2 |5 P2 z. E# D  {- D

. S, x7 k7 e; h& N6 `  最后经过大量的比对,我终于找到了实际位移的算法,终于可以将main.pak还原到了被加密之前的样子。下面的工作就是将这个打包的文件解包成为单独的文件。
6 Y/ Y7 X% p% w* x* |( @
- ^) T( z* ]2 L# t3 l. f) x/ Z1 z6 y- U: w# {% b
  相比于上面猜测加密的过程来说,解包的过程太简单了,基本上猜测再实验一下就可以知道打包的格式:
' r: Q; O: g6 g) `3 s3 v. f& J1 _7 B# l% i1 [3 d9 i8 t: K
) N: H" Z  C+ L$ _* ~
文件头:7 _6 F: U2 Z) |3 [# y; e
Addr  Length  Type         Description                                     ; V; U- H# H3 c" i
0x0000  9  byte []  未知
2 v: }7 Q; M) x' ?& V: q2 a
( d  P  [3 V7 P/ l: o1 p. j
) m8 I3 }$ t0 G2 t" V) u7 U# n# [然后接下来是文件入口的定义:
; H  n1 _8 Z2 |6 }" }: j1 U 0x0000  1  byte  接下来的字符串的长度(假定为N) 6 @* s! n: K' L) U+ W- C: E
0x0001  N  char []  文件的相对路径,例如:foo/bar/sound.ogg ' h- A9 V8 u& h9 y: c
0x0001+N  4   long  文件的长度
5 @' P+ M" u/ Z1 \+ y 0x0005+N  8  byte []  未知
/ n8 {3 X2 Y6 L/ X' d. n0 f. T' j 0x000d+N  1  byte  终结符
, P6 ~0 O. X" q  j9 S9 _  p* ]
3 X3 u( v4 p% z: J9 l2 F; f* K: ]! I0 z8 s+ z0 Z+ f
如果上述终结符为0x00的表示接下来的内容仍然是文件入口,如果是0x80则表示从下面开始是文件的数据。各个文件的数据之间没有分隔。放置的顺序就是按照文件入口的顺序来确定。
+ G" n8 f7 X6 {* n
/ ?1 e; [* {2 P* v( E  F  w" T/ N( b, H: k0 E% K
  最后写了一个java小程序来将算法实现了一下,然后成功将这个文件解包。音乐那是相当不错啊,我已经整理出了一个mp3格式的专辑,这下不用玩游戏也可以享受了。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表