2012年12月13日木曜日

技術メモ: アーカイブを覗いてみる


ゲーム日本語化 Advent Calendar 2012

ゲームで使う画像、サウンド、テキスト、スクリプト等は
個別のファイルになっている場合もあるが、たいていは巨大な数個のファイルにまとまっている。

zipそのままで拡張子変えただけという場合もある。

とりあえず16進ダンプして'PK'で始まってたらzipだ。


そうでない場合、アーカイブ形式を調べる必要がある。

アーカイブ形式を自作するつもりになれば想像できるが、
どこかに

- ファイル数

- (ファイル名)
- ファイルサイズ
- データ位置
- (圧縮してるか)
- (展開後のサイズ)

という情報があるはず。

例えばzipではこういう構造になっている。


これらの情報がどこかにあるはず、という前提で16進ダンプを見ていく。
情報はたいてい32bitのlittle endianである。

ファイル数なら
2c 00 00 00
とか小さい値のはず。
オフセットなら
20 00 00 00
..
5e 03 00 00
..
1a 2c 00 00
のように増えていくはず。
ファイルサイズなら、アーカイブのサイズより小さいはず。

+--------------+
|   ヘッダ     |
+--------------+
|ファイル1情報 |
|ファイル2情報 |
|  .....       |
|ファイルN情報 |
+--------------+
|  ファイル1   |
+--------------+
|    ....      |
+--------------+
|  ファイルN   |
+--------------+

というのが最も良くあるパターンである。
ヘッダには識別符号(zipなら'PK')、ファイル数などが含まれる。
アーカイブのバージョンらしき数値があることもある。

ファイル情報はアーカイブ末尾にあることもある。
この場合、アーカイブ先頭のヘッダまたは末尾のフッタなど、たどれる場所に情報開始位置があるはず。

+--------------+
|   ヘッダ     |
+--------------+
| 情報開始位置 |
+--------------+
|  ファイル1   |
+--------------+
|    ....      |
+--------------+
|  ファイルN   |
+--------------+
|ファイル1情報 |
|ファイル2情報 |
|  .....       |
|ファイルN情報 |
+--------------+
または

+--------------+
|   ヘッダ     |
+--------------+
|  ファイル1   |
+--------------+
|    ....      |
+--------------+
|  ファイルN   |
+--------------+
|ファイル1情報 |
|ファイル2情報 |
|  .....       |
|ファイルN情報 |
+--------------+
| 情報開始位置 |
+--------------+
まれにファイル情報がまとまってない場合がある

+--------------+
| ヘッダ       |
+--------------+
|ファイル1情報 |
|  ファイル1   |
+--------------+
|    ....      |
+--------------+
|ファイルN情報 |
|  ファイルN   |
+--------------+

この場合、 オフセット 情報が無く、内部ファイル末尾がそのまま次のファイルの開始になっていることもある。

ファイル名ぽい文字列が手がかりになるが、ファイル名が無い場合がある。

一つは、ファイル名だけ別ブロックにまとまっていて、情報にブロック内のオフセットがある場合。
もう一つは、ファイル名に替わるIDらしき32bit値がある場合。

前述のようにファイルサイズやオフセットは小さい値だから、上位は00のはずである。

2a 4b cd a7

とか00を含まない値の場合、ファイルのチェックサムかファイルIDを疑ってみる。

Xentax Game File Format Central
には、ゲームアーカイブ形式の解析が数多く掲載されている。


0 件のコメント:

コメントを投稿