フラグ型とは、特定のアドレスに「0」「1」とフラグを立てることで、デバッグモードに入るタイプです。
フラグ型の場合、まずデバッグモードがあるか確認します。まず、文字列検索で、「デバッグ」「テスト」「セレクト」「Debug」「DEBUG」「debug」「TEST」「SELECT」といったありがちな文字列を検索します。また、メモリダンプを眺めて、通常PLAYでは表示されない文字列などを見つけます。ただし、特殊な文字コードを使用しているゲームの場合には、簡単には見つけることはできません。
そして、文字列が見つかったら、文字列のポインタ(先頭文字のアドレス)を参照している場所をサーチします。後はプログラムを追いかけて、どのアドレスにフラグを立てるか解析していきます。
◆基礎知識
◇アドレスをレジスタにロードする
R3000では、アドレスをレジスタにロードする場合、luiとaddiu(またはori)の2つ命令を使って上位、下位に分けて行います。たとえば、a0レジスタにアドレス8001DF0Hをロードする場合、次のようになります。
★addiuの場合
lui a0, #$8001 #上位ハーフワードに$8001をロード
addiu a0,a0, #$1Df0 #下位ハーフワードに$1df0をロード
★oriの場合
lui a0,#8001
ori a0,a0,#$1df0
◇文字列を表示するルーチン
プレステのゲームで文字列を表示する場合、次のような処理をしています。
lui a0,#$8001
addiu a0,a0,#$1Df0 #文字列(または配列)のポインタをレジスタにロード
jal $8007c200 #表示ルーチンをコール
つまり、デバッグ用の文字列のポインタを参照(レジスタにロード)している所をサーチすれば、デバッグ用文字列の表示ルーチン、デバッグモードのルーチンを発見できる訳です。
◆サーチ手順
@メモリダンプでデバッグ用の文字列を見つけます。
A文字列のポインタ(先頭文字のアドレス)を参照しているルーチンをサーチします。
80011de0 81 46 82 72 82 73 82 60 82 71 82 73 83 7b 83 5e :STARTボタ
80011df0 83 93 00 00 44 45 42 55 47 00 00 00 00 00 00 00 ン・・DEBUG・・・
たとえば、上の場合、「DEBUG」という文字列の先頭文字「D」のアドレスは、「80011DF4」になります。
さきほど基礎知識の説明したように、レジスタへのアドレスのロードは、上位、下位ハーフワードに分けて行われます。このため、ポインタの下位アドレス(2バイト)から、ポインタを参照しているところをサーチします。
上の場合、ポインタの下位は「1DF4」になるので、この値をサーチします。
具体的には、ExSTANDの場合、数値サーチで「M1DF4H」と入力してサーチを実行します。PsParの場合、データ長を2バイトにして、[値を探す(S)]で「1DF4H」を指定してサーチを実行します。
Bサーチ結果のアドレス周辺を逆アセンブルして、プログラムを解析します。
Aのサーチ結果、いくつかの候補がサーチできます。サーチされた各アドレスの周辺を逆アセンブルすると、次のようなルーチン(基礎知識参照)が見つかります。そこが「DEBUG」という文字列を表示するためのサブルーチンということになります。
lui a0,#$8001
addiu a0,a0,#$1Df4
jal $8007c200
後は、このルーチンを起点にして、プログラムを解析していき、デバッグルーチンに入るための具体的な条件を解析していきます。