dwgx@blog:~$dwgx
> cd ../posts

東方紅魔郷の Ghidra 逆向ライブラリを fork した話

// created

先に断っておくと、このリポジトリは自分で書いたものではない。happyhavoc/th06 から fork してきたバックアップで、中身は彼らの Ghidra データベースだ。上流がやっているのは、《東方紅魔郷》(Touhou 06) のバイナリを少しずつ、元と対応が取れる C++ へと逆向していく作業。自分はただ他人の成果に乗っかって自分で噛み砕きたくて引っ張ってきただけで、ついでにローカルに副本を残しておく。

なぜ th06 なのか。古いゲームの逆向にはずっと執着があって、紅魔郷は避けて通れない。ZUN が 2002 年に C++ で書いた弾幕シューティングで、かなり古い DirectX 上で動いている。完全に手書きの味わいで、現代のコンパイラが上に塗り重ねる何層もの抽象化がない。だから RE の練習にちょうどいい。弾幕ロジック、当たり判定、ステートマシンは逆アセンブルすれば読める。いまの大規模プロジェクトのように、入った途端に数十万のシンボルが出てきて即座に萎える、ということがない。

Ghidra DB こそが核心だ。人力の逆向で一番価値があるのは、最終的な C コードではなく、少しずつラベル付けされていく意味論のほうだ。どのオフセットがプレイヤー座標か、どれが弾幕配列か、どの関数が判定を担うか。それが全部データベースに沈殿している。これを失えば大勢が骨折り損になる。だから別途バックアップを取るのは理にかなっている。自分が fork したのも同じ心持ちで、上流がいつか消えても、こっちに対照できる一本が残る。

オリジナルは何も突っ込んでいない。参考として扱うだけだ。上流の命名と構造に対応させながら、その横で自分でも Ghidra を回し、彼らがどう関数を切り分け、どう構造体を復元し、どの粒度で matching しているかを観察する。そして原始バイナリに戻って、自分の読みが正しいか検証する。結局いちばん学んだのは工程の習慣のほうだった。多人数協業の逆向をどう組織するか、アノテーションを各人バラバラの文字列の塊にしないためにどうするか。

使いたいなら上流を直接見に行くといい。あちらに原始ドキュメント、license、issue の履歴がある。この fork はただのローカルバックアップだ。上流と継続的に同期する保証はしない。リポジトリはこちら: th06-re