機械語初心者がアセンブラを作ってみる

機械語初心者がアセンブラを作ってみるだけのブログです。ひつまぶしひつまぶし

第1回 ml64.exeとdumpbin.exeを使ってみた

まず、今回は

機械語解析の手始めに

ml64.exeアセンブルした実行ファイルを作ってみます!

 

なぜ勉強用の実行ファイルをC言語コンパイラで作らないかというと

アセンブラで作ったほうがシンプルな機械語になると思って。。

というかコンパイラなんかで作ったら

後で調べる時にアセンブリの意味が分かんなくなっちゃうというか。。

 

にゃはー

 

ずーっと前にどこからかDLしてきたアセンブラを使います。

昔すぎてどこからDLしたか忘れましたが、

フォルダ名は「C:\Program Files (x86)\Windows Kit\8.0」でした。

 

それからVisual Studioも必要かなー。

Expressでいいです。というか僕Express使ってます。

VSのバージョンは11.0です。

 

んでんで

適当なフォルダを新しく作って

そこにバッチファイルを作って

以下のコードを書き込みます。

64ビット専用のバッチファイルが生まれます♪

 

@path %path%;C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64;C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin;C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE;

@set LIB=%LIB%;C:\Program Files (x86)\Windows Kits\8.0\Lib\win8\um\x64;C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\amd64

@set INCLUDE=%INCLUDE%;C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include

@cmd

 

ダブルクリックコマンドプロンプトが起動します。

あ、うちのパソコンWin7ね。

ここでダブルクリックしたやつでないとアセンブルできない。

 

; サンプル x64 アセンブリー・プログラム

; Chris Lomont 2009 www.lomont.org

extrn ExitProcess: PROC   ; システム・ライブラリーの外部関数

extrn MessageBoxA: PROC

includelib "user32.lib"

includelib "kernel32.lib"

.data

caption db "64びっと", 0

message db "いやっほーい", 0

.code

Start PROC

  sub    rsp, 28h     ; シャドウ領域、スタックをアライメントする

  mov    rcx, 0

  lea    rdx, message

  lea    r8,  caption

  mov    r9, 0

  call   MessageBoxA

  mov    ecx, eax

  call   ExitProcess

Start ENDP

End

 

; /entry:Start

 

; fastcall(新しい関数呼び出し規約)

; 引数はrcxrdxr8r9r10r11

; 戻り値はrax

; 浮動小数点数の戻り値はxmm0

 

32ビットプログラムの関数呼び出し規約がSTDCALLっていうのは

既知の事実だと思うんですが

64ビットではFASTCALLってのを使うみたい。

簡単な仕様は上のコメントに書いてるとおり。

 

アセンブリ一番最初に著作権表記があるんですが

そこから借りてきたコードを載せていたブログがどっかにあったので

そこから転載してちょこっと付け足してきました。

 

ずっと前に作ったアセンブリなので

どこから落としてきたかも覚えてません。ごめんね

 

ml64 test64.asm /link /subsystem:console /entry:Start

 

で、アセンブルです。

疲れた。

 

細かいコマンドラインとかの説明はMSDNに丸投げするとして

(コマンドラインで /? オプションをつけたら説明が見られる)

 

次はdumpbin.exeを使ってみます。

このdumpbin.exeっていうのが

 

dumpbin /DISASM /ALL /OUT:test64.txt test64.exe

 

で呼び出せます。

dumpbin.exeっていうのは、逆アセンブルしたり機械語を翻訳してくれたり、万能なツールなわけで。

 

万能じゃない?お前居残り!

 

で、これから機械語の解析をするわけですが、資料がほとんどないという状況なので、

dumpbin.exeはこれからの僕にとって

全自動答え合わせ機

になっちゃう

という悲しい側面を持ち合わせています。

 

dumpbin.exeがないと何もできない(´・ω・`)

 

 

※修正(23時29分) バッチファイルのLIBを修正(cl.exeで64bitアプリが作成できない問題があったため)

※修正(23時34分) バッチファイルのINCLUDEを修正(11.0ではなくなぜか10.0のフォルダからINCLUDEしていたため)

 

 

作ってみた

このブログは

 

機械語初心者がアセンブラを作ってみるまで

 

かな~り大雑把に綴るブログです。

 

に、なるかもしれません。

多分。

 

僕の知識といえば、

アセンブラはニモニックやオペランドを直接機械語に置き換えるんだなー

っていう程度かな。

 

実を言うと、

Windowsアプリケーションを作るコンパイラを作ろうと思ったけど

今までに作ったのはプログラムをアセンブリに変換する

ステージコンパイラ(広義)ばかりで

ネイティブコンパイラを作ったことは一度もないんです。

しかもそのアセンブラすら自作ではなくMASMという。

 

念願のネイティブコンパイラを作る代わりに

自分でアセンブラを作っちゃおう と思ったので。。

 

なんか

自分で作ったコンパイラソースコードをアセンブリに置換した後、

MASMではなく自分で作ったアセンブラ機械語に置き換えるのって

気持ちよさそうですよね?

どうせプログラミング言語作るなら機械語吐くまで全部自分でやりたい。

という理由で。

 

もちろんWindowsアプリケーションがアセンブルできるように

っていうのが目標です。

 

Windowsアプリケーション(exeファイル)の機械語には

PEヘッダとか

大量のNULL空間とか

あるらしいんですが

それはこれから勉強(汗)

とりあえずPEヘッダの前には

DOSで起動しようとしたバカ向けのコードを書いてる

あたりまでは覚えますた。

 

 

としまして

今はとりあえず

アセンブラ作りはじめました。

 

アセンブラの開発言語はC。

実はC言語自体も初心者でよく分からないのですが

先ほど「mov eax, ebx」をトークン解析するあたりまできました。

(※まだ機械語には置換してません)

 

今までコンパイラを作るときは

日本語プログラミング言語「なでしこ」を使っていましたので、

英語のプログラミング言語はちょっとわからないですねw

 

アセンブラの言語仕様(という呼び方でいいかも分からないけど)

については

実はまだまとまってないのでぽちぽち決めていきます。

機械語勉強のために作るし

上手く行ってもどうせコンパイラの踏み台にするし

めちゃくちゃでもいいやという感じで。

 

アセンブラの名前は「三日坊主」でいきます。

どうせ途中で飽きますので、よろしくお願いします。