講座04 〜逆アセンブラを使ってみる〜

〜はじめに〜

やっと講座4回目で、逆アセンブラの使い方の紹介です。
今回はDisassemの使い方を解説します(Diswinの使い方は次回予定です)

ただしOSはWindows98を対象とし、逆アセンブルリストの出力には、
DOSプロンプトから直接指定というレトロな方法を用いています。
今更DOSを覚えても仕方ないかもしれませんが、知っておいていても損はありませんし、
過去の技術というのも、結構面白いものですしね♪

〜Disassem編〜

ダウンロードしてきたzipファイルを解凍すると、Dis.exe (※バージョンにより異なります) という
実行ファイルが展開されますので、これを使えるようにしましょう。
そのためにパスの通ったフォルダへ、ファイル Dis.exe をコピーします。
…分からない人は、とりあえず WINDOWS フォルダにコピーしちゃいましょう。
(以後の解説は、WINDOWSフォルダにコピーした…ということを前提に解説を進めます)

とりあえず、DOSを使ってみる

そして、「スタート」→「プログラム」→「MS-DOSプロンプト」の順にメニューを選択し、
MS−DOSプロンプトを起動します。
C:\WINDOWS>
こんな感じに表示されるはずですので、以下のように入力してENTERを押しましょう。
C:\WINDOWS>DIS.EXE
これで、もし WINDOWS フォルダに正しくコピーできていたら…
C:\WINDOWS>DIS.EXE
usage: dis input_file_name > output_file_name
version 0.23 released September 12, 2001
とまぁ、こんな感じにコマンド指定方法を表示して終了するはずです。
では、以下のように入力してENTERを押してみましょう。
C:\WINDOWS>CD ..
「CD」というのはディレクトリ(フォルダ)を変更するコマンドで、「..」というのは
一階層下…つまり上記のコマンドは「C:\ に移動せよ」という意味になります。これで、
C:\>
というようにカーソルの前に表示されていた、現在位置のフォルダ名(カレントディレクトリ)が
上記のように変われば成功です。
では、さらにそこでもDis.exeを実行してみましょう。
C:\>DIS
もし、これで先ほどと同じくコマンド指定方法が表示されれば成功です。
(.EXEが省略されていますが、プログラムなどの場合は拡張子を省略できます)。
特定のフォルダにある実行ファイルを、別のフォルダからでも実行できるようにする…
とまぁ、これがパスを通す利点です。

ちなみに、ドライブを移動するには…
C:\>D:
と入力してENTERを押せば、Dドライブに移動します。
どんなフォルダやファイルがあるか見たいときは、さらに…
D:\>DIR
と入力して、ENTERを押しましょう。
色々と表示されますが、<DIR>という文字がくっついているのがフォルダ名で、
それ以外は全てファイル名になります。
仮に、Dドライブの GAME というフォルダに移動したかったら…
D:\>CD GAME
と入力してENTER。これで表示が、
D:\GAME>
となれば移動完了です(さらに DIR を実行すると、その中も見れます)。
DOS窓を閉じるには、
D:\GAME>EXIT
と入力してENTERを押すか、ウインドウ右上の終了ボタンをクリックすればOKです。

逆アセンブルリストを出力してみる

逆アセンブラは、拡張子EXEの実行ファイルもしくはDLLなどを解析し、
リスト化して出力することを目的とされています。
というわけで今度は、その方法を説明します。
仮に、Cドライブのフォルダ GAME にあるプログラム START.EXE を対象 という場合、
手順は以下のようになります。
C:\>CD GAME
C:\GAME>DIS START.EXE > LIST.ASM
これで、同フォルダに LIST.ASM というファイル名でリストが出力されます。
動作としては「DIS START.EXE」で、START.EXEを対象に逆アセンブル、
「> LIST.ASM」で、ファイル LIST.ASM へ結果を出力…となります。

つまり「DIS START.EXE > START.TXT」と指定すれば、
START.TXTというファイル名で出力することができます。

閲覧方法

ファイルを出力できたなら、今度は内容を確認してみましょう。
で、閲覧するためにはテキストエディタが必要になります。
ベクターのサイトを見れば、たくさんの方が登録されてますので、色々と探してみましょう。
なお、逆アセンブルリストは数十メガバイト単位まで巨大化する場合もありますので、
出来るだけ動作が軽快なものをオススメします。
(ちなみに、ワードパットでも閲覧できますが、死ぬほど重いです)

出力内容

テキストエディタを手に入れたら、逆アセンブルリストを開いて見ましょう。
前半に色々と複雑なことが書いてありますが、とりあえずそれらは無視して、
+++++++++++++++++++ ASSEMBLY CODE LISTING +++++++++++++++++++
と書いてある行が見られるまでスクロールさせましょう。
そして、その数行後から、
=========
:00401000 55           push ebp
:00401001 8BEC          mov ebp, esp
:00401003 81EC08020000      sub esp, 00000208
:00401009 C785FCFEFFFF00000000  mov dword[ebp+FFFFFEFC], 00000000
といった感じの数列&メッセージが延々と続きますが、これが逆アセンブルリストのメイン部分です。
命令の意味は今後説明しますが、とりあえず読み方を説明しておきます。
1行目を例に挙げると…

:00401000 … アドレスです。
55      … そのアドレスにあるデータです。
push ebp  … データをアセンブラ言語の命令に翻訳したものです。

と、なります。
もしDBxSTANDでアドレス 00401000 を見ると、そこに 55 というデータがあります。
また、アドレス 00401001 を見ると、8B EC というデータがあります。
8B EC ということで2バイト使っていますので、その次の命令である sub esp, 00000208 は、
アドレス 00401003 から始まっています。
ま、このくらいを覚えておけば一通り読み方が分かりますね。

〜さいごに〜

今回紹介した方法は、超が付くほど非合理的ですが、まぁ、こういうやり方もある…ということで。
というわけで、次回はDiswin編です。
お楽しみに〜

>>NEXT STEP