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

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

第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日詰まりました。ていうか今日です。。

 

いろいろやってみてやっと分かりました。

要するに足し算ですね。いやー無知は罪だ。

WindowsIntelの基礎知識さえ身に着けていないまま勉強を進めてるので

(というかその基礎知識を身につけるための資料すら見当たらない状態)

こうやって暗中模索ちうなわけで。

残りの

 

  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