ImHexで未知のファイル形式を解析:FEZセーブデータのリバースエンジニアリング
Reverse Engineering Unknown File Formats with ImHex

ゲームFEZのセーブファイルを題材に、未知のバイナリ形式を解析する方法を解説します。C#で書かれたゲームをJetBrains Riderで逆コンパイルし、セーブデータの生成コードを追跡。その結果をImHexのパターン言語で定義し、ファイル構造を可視化します。文字列の7ビットエンコードやオブジェクトのnull判定など、.NETのシリアライズ仕様をパターンで再現するテクニックを紹介します。
これまで何度も同じ質問を受けてきた。『そのファイルを読み書きするプログラムの逆コンパイルコードを見て、そこから逆算するんだ』としか答えられなかった。この記事はそれを変えるためのものだ。
HNでの議論
49- kstrauser
昔話をしよう:大学時代、モーテルで夜勤をしていたんだ。「退屈で涙が出る」というのは控えめな表現だった。ある夜、フロントのコンピュータシステムをいじっていたら、あるデータファイルを見つけた。他にやることもなかったので、BASICで小さなヘックスダンパーを書いて、そのファイルを探索できるようにした。最初に気づいたのは、顧客名がちょうどNバイト間隔で配置されていることだった。おお、固定長レコードだ!それから次の1週間ほどかけて、データベースファイルの形式をリバースエンジニアリングした。ランダムな顧客レコードのフィールドをいじって、ヘックスダンプでそのレコードを見て何が変わったかを確認し、メモを更新した。
最終的に、どの顧客が一番お金を使ってくれたかといった分析や、タイプミスした名前の自動修正(「『Bb Jones』って書いてあるけど、『Bob Jones』のこと?」)をファイルに直接書き込んで行う、もう一つの小さなBASICプログラムを書いた。
そのハックで、結構いいボーナスをもらったよ。
- issung
PS2のメモリーカード形式をhttps://ps2iodb.com用にリバースエンジニアリングしていたときに、ついにImHexを使ってみたんだ。
このプログラムは本当に素晴らしくて、リバースエンジニアリングについて何も知らなかった私でも、その評判から手に取るべきだと分かっていた。それはもう3、4年前のことだ!また、使用している素晴らしいGUIライブラリにも称賛を送りたい;https://github.com/ocornut/imgui
- truekonrads
私のいくつかのルールはこれだ:
1) エントロピーはどれくらいか?これは暗号化や圧縮を理解するのに役立つ。おそらくこれを克服する必要があるだろう?
2) コンテキストは何か?アプリはコンテキストの中で開発され、コンテキストが形式を示唆する。C言語なら、構造体を期待する。ネットワークを介して送信する必要があるか?ランレングス符号化を期待する。Python/JSなら、JSONやpickleだ。
3) 大まかに言えば、データをメモリに読み戻す方法はほんの数通りしかない:固定レイアウト、ランレングス符号化、終端文字。素晴らしいケーススタディはASN.1だ。一度手でASN.1パーサーを書けば、どんなファイル形式も怖くなくなる。
- Noxwizard
私はいつも良いヘックスエディタを探している。ImHexは何度か試したが、私のニーズには完全には合わず、単純なことにはHxDの方が好みだ。パターン言語はかなりきれいで、以前は調べたことがなかった。複雑なことに関しては、ブログ記事のような線形なプロセスではないことがよくある。主に、構造を理解するまで、構造にはしばしば多くのギャップがある。ImHexやKaitaiのようなツールでは、既知の2つのオブジェクトの間にプレースホルダーフィールドを置くことができるが、それはちょっと面倒だ。010 Editorでは、色付きのブックマークをハイライトして置くことができ、それはある程度機能する。私が最終的に使っている、メモリ内のデータ構造をリバースエンジニアリングするためのワークフローは、メモリのヘックスダンプを取得し、スクリーンショットを撮ってOneNoteに入れるというものだ。それから、色付きのボックスを描いたり、ハイライトしたり、横に注釈を付けて何かを説明したりできる。フィールドが別の関連する未知の構造体へのメモリアドレスである場合、そのメモリの短いダンプを取得し、同じページにスクリーンショットを置いて矢印で指すことがよくある。かなり場当たり的だが、自由形式なのが気に入っている。基本的にはリバースエンジニアリングのノートブックで、役立つREの組み込み機能がないだけだ。より良い発見ワークフローについてアイデアや推奨事項があれば、ぜひ聞きたい。
- vivzkestrel
- 愚かな質問:.unrファイルでこれを行う方法について何かアイデアはありますか?
- それは『スプリンターセル コンヴィクション』というゲームからのもので、カスタムのUnreal 2.5で作られています。
- UE-ExplorerもUEViewerもそれで動作させることができませんでした。
- ファイルを送ることもできますが、敵AIのスポーンタイプを変更する方法を知りたいだけです。