使ってみよう!
とりあえずなんか解析してみましょう。
ps2dis.exe を起動したら適当にファイルをドロップしてください。
対応しているファイルは PS,PS2 のオブジェクトいろいろです。
なのでとりあえずドロップしてみてください。
もしなんの文句もいわれないのに画面に逆アセンブルコードが現れなかった場合、それはバグです。(まだまだ結構あったりします。)あきらめて違うツールを使ってください。(^^;
あと、システムによってはフォントがヘンっていう事例があります。
もしフォントがくそでっかいとか日本語が表示されない場合はメニューの
「設定」-「フォント...」でMSゴシックかなんかを選んでやってください。
なおフォント設定は上段のHEX画面と下段の逆アセ画面それぞれ別管理ですので、フォントを設定したいほうの画面をアクティブにした状態で設定してください。
解析のとっかかり。ラベルをつけよう。
PS2 の ELF だと、たま〜にシンボル情報が残ってるものがありますが
普通は期待できません。
そんなときに手がかりになるのはプログラム内の文字列と
syscall 呼び出し(BIOS コールです)それから
メモリマップドI/Oへのアクセスでしょう。
プログラム内文字列
大体ロードされたイメージの後ろのほうに入ってます。
文字列がどの辺にあるかは、私は Bz ってバイナリエディタ(いまだに V1.0使用)の Bitmap View って機能を使ってます。
メモリイメージを色で表示するってナイスな機能でテキスト部分は赤く表示してくれます。
さて、文字列が見つかったらラベルをつけていく訳ですが、日本語文字列が使用されている場合は先に SJIS なのか EUC なのかを見極めることをお勧めします。
「表示」-「漢字コード」で SJIS か EUC かを選択できます。
そんでは文字列の先頭位置にカーソルを合わせて、 Shift+B を押してみてください。自動的に文字列がラベルに設定され、文字列の終端までが BYTE 属性に変わります。
文字列は固まっている場合が多いですから、Shift+B を押しつづけることでかなり楽チンにラベル設定が出来ます。
#いらんラベルをつけてしまうこともあります(^^;
SYSCALL
たいていの PS2 のプログラムでは v1 に番号をいれて syscall をコールしています。これを見つけて自動的にラベルを貼り付ける機能が、「解析さん」-「SYSCALL にラベルをつける」です。
シンボルがないファイルを解析する場合には重宝すると思います。
#ほんとは sceSifCallRpc とかにラベルをつけられるといいのだけど。。。やろうと思えばできんことないんだけど、どうしたものか。
メモリマップドI/O
付属の ps2.map は「ファイル」-「ラベル定義ファイル取り込み」
で読み込むことが出来ます。わかっているアドレスは多くないですが
DMA を叩くコードの解析時には重宝しますので、
一回やっておくことをお勧めします。
ここまでやったらとりあえずセーブ
単純作業が終わったところでとりあえずセーブしましょう。
Ctrl+S でセーブしてください。拡張子は pis です。ちなみに英語の piss に由来。(わ
まだまだバグだらけのプログラムですからこまめにセーブするようにお願いします。(苦笑
地味に解析(笑
ここからはあなたの勘と根性が問われる辛気臭い作業の繰り返しです。
解析の主な作業は「ラベル貼り」です。Enter を押してみてください。
ラベルとコメントを設定するダイアログがでると思います。
#psdis って PSX 用の逆アセプログラムのリソースを無断でぱくってます
ラベルを設定したら、便利です(笑
説明するのは難しいのですが、ラベルの個所を参照している部分にそのラベルが表示されたりします。
#されない場合もあります。表示速度との兼ね合いで断念しました。
カーソルキーを駆使する
このプログラムはムギタさんの psdis
の影響を強く受けている、てことで操作はキーボード主体になっています。
メニューの位置付けは「キーアサインのヘルプ」と言い切っても過言でないです。
ほんでは基本的なキー操作方法を列挙しましょう。
【基本移動】
| キー | 動作 |
| 上・下 | 上下移動 |
| PageUp,Down | 上下移動 ページ単位 |
| Ctrl+PageUp,Down | 上下移動 1000h 単位 |
| Alt+PageUp,Down | 上下移動 10000h 単位 |
| g | アドレスを指定して移動 |
| 右 | 参照個所へ移動 |
このプログラムを作る動機となったのが、この「カーソル右」による参照個所へジャンプする機能です。もともと psdis にあった機能で、むちゃくちゃ便利です。
参照個所の特定能力は日々精進を繰り返しております。
参照個所にジャンプすると、同時に元いたアドレスが内部スタックにプッシュされます。(スタックの状態は画面右下のステータスバーのところに表示されます。)
カーソル左を押すと内部スタックからアドレスをポップしてそのアドレスに移動します。ようするに、左を押すことで元いたところに戻れるというわけです。
一連の動作は WWW ブラウザのヒストリ機能と同等と考えていいと思います。
【スタック関係】
| キー | 動作 |
| 右 | 参照個所へ移動。元のアドレスをプッシュ。 |
| 左 | ポップしたアドレスに移動。 |
| Ctrl+右、左 | スタックをプッシュ、ポップせずに移動 |
| Insert | 現在位置をプッシュ |
アセンブラコード以外の部分
上記で文字列にラベルを貼ったときに気づいたかと思いますが、
ps2dis では各行が属性を持っています。具体的には、
code,byte,half,word,dword,qword,unknown,undefined です。
値がロードされていないアドレスは undefined で、
なにかロードされると unknown (青色の背景)となります。
属性はキー操作により変更することが出来ます。
変更するとなんかいいことがあるのか、と思われるでしょうから、
以下に変更方法と効能を列挙しておきます。
| キー | 属性 | 効能 |
| c | code | unknown と変わりません。表示色が変わるくらいか。 |
| b | byte | バイト単位でラベル、コメントがつけられる。 文字列上で Enter を押したときに自動的にラベルが設定される。 |
| h | half | 2バイト単位でラベル、コメントがつけられる |
| w | word | ワード値をアドレスと認識し、そのアドレスにラベルがついていれば表示する。 |
| d | dword | さあ。。。 |
| q | qword | さあ。。。 |
| u | unknown | 青くなる |
| Shift+u | undefined | 白くなる |
実験プログラム「解析さん」
ムギタさんの psdis の検索機能はとっても便利なのですが、
PS2 のプログラムは PS のよりでかい場合が多いので、
同じような検索をすると、とてつもなく遅くなりそう、、、
ってことで代わりにこんな機能を作ってみました。
この機能は簡単にいうと、
インチキくさくプログラムを解析して、参照元、参照先の組を洗い出して検索できるようにしてしまえ!
というわけで、個人的には便利なんですがでかいファイルに対してこれをやると、とてつもなく時間とメモリが食い潰されて大変なことになってしまいます。
なので、プログラムの欠点は日々進化するマシンパワーで補ってください(笑
というわけで、適当にまともなプログラムを読ませた状態で「解析さん」-「逆参照解析さん起動」を選んでください。
参照個所に自動的にラベルが表示されるようになります。
ラベルには2種類あって、戻り番地を ra に保存する LEAF 呼び出しと、保存しない NON-LEAF 呼び出しです。
前者の場合は FNC_XXXXXXXX というラベルがつきます。後者は __XXXXXXXX になります。
ものすごく大きなイメージの場合はラベル数が巨大になって表示が目に見えて遅くなる場合があります。そんなときは Alt+A で解析さんが出力するラベルのみ非表示とすることが出来ます。このキーはトグルになっていて、もう一度 Alt+A を押すと表示します。
これだけでもコードの理解の手助けになる(と思ってる)んですが、
メインは
「とっても怪しい関数を見つけたけど、どこから呼ばれてるんだろう」
てときの検索です。
まず関数の先頭位置にカーソルを合わせてスペースを押します。
私はこれを「マークする」と勝手に呼んでいます。
マークは一度に一箇所しか行えません。
#これを複数にする計画があるには、ある。
マークしたら F3 を押してください。参照しているコードがあれば瞬時にそこへ移動します。以後 F3 を押す毎に次の参照個所へジャンプします。
【マーク、検索関係】
| キー | 動作 |
| スペース | 現在位置をマークする。 |
| F3 | マーク個所を参照している場所にジャンプ。順方向 |
| Shift+F3 | マーク個所を参照している場所にジャンプ。逆方向 |
| Alt+X | マーク位置と現在位置を交換 |
というわけでとても便利ですが、頼りきるとひどい目にあうかもしれません。
配列のランダムアクセスなんかは検知できてないってことを前提に使ってください。
ラベル位置に移動
今さっきできた機能です。Ctrl+G でダイアログが出ます。設定しているラベルが一覧表示されるので、選ぶとそこへ移動できます。
だいたいこんなもんです。おわり。
hanimar@geocities.com