x64 の逆アセンブルとハンドアセンブルやってみた
x64dbg
という、X64向け デバッガ&逆アセンブラを見つけたので使いながら X64のハンドアセンブルやってみました
1. X64 のファンクションコールは スタックを積んだコールは行わなくて全部レジスタ渡しっぽい。
例
lea rcx,qword ptr[xxxx] // 48 8d 0d XX XX XX XX call GetModuleHandleA // FF 15 XX XX XX XX |
lea rdx,qword ptr[xxxx] // 48 8d 15 XX XX XX XX mov rcx,rax // 48 8b c8 call GetProcAddress // FF 15 XX XX XX XX |
2. コールや文字列参照など、すべてのアドレス参照が相対アドレスっぽい
例
[100100] test :DB 'test',0 [100200] lea rcx,qword ptr[test] // 48 8d 0d F9 FE FF FF (-0x100 - 7(命令コード長分)) |
3. スタックフレーム渡しで関数呼ばないと例外で落ちるっぽい
例
push rbp // 55 mov rbp,rsp // 48 8b ec sub rsp,20 // 48 83 ec 20 処理 add rsp,20 // 48 83 c4 20 |
|。・ω・)。o (ちょっとめんどくさいね)
x86版もあるけど Windows 2000の場合。
DebugBreakProcess がなくて動かない
使う必然性は無いので関数の実装は放置
これからx64とかの勉強を始めようと思っていたので助かりました!