第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していたため)