検索キーワード「zip」に一致する投稿を関連性の高い順に表示しています。 日付順 すべての投稿を表示
検索キーワード「zip」に一致する投稿を関連性の高い順に表示しています。 日付順 すべての投稿を表示

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
には、ゲームアーカイブ形式の解析が数多く掲載されている。


2011年9月4日日曜日

Eschalon: Book II (未完)

- archive: password付きzip (datapak)
-- password: ココ
- text: 普通のplain text
- font: 不明

Eschalon: Book IIのアーカイブは普通のzipなので、拡張子をzipにしてpasswordを入れれば普通に展開できる
- datapakを展開する
- dataというフォルダができるので、これをゲームディレクトリにコピーして適当な名前(例えばjapanese)に変更する
- general.cfgのlanguage=englishを先ほどのディレクトリ名(例えばjapanese)に変更する

これでテキストを変更できはするのだが、フォントはLatin-1固定である。
ぱっと見ではフォントデータが見当たらない。WindowsAPIで描画してるようでもない。EXEに埋め込まれてるのであろうか。

2011年11月17日木曜日

DUNGEONS - The Dark Lord (Demo)


Dungeonsと同じ
  • Dungeons日本語化MOD から shared_jfont.dep(*) を取り出し、data\gui\shared に入れる。
  • data\localization\en\texts-en.csv を訳す。
  • 画面はDungeons日本語化MODから共通のメッセージをマージしたもの
(*) 適当なttfフォントを
AlteHaasGroteskRegular.ttf
Dungeons.ttf
Dungeons_regular.ttf
Dungeons_small_caps.ttf
という名前に変更し、zipで固めて拡張子をzip->depに変更して自分でも作れる

2012年12月14日金曜日

技術メモ: ゲームデータの特徴

ゲーム日本語化 Advent Calendar 2012

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上の痕跡から、証拠となるデータを復元することである。

その手の解析コンテストや勉強会に出てる人のスライドが公開されており、ゲームデータ解析にも通じるところがあるので必見。


2013年12月24日火曜日

Source Engine (2)

Source EngineやHL2MODで.txtがなく.datのみのものがあるのでconverter作った

dat2txt.zip

Source EngineのDATを編集可能なtxtと相互変換します。
オリジナルのtxtとは形式が異なります。

Source Engine dat/text converter
 dat2txt <datfile> <txtfile>: dat to text (utf-16,LF)
 dat2txt -e <txtfile> <datfile>: text to dat

オリジナルのtxtは(UTF-16LE,BOM,CRLF)

"lang"
{
    "Language" "english"
    "Tokens"
        {
        "string_id" "message"

のような形式ですが、変換したtxtは(UTF-16LE,with/without BOM,LF)

hexid<tab>message

になります。

ここではThe Stanley Parable (MOD版) を例に
-dat2txtをどこか作業フォルダに入れる
-Steam\steamapps\sourcemod\thestanleyparable\sourcemods\resource\closecaption_english.dat を作業フォルダにコピー
-コマンドプロンプトから
-cd 作業フォルダ
-dat2txt closecaption_english.dat closecaption_english.txt
-closecaption_english.txt を編集
-dat2txt -e closecaption_english.txt closecaption_english.dat

2011年12月30日金曜日

2011年9月11日日曜日

Hard Reset (DEMO)

少なくともカナ化はできそうな予感

- arhive: pass付きzip
-- aluigiの解析を待つか、自力で解析するか... 解析された
-- pass:9dU36jSJ@h265^k0b1!jrx*945F1
-- demo:rNPXgxj12A#Ian@!K5qt%JSNx2I
- font: BMFont
- text: squirrelバイナリらしい。デコンパイルしたものがここに



2011年8月20日土曜日

Secret Files: Tunguska


- archive: packer/unpacker http://oezmen.eu/gameresources/のtunguska.zip
- font: 普通のttf
- text: 普通のtext (UTF16,タブ区切り)

- SPRExtでloca.sprを展開
- data/localization/ を編集
- (data/localization/fonts.ini の FaceNameで好きなフォントに変更できる)
- MakSPRでloca.sprに固めて差し替え

日本語化テスト

2011年8月8日月曜日

Din's Curse

かな化可能。

- アーカイブ: 普通のzip
- テキスト: 普通のテキスト(Loc/English)
- フォント:
-- .fnt テキスト形式の座標情報
-- .ctx ヘッダが省略されたDDS
 DWORD dwWidth
 DWORD dwHeight
 DWORD unk
 DWORD dwMipMapCount
※FourCCはデータ部の先頭

DDS ファイル リファレンス

2011年12月30日金曜日

Grotesque Tactics

archive: 0x55でxorされたzip
 展開状態で認識する
font: BMFont
text: utf-8のxmlテキスト

日本語化MOD

2011年7月27日水曜日

Men of War シリーズ

追記: 日本語化した

日本語化可能。

- アーカイブ: 普通のzip(拡張子pak)
- テキスト: 普通のテキスト(localization.pak内)
- フォント: .fontと.fbin のセット。(interface,pak, language.pak)
1byte文字固定なのだが、テキスト中でフォントサイズを変更できるので、「サイズの違う文字」の代わりに「漢字の文字」を用意して、テキスト中で切り替えることで無理やり256種以上の文字を表示できる。中華パッチで使われていたテク。

font
 height
fbin(font_hq)
 byte width[256] // 各文字の幅
 int  offset[257]; // 最後はデータの末尾
chars[256]
 byte data[width[i]*height]

2012年12月31日月曜日

Star Wars The Force Unleashed II


日本語化

archive: 普通のzip
font: .dds, a2f  and swf
 pak2.lp/Game/Disc/UI/Hud/Fonts/PCDX/ .dds , a2f
 pak3.lp/Game/Global/UI/Flash/fonts_en..gfx (swf)
text: utf-8 plain
 pak3.lp/Game/Global/UI/GlobalText.utf8 , GlobalTextPC.utf8

一部フォントは文字コードにアイコンを振ってるのでフォント作成時に混ぜる必要アリ



2013年4月3日水曜日

The Journey Down

archive: format: http://forum.xentax.com/viewtopic.php?f=10&t=8952
packer/unpacker: gobpack.zip

textが1byteのみっぽいのでかな化のみ

font: ttf
text: json

big endian

int dataofs

struct entry // 4 ... dataofs
  short namelen
  char name[namelen]
  int ofs
  int size
  byte type

dataofs:
  data...

type:
  2,3 : webp
  8: ttf
  4: zlib compressed json
  9: zlib compressed script?
  7: ogv (ogg theora)
  6: ogm (ogg vorbis) 
  

2011年12月16日金曜日

The Dark Mod


そのまま動く。文字位置がおかしいがDOOM3本体が直れば直るはず。

独自フォントを使ってるのでtdm_font01.pk4をの中身と同じ構成でtdm_font02.pk4とか用意する。

ミッションは、pk4内の
- darkmod.txt の Title と Description
- guis/*.gui の text と choice 行
- xdata/*.xd
(主にxd)を訳して、例えばtraning_mission.pk4ならtraning_mission_jp.pk4とかでzipで固める。.

日本語化テスト