MECC - ベースアドレス検索

ベースアドレス検索
○プロセス選択
ここでは、MECCを使うために必要なベースアドレスを検索する方法を説明します。 ベースアドレスのことは下の項目で説明します。

MECCを使うために一番最初に行うことはプロセスを選択することです。 プロセスとは、分かりやすく言うとアプリケーションやソフトのことです。 例えばWindowsであれば"メモ帳"や"電卓"など、全てプロセスとして動きます。 スーファミのエミュレータであるsnes9Xやuosensなども実行すればプロセスとなります。 今回はuosnesを対象にベースアドレスを検索してみたいと思います。
ベースアドレスは環境やアプリケーションのバージョンによって変わるので、 uosnesのバージョンは20050910.i686を使用して行います。

まずはMECCとuosnesを起動し、MECCのメニューから表示->リージョン検索を選択し、リージョン検索タブを選択します。 次に、ツールバーのプロセス選択から"uosnesw.exe"を選択します。 一覧の中に見つからない場合はuosnesが起動していない可能性があります。
プロセスを洗濯すると、リージョン検索の一覧にアドレスがずらっと表示されます。 これでプロセスを選択できた状態になります。(下図参照)




次は表示されたリージョン一覧からベースアドレスがあるリージョンを検索します。
○リージョン検索
リージョンとはプロセスの仮想メモリ領域の一部のメモリ領域のことです。 (私はそう理解していますが、もしかしたら違っているかも。。。) リージョンは一つのプロセスにいくつも存在し、 ゲームのパラメタなどが入っているリージョンがあります。 ゲームのパラメタなどは大抵一つのリージョンにまとまっているようです。
改造コードを検索する場合、大量にあるリージョンの全てを毎回検索していると時間がかかります。 そのため、対象のデータがあるリージョンのみを検索対象とすることで、 効率よく改造コードの検索を行うことができます。
このセクションでは、対象となるリージョンを検索するための方法を説明します。 今回はファイナルファンタジー5(FF5)を起動して検索を行ってみます。

まずuosnesでFF5を起動し、ゲームを開始します。 最初の所持ギルは500ギルなので入力値に500を入力して(基数は10進数を指定)検索ボタンを押します。 検索結果は以下のようになりました。 ちなみに、検索が終了するとダイアログが表示されます。




バイトサイズは3バイトとしていますが、これはそのデータの最大値がいくつかによって 変更する必要があります。 最大値からバイトサイズが分からなければ、 最大値が99なら1バイト、最大値が9999なら2バイト、それ以上なら3バイトとすればよいと思います。 エンディアンはアプリケーションによって変わりますが、基本的にはリトルに設定しておくとよいです。

検索結果からも分かるように、結果がいくつも残っていてこの中から対象のリージョンを見つけるのには時間がかかります。 そこでこの結果からさらに検索結果を絞り込んでいきます。
uosnesでゲームを再開して、少しゲームを進めます。 最初の検索では500ギルの状態で検索したので、この値が変化するまでゲームを進めておきます。 ゲームを進めて520ギルになりました。 この状態で同じように検索を行います。 入力値には520を設定して、検索ボタンを押します。 すると、検索結果が1件になりました。(下図参照)




これでまだ1件にならなかったら、同じような手順で絞込み検索を行います。 どうしても1件にならない場合、他のパラメタ(ステータス等)で検索をしてみるとよいです。 また、結果が2〜3件であれば一つずつ確かめていくという方法でも良いと思います。

結果が1件になったので、対象リージョンが見つけることができました。 リージョン一覧から検索したリージョンを選択してダブルクリックします。 選択するとメモリエディタが開かれ、該当するアドレスが表示されます。 下図のように該当するアドレスに色づけされます。




試しに08という値を99に変更してみました。 ゲームでギルを確認してみると665ギルに変更されていたので、 ゲームのデータがあるリージョンは$00DB000ということになります。

対象のリージョンが見つかれば、 検索範囲をこのリージョンに絞って検索することで改造コードをサーチすることができますが、 このリージョンは起動ごとに変化したり、他のPCでは別のアドレスになっていることがあります。 このままでは毎回対象リージョンを検索したり、 自分が調べたコードが他の人は使えなかったりととても不便です。 そこで、ここからさらにベースアドレスを検索して、 環境に依存しない改造コードを使用できる方法を説明していきます。
○ベースアドレス計算
ベースアドレスとは改造コードを適用する際の基準となるアドレスとなります。 ベースアドレスからどれだけ離れているかというのを改造コードとして表します。 例えば、改造コードのアドレスが1000でベースアドレスが10000だとすると、 実際に対象となるアドレスは11000ということになります。
ベースアドレスがあると何がうれしいかというと、 上の項目で説明したように対象となるアドレスは環境によって変わります。 環境によってはベースアドレスが10000だったり20000だったりするわけですが、 改造コードは1000で固定となります。 つまり、ベースアドレスさえ計算できれば、 改造コードはどの環境でも同じものを使用することができます。
ベースアドレスは上のリージョン検索で見つけたアドレスから検索していきます。

改造コードをネットなどで見つけることができる場合は簡単です。 今回FF5のギルのアドレスを検索しましたが、 この改造コードのアドレスは当サイトにも掲載しており「7E0947」です。
ここからベースアドレスを計算できるのですが、 スーファミの改造コードの場合は少し注意が必要です。 スーファミのRAM領域は7E0000〜7FFFFFであり、 ベースアドレスは7E0000のアドレスということになります。 (他のゲームではまた別の計算方法があります)
このことを踏まえてベースアドレスを計算すると、 今回検索で見つかったギルのアドレスが$DF0CD7なので、 DF0CD7-(7E0947-7E0000)=DF0390となるので、 ベースアドレスは$DF0390ということになります。(計算は全て16進数です)

さて、ベースアドレスを見つけることができたので、 ベースアドレスを設定することで改造コードを使用することができます。 既に述べたようにベースアドレスは変動するので、 毎回ベースアドレスを探さなければいけまんがそれは面倒くさいですね。 そこで、自動でベースアドレスを計算してくれる設定をしたいと思います。
○ベースアドレスポインタ検索
ベースアドレスを自動で計算する方法は二つあります。 一つはベースアドレス付近で常に変動しない値を探し、そのアドレスを検索してそこから ベースアドレスを計算するという方法です。 これは毎回検索に時間がかかるのと、変動しない値を見つけるのが難しいので結構大変です。 もう一つはベースアドレスが入っているアドレスを見つけて、 そのアドレスの値をベースアドレスに設定する方法です。 このアドレスのことをベースアドレスのポインタと呼びます。 (元々、ポインタとはアドレスを指しているアドレスのことを意味します)
二つ目の方法ならベースアドレスポインタさえ見つけてしまえば検索の時間もないので、 こちらの方法を説明したいと思います。 今回はuosnesで説明しますが、エミュレータであれば同じような方法で見つけることが できると思います。 PCのゲームの場合はこの方法で自動的に計算でいない場合がありますので注意してください。

ベースアドレスは上の項目で計算して$DF0390ということが分かりました。 このベースアドレスをリージョンから下図のようにして検索します。




検索結果が大量にありますが、リージョンは1つになったのでこれを選択します。 ここで一つにならない場合でもこれ以上絞ることができないので、 一つずつ確認していくことになります。
メモリエディタを確認してみるとベースアドレスが入っていると思います。 注意しないといけないのは、アドレスが1バイト単位で逆になっていることです。




ベースアドレスが入っているアドレスは上図から$B9B274ということが分かります。 この値が本当にベースアドレスを表しているのかを確かめないといけないのですが、 これは実際にこの設定で何度か起動してみてベースアドレスを取得できるか、 他のPCでも同じ設定でベースアドレスを取得できるかをやって確かめてみるしかないです。

次にこのベースアドレスポインタの設定方法を説明します。
○アドレス設定
まずは今のPCで正しく取得できるかを確かめてみたいと思います。 メインメニューの表示->アプリケーションを選択し、追加ボタンを押してアプリケーションを追加します。 追加するプロセスは"uosnesw.exe"を選択してください。 ベースアドレスの設定は下図のようにし、保存しておきます。




アドレス設定は左から、ベースアドレス、サイズ、開始アドレス、となります。
ベースアドレスの先頭の@は入力したアドレスがポインタであることを意味します。 つまり、入力したアドレスに入っている値をベースアドレスとして認識されます。 サイズは上で述べたようにスーファミのRAM領域が7E0000〜7FFFFFなので、 そのサイズを指定しています。 開始アドレスは、スーファミのRAM領域に合わせるため、 ベースアドレスを仮想的に$7E0000とすることを表します。 この設定で、当サイトの改造コードを使用することができます。
これで設定は完了で、上にあるツールバーのアプリケーション選択から、先ほど追加したアプリケーションを選択してください。 今回の例ではuosnesw.exeを選択します。 選択すると、メモリエディタに自動的に反映されるので、メインメニューの表示->メモリエディタで確認してください。
uosnesでFF5が起動したままだと思いますが、ギルのコードである7E0947を確認してみます。




上図で示されている値を書き換えて、ゲームのほうでも値が変わっていれば成功です。 ここまで設定ができれば後は好きなように改造コードを使用することができます。
ここでもし値が変わらない場合、ベースアドレスの検索に失敗していることになります。 ベースアドレスの計算が間違っていないか確認し、 間違っていなければベースアドレスポインタの検索をもう一度行ってみてください。 既に確認したアドレスとは別のアドレスをベースアドレスポインタとして設定しなおして、 同じような手順でメモリの書き換えを行い確認してください。 どこかのアドレスにベースアドレスが設定されていると思います。

ベースアドレス検索の説明は以上です。
今回はスーファミのエミュレータを対象にして検索を行いましたが、 他のエミュレータ・アプリケーションでも似たような手順で検索ができます。 ただし、スーファミのRAM領域が7E0000〜ということが既に分かっており、 ベースアドレスの位置がすぐに分かったので簡単に計算できましたが、 本来はリージョン検索で見つけたアドレスがベースアドレスからどれだけ離れているか、 ということを調べなければいけません。 これを調べるためにはデバッガを使って解析する必要がありますが、 ここではその説明はしないので興味のある方はWeb等検索してみてください。
更新履歴
サイトメニュー

人気ページ
商品リンク
管理人おすすめ
当サイトは管理人TATSU、副管理人MIA
によって運営されています。
☆メールによるお問い合わせはコチラ