zipには先頭に'PK'というシグネチャがあるが、
アーカイブ内のゲームデータにも特徴がある。
画像
PNG 89 'PNG' (SJISだと '臼NG')
DDS: 'DDS '
BMP: 'BM'
TGA; 00 00 20 00 (32bitの場合)
JPEG: ff d8 ff XX (JFIFの文字が見えることも)
シグネチャが無くても、非圧縮画像は00(黒)やFF(白)が多発するので見分けが付く。
アルファつき32bitなら 00 00 00 FF とか 4byteごとに規則的に並ぶ。
圧縮DDS(DXT5)は一見圧縮データぽいが、特徴的な00やffの並びが見られる。
画像ぽいデータなら、先頭あたりに画像サイズぽい値あがあるはず。
非圧縮なら、縦x横に1dotあたりのbyte数(1-4)を掛ければ(ヘッダサイズを除いた)ファイルサイズに近い値になるはず。
サウンド
WAV: RIFF....WAVEfmt
OGG: OggS
が圧倒的に多い。日本語化には(どっかの暇人がアテレコでもしない限り)関係ないのでここではスルー。
テキスト
plain textは普通に人間が読めるのでわかりやすい。
メッセージやスクリプトなど
動画
bink(BIK)かogm、mkv等が多い。その他
バイナリ化されたメッセージやスクリプト、モデルなど。
4byte int や floatぽい値が並ぶなど、無秩序ではなく特徴がある。
メッセージがスクリプト中に埋め込まれている場合などは、メッセージぽいテキストが見える。
圧縮データ
なんかゴチャゴチャしてたら、圧縮か暗号化されている。
zlib圧縮の場合、78 xx という zlibヘッダがある(ないこともある)
アーカイブ解析時に、ファイル情報部の「オフセットぽい値」に飛んでみて、これらファイルの先頭ぽい特徴が見えたら、ファイルの先頭と考えられる。
このオフセット値は、
- ファイル先頭からの絶対値
- ヘッダの直後からの相対値
- データ部の先頭からの相対値
などのバリエーションがある。
とりあえず飛んでみて、少しズレてたらヘッダ分の可能性が高い。2つのファイルでオフセット位置に飛んでみて同様にズレてたら確定。
また、動画やサウンドなら「ファイルサイズぽい値」が大きな値になってるはず。
ところで「デジタルフォレンジック」という分野がある。
「フォレンジック」とは「法廷」や「科学捜査」の意味で、
「デジタルフォレンジック」とは、(関連する部分だけ言えば)故意に隠したファイルやHDD上の痕跡から、証拠となるデータを復元することである。
その手の解析コンテストや勉強会に出てる人のスライドが公開されており、ゲームデータ解析にも通じるところがあるので必見。
目grep入門 +解説 from murachue
0 件のコメント:
コメントを投稿