戻る045502


ファイル展開のについて(Written by YAMA)
まえがき:
今回は基礎講座っぽく無い内容ですが、ある程度興味のある人が居そうなので、ゲームなどで使われている独自形式のファイルからファイルを展開することを取り上げてみました。よく言われる吸出しというヤツですね。
ちなみに私個人が独自にやっている方法を紹介するので、その手のことに詳しい方などには物足りない内容かと思いますが、ご了承ください。
はじめに:
この講座では、とりあえずminoriさんから2004年の6月に発売予定の『はるのあしおと』のシステム体験版を題材として取り上げてみたいと思います。
2004/05/15現在、Ver1.13が公開されています。
とりあえず、今回の方法では体験版からの展開は可能ですが、製品版については不明です。

開いてみる:
まずは公式サイトから体験版をダウンロードし、アーカイブを適当なディレクトリに展開しましょう。
ファイル名や容量から判断して"*.paz"というファイルがゲーム中のデータだと思われます。ためしに"bgm.paz"というファイルをバイナリエディタで開いてみます。

とりあえず、パッと見た感じの雰囲気を感じることが大事です。
先頭の部分に"0x00"が多い部分が目だち、その後の部分はランダムな値がびっちり詰まってる(圧縮されている)ように見えます。
このことから、先頭部分はファイル名などの情報を格納したIndex部で圧縮されている部分は格納されているファイルだと推測できます。

ファイルの中身を推測する:
このままの状態ではファイル名すら見当たりません。簡単な暗号化されていると考えられるでしょう。
しかし、どうやって暗号化されたファイルを復号すればよいのでしょう?
幸い、今回は最初にアーカイブから展開したファイルの中にヒントがあります。

展開したファイルの中には"ogg.dll""vorbis.dll"というファイルがあります。このことから音声またはBGMにはOggVorbis形式のファイルが使われていると考えられます。
OggVorbis形式のファイルのヘッダは文字として表示して"OggS"、16進数で表示すると"4F 67 67 53"から始まります。
ここで、1バイトずつなんらかの処理を加えて暗号化しているとすれば、"67 67"の部分の部分を暗号化する際に同じ値が連続して続くはずです。
この点に注意して、開いたときのIndex部とファイルの格納されている部分の境目と思われる部分の近くを探してみると"0x000095"の部分に"0x99"という値が連続して続いています。ここの"B1 99 99 AD"という部分が"4F 67 67 53"を暗号化した値だと思われます。
つまり、0x4F→0xB1、0x67→0x99、0x53→0xADとなるような処理を行っているはずです。
さて、この2つの値にはどんな関係があるのでしょうか?
関数電卓などを使っていろいろと演算を試してみましょう。

復号してみる:
マイコンのプログラミングとかでアセンブラ言語を利用しているような方なら基本なのですぐに気づくと思いますが、この2つの関係は補数を求めたものです。
ここまで分かれば後は簡単で、1バイトずつ補数を求めてファイルに出力してみましょう。気合があればバイナリエディタと電卓でできますw
出力した結果をみると、見事にファイル名やOggファイルのヘッダが見えます。ちなみに、"0x00"の場合はそのまま"0x00"を出力すればOKです。
暗号を復号できたら、次はファイルの取り出しです。

Index部分のフォーマット:
ファイルを取り出すには、Index部分のフォーマットを理解する必要があります。
まず、複数のファイルを一つのファイルにまとめる際にどんな情報が最低限必要か考えて見ましょう。

適当に考えて思いつくのは、
 ・格納されているファイルの個数
 ・ファイル名
 ・開始アドレス
 ・終了アドレス
 ・ファイルサイズ
などでしょうか?
このような情報が必要だと考えた上で復号したファイルを見てみましょう。
最初の"0x70"という値は良く分からないので飛ばして、"0x000004"にある"0x04"という値はとりあえず、ファイル数のような気がします。Index部のファイル名と思われる文字列の数もちょうど4個です。
こんな感じで適当に推測していくと次の"0x000008"から始まっているのはファイル名で、"0x000018""0x94"はファイルの開始アドレス、"0x000023"の値はファイルの長さをあらわしているという事がわかります。


何か作ってみる:
そんなわけで、ファイルの構造をまとめると…
先頭4バイトが不明、次の4バイトがファイルの個数、次が可変長でファイル名、次の8バイトが開始アドレス、さらに次の8バイトも不明で、次の8バイトがファイルの長さです。
一部不明な部分がありますが、ファイルの展開をするにはこれだけ分かれば十分です。
これだけ分かればこの情報にしたがってファイルを展開するプログラムは簡単に作れます。
ということで、適当に作って見たのが↓です。

こんな感じで無事にファイルを出力することができました。

そんなわけで:
ファイルの構造などを知っていれば比較的簡単にこういう事ができたりします。
ついでに、この講座の内容を理解できたら、CGと一緒に格納されている"*.ani"のファイルも似たような方法でBMPなどに変換できるので、試してみると良いと思われます。
では〜

今回の講座で適当に作った展開ツールです。
■depaz.zip
要望が多いので公開しました。
.pazのファイルをドラッグ&ドロップで解凍できます。

もどる