第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(新しい関数呼び出し規約)
; 引数はrcx、rdx、r8、r9、r10、r11
; 戻り値は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
アセンブラの言語仕様(という呼び方でいいかも分からないけど)
については
実はまだまとまってないのでぽちぽち決めていきます。
機械語勉強のために作るし
上手く行ってもどうせコンパイラの踏み台にするし
めちゃくちゃでもいいやという感じで。
アセンブラの名前は「三日坊主」でいきます。
どうせ途中で飽きますので、よろしくお願いします。