大体のゲームには最大値チェックという物が存在します よく、お金や経験値が999999999から増えなくなったり アイテムが99個以上は持てないう事はありませんか? これは、俗に言う「カウンターストップ(カンスト)」です 何故、お金やステータス、アイテムなどでカンストするかと言うと 開発者があらかじめ、プログラムで上限を設定して カウンターが一定値から増えないように制御しているからです。 実は、この制限を利用した改造方法があります まずは実践に入る前にPS2の解析作業とはどういう物なのか 最大値チェックの説明と一緒にちょっと見ていきましょう。 ただし、R5900の命令をある程度理解していないと難しいです。 基本的な最大値チェックの動作は プログラムで設定してあるカンスト値(最大値)と 戦闘終了後などに増加した値とを比較する物が殆どで 「上限を超えていなければ修正はしない 上限を超えていた場合は修正してストア」という物です。 例として、良くある流れは以下のようになります 00230000 lui v1, $0045 00230004 lw v0, $1234(v1) 00230008 addu v0, v0, a0 0023000C sw v0, $1234(v1) 00230010 lw v0, $1234(v1) 00230014 lui t0, $0098 00230018 ori t0, t0, $967F 0023001C sltu at, v0, t0 00230020 bne at, $0023002C 00230024 nop 00230028 sw t0,$1234(v1) 0023002C nop 各命令の意味などはR5900命令表を参照して下さい 00230000~0023000C までは数値の加算を処理しています まずは上限を超えていてもストアする事が多いです 00230010で加算後の数値をロードして 00230014と00230018で上限値をt0レジスタに設定(0098967F) 0023001Cでv0の現在値とt0の上限値とを比較します ここで上限を超えていればatレジスタには0000が 超えていなければatレジスタには0001が格納されます 00230020の時点で現在値が上限値を上回っていた場合 atレジスタには0000が格納されているので分岐命令は無効になり 00230028のストア命令で最大値に修正されます しかし00230020の時点で上限を超えていなかった場合 つまりatレジスタに0001が格納されていた場合は処理が分岐し ストア命令は通過せずに進みます この例で言えば、分岐命令で分岐しなかった場合には 00230028のストア命令で最大値に修正されるという動作なので コードでこの分岐命令を潰すとお金がMAXになります プログラムを書き換えて効果を出すので 俗に言うプログラムコードですね。 他にもv1レジスタ+1234hのアドレスからロードした数値と 上限値とを比較しているので、このv1+1234hが 現在値が格納されているアドレスであると予想できます。 この例の場合は00450000をv1レジスタにlui命令で格納して その後lw命令、sw命令では00450000に1234を足して処理しているので 00451234が現在値が格納されているお金のワークアドレスになります。 PS2解析とは、このように一つの情報から いくつもの考えといくつもの答えを導き出すものです 必ずしも一つの問いに一つの答えとは限りません。