殆どのゲームの、数値が関係する要素の殆どに 最大値チェックというプログラムが用意されています 最大値チェックについては基礎知識を読みましたね? 読んでいれば、早速実際のソフトを使って探してみましょう。 最大値検索とは、このカウンターストップの数値から 最大値を超えてるかどうかのチェックをしてる場所を探り ここからコードを作り出すという物です。 今回の例題には 「ファイナルファンタジー10 インターナショナル」 を使用します 実際に、ギルのアドレスを探してみましょう 下準備でFF10インターナショナルの実行ファイルをPS2DISで開き 逆参照解析さんを起動させておきます。 ギルはゲーム画面で見る限りかなりのケタ数がありそうですが 大体はワードデータ、8ケタの16進数で扱うので 999999999=3B9AC9FF もしくは 99999999=05F5E0FF が最大値ではないかと予想出来ます 次に、ツールバーの編集→32bit値を検索→16bitにマークをして 最大値であろう下4ケタの数値、C9FFを入力して検索します R5900の命令の仕様上、8ケタある数値をレジスタに格納するには どうしても2つの命令を使わないと格納出来ません その2つの命令のうちの1つをこの最大値検索で探しあてます。C9FFで検索してみると、いくつもの候補が出てきますが 説明の為に先に正解を言ってしまうと001BE404が正解です。 その001be404から下に注目しましょう
001be404でv1に3B9AC9FFという数値が完成します 画像が昔のものをそのまま使ってるので分かり難いですが(汗) 上の方でlui v1,$3b9aという命令が動いているので このori命令で3b9ac9ffという数値が作成されます。 001be410のslt命令でa0とv1を比較しています もし、a0の値がv1の値より大きかった場合は v0レジスタに0001が格納されますが 逆に、a0の値がv1の値より小さかった場合は v0レジスタに0000が格納されます v1にはギルの最大値らしき数値が入っているので ここで比較されるa0レジスタにはギルの現在値が入ってると思われます 001be414で上のslt命令の結果に応じてa0にv1が転送されます 上の命令で0001が格納されていれば最大値を転送 0000が格納されていれば転送はされません 001be41cのsw命令で0031CE98というアドレスに 最大値か、元の数値がストア(書き込む)されるという事から ここは最大値チェックをしていると予想出来ます この0031CE98というアドレスがギル最大値チェックらしき場所に存在し さらに比較後の転送結果が格納されるかもしれない事からも考え ギルのワークアドレスではないかという可能性が高くなります そこで、実際に0031CE98に最大値をワークコードで書き込んで見ます ワードデータ書き込みなので先頭を2にして暗号化 2031CE98 3B9AC9FF 〜暗号化〜 1CA851C0 1DBC9E0C これをマスターコードと一緒に使ってみると・・・ 見事にギルが最大になっています、改造成功です。