解析初心者管理人メモ

はじめに

ルーチン発見方法といっても、解析方法によって異なりますが、
逆アセのソースとデバッガーを使用して発見する方法があります。
この場合は、逆アセしたオペコードを見る必要があります。

解析初心者の私には、オペコードを理解しているワケもないので
その都度調べては、ひとつひとつ追って、どこが開始ポイントなのか調べて行く必要がありました。
(これは解析するうえで、必ず通る道なのでしょうがないのですが・・・)
しかし、オペコードと格闘することなくルーチン部分の発見方法があったので、
メモ代わりに書いておきます。

使用ソフトは Geiger's Snes9x Debbuger(以下GSD) で行ってます。
SNES解析は、いろいろなサイトで行われていますので、細かい解析方法は記載しません(というか現状できません)

そんなお前に何ができるんだと思いますが、デバッガーが優秀なのでソフト頼りの使用方法として書いてます。



Usage Mapを使ってのルーチン発見方法

Usage Mapとは

Usage Mapとは実行されたプログラムやデータ流れのデバック情報のログをとっているもので
実行されたデータはプログラムデータとして、読み込まれたデータとして管理しているものと思われます。
ROMとRAMの情報の流れを一括で管理しているみたいです。
GSDでROMを読み込んでいれば、ROMと同じフォルダにROM名.Usageとしてファイルが出来ていると思います。
もし無ければ、Misc Options の Auto Usage Mapにチェックをいれると自動的に作成されます。
隅から隅までやり込んでいるほど、詳細な情報がが作られていると考えられます。



ルーチン発見方法その1

少しでもやったゲームなどで ROM名.usageが作成されている前提で話を進めます。
ROMを読み込み、任意の場所でGen. Offsetsボタンを押して任意の名前で保存します。
保存時に指定した名前同じ hoge.txt と hoge.ram.txtが作成されます。
hoge.txtには ROMの情報、hoge.ram.txtには RAMの情報
が書き込まれます。

hoge.txtをメモ帳などのソフトで開きます。hoge.ram.txtも同様です
各項目は以下
FirstByte ROM 読取or実行
RAM 読み書き 開始位置
LastByte ROM 読取or実行
RAM 読み書き 終了位置
Type DATA (データ)
CODE(ルーチン)
MIXED(混合データ)
???(不明 未実行、未読書)
Compressed 圧縮かどうか
Description 詳細
Modified 日時

TypeでCODEかMIXEDとなっている部分が実際にプログラムとして動作した場所、つまりルーチン部分になるはずです。
詳細なデータなので、ROM全体、RAM全体を見たときに役に立ちますが、
ゲームをやりこんでいるほど大量に項目が作成され逆に分かりにくくなってしまいます。
では特定の場所を見つけるにはどうするかを次に



ルーチン発見方法その2

特定のルーチンがあるだろうという部分まで、ゲームを進めます。

例)資金の増減。無敵になる。メニューを開く等 その他考えられるだけ

例として資金の増減としてのメモです。
(1) ある程度ゲームを進め ルーチンがあるだろう部分の直前まで進めます。
(2) Debug Console 側に画面を移し、ゲーム画面を止めます。
(3) Reset Debug ボタンを押しUsage Mapを消去します。
(このとき ROM名.usageがクリアされてしまう?ので事前にバックアップをとったほうがいいかも)
(4) ゲーム画面に移り 資金の増減するまで進めます。
(5) Debug Console側に画面を移し、ゲーム画面を止めます。
(6) Gen. Offsetsボタンを押して保存します。

(4)の部分は状況によって変わるものです。任意に置き換えて考えて下さい。
作業の流れは以上です。

メインでつかうループルーチンなども、情報として入ってしまうと思いますが
先ほどよりだいぶコンパクトなUsage Mapのデータが作成されていると思います。
関連する部分の検索が同時にできるのでいいかもしれません。

この方法はルーチンに限らず ROMやRAMのデータ読書部分を特定するのにも代用できると思います。
ROM内のデータを調べたいのに見つからない場合などは 事前にメモリにコピーされていたりするので
見つけられないかもしれませんが、RAMの読取でブレークするなど応用次第では見つけられるのでは
ないかと思います。



ルーチン発見方法その3

応用編として

その2で紹介した方法は、特定部分の検索は出来ますが、それでも多く結果が出てしまう場合があります。
さらに範囲を狭めて突き詰めて検索する方法は (4) で何もしないで数秒待ち
結果を出力します。

出力された結果の中にあるルーチン部分は ループルーチン部分と考えられます。
大まかな部分として コントローラー入力、画面更新、ランダム生成、プログラムカウンタ、音再生、等
の処理だと考えられるので、これら結果をその2で出力した同じ部分とだけを取り除けば、範囲を突き詰められます。
テキスト比較できるDF等のソフトを使うと結果がわかりやすいです。

比較結果をさらに付け加えて、その2を実行後も同様に何も処理しないでログを取りものと比較するのもいいかもしれません。






以上、参考になれば









最終更新:2009年09月18日 17:58