2006.02.08
No.004 エミュレータを利用してサーチ

前回やったことを振り返る
激しく端折って説明しましたが、前回はプログラムコードそのものをいじることでパラメータMAXにしました。
条件分岐を書き換え、プログラムの機能を使って99999999を書き込んだわけですが、
DipStarはパラメータそのものを書き換えているわけではありません。
では、そのパラメータそのものはどこに格納されているのでしょうか?

「直感ヒトフデ」のスコアは逆アセンブルリストを見ればパラメータ格納アドレスがはっきりと書いてあるので、
コードが読めれば簡単に特定することができるのですが、1つのルーチンで複数プレイヤーを処理するなどで
間接的にアドレスを指定していたりすると、格納アドレスを特定するのが難しい場合があります。
他にもパラメータがゲージで表現されている場合も最大値そのものがわからないために、
解析の目星を付けにくい傾向にあります。
(そういうときは最小値を追いかければ良いのですが、それはまた別の機会で)。

解析の基本は「目的の効果を簡単に得られる方法から順に調べる」なのですが、
その最も手軽な方法の1つが「エミュレータを利用したサーチ」です。

hasteDSとDeSmuME
DS改造ツールProject-DipStar-には『hasteDS』というサーチツールを同封しており、
ニンテンドーDSエミュレータDeSmuMEと組み合わせることで、簡単に改造コードをサーチできます。
難点としては「エミュレータそのものが発展途上でかつ研究段階である」という点。
要は、まだ遊ぶためのものではない、ということですね。

しかし、DeSmuMEは日々進化を続け、いくつかの市販ソフトは動作するようにもなってきており、
「直感ヒトフデ」にいたっては、もはや完璧に近いほどの動作レベルに達しています。
パラメータサーチに使う目的であれば「画面に能力値が表示される」「その値を変化させることができる」だけで、
完璧でなくとも、十分に実用レベルと判断して問題無いでしょう。

サーチ手順
もはや「hasteDS同封のマニュアルを読んでください」としか言いようが無いのですが…。
DeSmuMEに「直感ヒトフデ」のROMイメージを読み込ませると普通にゲームが始まるので、
チャレンジモードでスコアが表示された段階でDeSmuMEのメニューからEmulation→Pauseを選択して止めます。
その状態でhasteDSを立ち上げてメニューの「DeSmuME補足」をクリック。
メモリビューワにアドレス02000000からヘキサダンプの羅列が表示されたら補足成功です。

そのままhasteDSの「サーチ結果クリア(初期化)」ボタンを押せば、現在のDSメモリ内容を基準にサーチ開始。
後は適当にラインを消すなりでスコアを変化させて、「数値検索」ボタンでそのパラメータをサーチし、
格納アドレスを絞り込んでゆきます。
(この規模のゲームの場合、大抵は1〜2回で候補1件に落ち着きます)。

ゲーム開始→パラメータ L0 をサーチ→最初の「1」の絵を消す→スコア720→パラメータL720をサーチ→終わり。
サーチしている様子

とまあ、こんな感じですぐにアドレス 020B627C に絞り込めます。
これを前回作った逆アセンブルリストと照らし合わせると……
:02029EA8 E59F00B8 ldr r0,[r15, #+0xb8]		;r15+0xb8=*(02029f68)=#100000000(0x05f5e100)
:02029EAC E59120C0 ldr r2,[r1, #+0xc0]		;r1+0xc0=*(020b627c)=#-373489652(0xe9bd000c)
:02029EB0 E59F70B4 ldr r7,[r15, #+0xb4]		;r15+0xb4=*(02029f6c)=#10000000(0x00989680)
:02029EB4 E1520000 cmp r2,r0
:02029EB8 A59F00B0 ldrge r0,[r15, #+0xb0]		;r15+0xb0=*(02029f70)=#99999999(0x05f5e0ff)
:02029EBC E59F409C ldr r4,[r15, #+0x9c]		;r15+0x9c=*(02029f60)=#34311348(0x020b8cb4)
:02029EC0 A58100C0 strge r0,[r1, #+0xc0]		;r1+0xc0=*(020b627c)=#-373489652(0xe9bd000c)
そのまま最大値比較処理に同じアドレスが見つかります。
まあ、言うまでもなくアドレス 020B627C にスコアの値が入っているのは間違いない、ということですね。

改造コードを作る…?
前回やったことを考えると、改造コードは
220B627C 05F5E0FF (アドレス020B627Cに05F5E0FF(99999999)を書き込む)
になるように思えますが、Project-DipStar-はそのままでは「起動時に1回書き込む」しか機能がありません。
起動時に1回だけスコアを書き換えたからといって、ゲーム前に0に初期化されるわけですので、全く無意味です。

そこで「マスターコード」が必要になります。

Project-DipStar-は「マスターコード」と呼ばれる特殊コードを定義することで、
書き込むタイミングが「起動時に1回」から「任意のタイミング」に変化します。
その仕組みを利用して「アドレス020B627Cに常に99999999を書き込む」ようにしてやることで、
初めてこの改造コードは有効なものになります。

というわけで、No.004はここでおしまいです。
次回の題材は言うまでもなく「マスターコードのサーチ方法」です。

それでは、次いってみましょー。

>>次の講座へ進む