オーバーレイの解析

.hackもシリーズ完結ということで
いつもより難しい解析もやってみました
正直、外部プログラムの特定は時間が掛かってしまい
実行ファイルの情報だけでも結構なコードも出来るので
今まで避けていました(笑)

まず、プログラムが入っていそうなファイルを探します
ゼノサーガのような「開くといきなり外部ファイル」
という作りではないので、地道に探します

試しに「GCMN.PRG」というファイルを
強引にPS2DISで開いて、数値検索をしてみた所
03E00008(jr ra)などの数値でしっかりとヒットします

プログラムもしっかりとした作りになっています
ここが外部ファイルなのは間違いありません。

しかし、ここで問題が出て来ました。
それは「どこから外部ファイルが展開されるのか」です
これが分からなければ意味がありません
ラベルからそのヒントを探そうと思っても
今回のVol.4ではラベル情報は一切ありません
Vol.3から移植してもヒントになりそうなラベルなどは
ほとんど移植されていないようです
しかし、基本的な作りは全く同じなので
まずはVol.3で役に立ちそうな場所を探せば
それをVol.4で応用出来るかも知れません

外部エリアの事は、オーバーレイとも呼びます
英語で書けば「overlay」です
Vol.3で関係しそうな場所を探すと
003923C0のアドレスに
_overlay_group_addresses
というラベルが貼られています

見たところ、テーブル管理のようです
単純に考えてこの0041b100
という数値は外部ファイルの展開場所と思われます

早速Vol.4でも同じ場所を探そうと思いますが
展開先はVol.3と同じではないハズなので
周辺の数値と同じ場所が無いか探して見ます
近くにclipxというラベルがありますが
Vol.4にもclipxラベルはバッチリ存在するようです

ちょっとアドレスはズレていますが
作りはほとんど同じです

早速00431100から展開してみましたが
本当にこれで正しいのか裏が取れていません
なので、この外部プログラムの数値を利用し
Dなどの条件判定コードを使って
所持金のアドレスへ数値を書き込むようにしてみました
予想通りに00431100から展開されていれば
条件判定がちゃんと動作するハズです。

良くありそうな数値で条件判定すると
偶然引っかかる可能性もあるので
そういう可能性の無さそうな数値を選びます
FEDCで16bit検索したら一箇所だけ見つかったので
今回はこれを条件判定として使ってみます


オーバーレイテスト
0CD3822C 1456B1E9
1C267214 14BE598C
を使ってみた所、タウンマップの時点で
すでにGPがMAXになっています
他のアドレスと数値で試しても効果が出る所を見ると
ゲーム開始後すぐに読み込まれているみたいです
外部ファイルの展開先が正しいと分かれば
後はいつも通りに解析していくだけです


ここから下は、外部ファイルを対象にした
普通の解析手順を軽く纏めてみました


GPの最大値は0098967Fなので
967Fで検索すると、かなり多くヒットします
こういう場合は一つずつ実験するか
他の場所での情報などを上手く利用して
数箇所に候補を絞って行きます。
例えば「所持金が増えた時に最大値チェックをするので
近くにaddu命令が無いか」とか
「他の物を調べてた時はレジスタがどう使われていたか」
などが候補を絞る情報になります。

さらに、買い物をして所持金が減った時にも
最大値チェックをしているみたいなので
「買い物すると超絶キャッシュバック」
なんてのも出来ます(笑)

さらにさらに、レベルアップを管理している関数では
経験値が1000を超えたら一旦リセットして
ステータスアップの処理をするようになっています。
この処理の最中に、経験値のアドレスへ
03E7を書き込む命令を追加してやれば
すくすくレベルアップが完成します。