第2回 メモリのアドレスとか
http://codezine.jp/article/corner/61
CodeZine連載「Windows実行ファイル「EXE」の謎に迫る」
こちらは
勉強の時に
非常に異常に役に立った資料です。
この資料が理解出来ればしめたものです。
僕の場合、9割は理解出来ました。残りの1割は‥‥うーん(汗
この資料で分からなかったところは
やっぱりこれですね、これ。
000000014000100B: 48 8D 15 F9 1F 00 lea rdx,[4000300Bh]
00
ようするに、lea rdx,は機械語で48 8D 15に置換できることがなんとなく予想出来ます。
では、F9 1F 00 00がどうして4000300Bhになるのでしょうか
というあたりで丸1日詰まりました。ていうか今日です。。
いろいろやってみてやっと分かりました。
要するに足し算ですね。いやー無知は罪だ。
WindowsやIntelの基礎知識さえ身に着けていないまま勉強を進めてるので
(というかその基礎知識を身につけるための資料すら見当たらない状態)
こうやって暗中模索ちうなわけで。
残りの
0000000140001020: E8 07 00 00 00 call 000000014000102C
0000000140001027: E8 06 00 00 00 call 0000000140001032
000000014000102C: FF 25 DE 0F 00 00 jmp qword ptr [40002010h]
0000000140001032: FF 25 C8 0F 00 00 jmp qword ptr [40002000h]
も同じような理屈で、
要するにニモニックが終了した次のアドレスとの足し算ってわけですね。
上のcallの場合、140001025+00000007=14000102Cですねー。
次のニモニックの先頭のアドレスから足していくんですねー。
途中で足し算には気付いたものの、
自身のニモニック(この場合は140001020)に足すと思い込んで
答えが合わなくて3時間も悩んだ人がいるみたいです。
っと、.textセクションは解析が一番簡単なのでここでは重要じゃないか。
問題は、一番最初に挙げた資料URIにすら載ってないオブジェクトファイルの内容についてです。
そもそもアセンブラは直接EXEを出力するわけではなく
COFFフォーマット(よく知らん)のオブジェクトファイルを出力するそうで。
なので、アセンブラで作ったオブジェクトファイルが
マイクロソフトのlink.exeでリンクできるようになるっていうのを
まず目標にします。
リンカは後から作るのでEXEファイルの解析は後でしなきゃいけないのに
真っ先に解析しちゃったお(´・ω・`)
ドジっちゃったお(´・ω・`)
さてオブジェクトファイルをdumpbinするお(`・ω・´)
000000000000000B: 48 8D 15 00 00 00 lea rdx,[message]
00
(`・ω・´)
( ゚д゚)
(´・ω・`)
今度はmessageのアドレスすら書いてないじゃないですかやだー
やだー
やだー‥‥
一難去ってまた一難ってのはこのことですね‥‥。
とりあえずオブジェクトファイルは資料もないので自分で頑張ってdumpbin読むしか‥‥
orz