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

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

第3回 COFFオブジェクトファイルの解析(1)

タイトルでは第回とか(1)とかつけてますが

本サイトは講座とかではなくただの日記なのであしからず

 

(前回までのあらすじ)

アセンブラEXEではなくOBJを出力することを思い出し

急遽OBJの解析にかかる僕だったが‥‥

 

  000000000000000B: 48 8D 15 00 00 00  lea         rdx,[message]

                    00

 

messageのアドレスはどこに書いてるの?

 

という話でしたが

心配なく

 

シンボルテーブルにありました

 

                                             Symbol  Symbol

 Offset      Type              Applied To   Index  Name

 --------    ----------------   -----------------  --------  ------

 0000000E  REL32             00000000         C  message

 

うーん。

(適宜スペースを調整してみた)

 

仮想アドレスがEのところに0があるけど

そこはmessageっていうシンボルを置く場所だからねー

って予約してるみたい。

 

ところでこのSymbol IndexのところがCになってるけど

これは適当につけてもいいのかなと思ったらそうじゃなくて

解析ファイルの最後のほう

 

COFF SYMBOL TABLE

000 00CDC627 ABS    notype       Static       | @comp.id

001 00000010 ABS    notype       Static       | @feat.00

002 00000000 SECT1  notype       Static       | .text

    Section length   4D, #relocs    7, #linenums    0, checksum        0

004 00000000 SECT2  notype       Static       | .data

    Section length   18, #relocs    0, #linenums    0, checksum        0

006 00000000 SECT3  notype       Static       | .debug$S

    Section length   7C, #relocs    0, #linenums    0, checksum        0

008 00000000 SECT4  notype       Static       | .drectve

    Section length   34, #relocs    0, #linenums    0, checksum        0

00A 00000000 UNDEF  notype       External     | ExitProcess

00B 00000000 UNDEF  notype       External     | MessageBoxA

00C 0000000B SECT2  notype       Static       | message

00D 00000000 SECT2  notype       Static       | caption

00E 00000000 SECT1  notype ()    External     | Start

 

にちゃっかり書いてありました。

めんどいω・`)

なぁー。

 

詳しい人には分かるかもしれないけど

シンボルテーブルはOBJファイルの最後の方にまとめられているみたい。

f:id:kmynews:20130515221055p:plain

 

ω・`)

難しいなぁーorz

 

ねーねー、

ところで解析の最初に書いてある

               F number of symbols

に、「シンボルの数は15個です」って

書いてあるわけなんだけど

 

上のシンボルテーブルで

Sectionで始まる行も含むってことでおk?

なの?

ほらCOFFの番号が飛んでるし。

 

いいのかなぁ‥‥

 

実はあのあとアセンブリをちょっと書き換えて

全く同じ引数でMessageBoxA関数を2回呼び出すようにしたので

もともとはシンボルテーブルのSymbol Indexがどこからきてるのか

調べるためでしたが

 

これのせいで話がややこしくなりました。

 

0000000E  REL32                      00000000         C  message

 00000015  REL32                      00000000         D  caption

 00000021  REL32                      00000000         B  MessageBoxA

 0000002F  REL32                      00000000         C  message

 00000036  REL32                      00000000         D  caption

 00000042  REL32                      00000000         B  MessageBoxA

 00000049  REL32                      00000000         A  ExitProcess

 

Symbol Indexはどこで決まってるのかとか

IDみたいな役割をするってのは分かったんですが

問題がこちら。

 

6D 65 73 73 61 67 65 00

0B 00 00 00 02 00 00 00 03 00

 

こちらがmessageのシンボルテーブルに該当する部分なわけです。

最初の6D65のあたりはmessageというASCIIコード文字で、

0Bっていうのはさっきのアドレスっていうのは分かるんですが

 

0000002F  REL32                      00000000         C  message

 

はーいmessage様御当選おめでとうございますそれではくじをもう一度―

 

のあたりの

 

0000002F

 

これをどこに書いてるのが分からないんですね。

 

‥‥

‥‥‥‥

‥‥‥‥‥‥‥‥

 

2F 00 00 00 0C 00 00 00 04 00

 

んん?あやしいぞ!?

 

なーんか、

 

f:id:kmynews:20130515221056p:plain

 

ここが怪しい‥

臭う‥臭うぞ!

 

最後に04 00をつけてるのは区切りかな?

‥‥あああああああああああああああああああああああ

 

04 00はこれを表しているんじゃないかなーって。

(Symbol) Type : REL32

 

うーん

これ、正しいのかしら。。

 

世の中にはわからないことだらけです(´・ω・`)

仮定

仮定

仮定

仮定

仮定

 

裏付けましょうーっていうことで

 

.data

testdd WORD 4096

caption db "64びっと", 0

message db "いやっほーい", 0

.code

Start PROC

  sub    rsp, 28h     ; シャドウ領域、スタックをアライメントする

  mov    ax, testdd

  mov    rcx, 0

  lea    rdx, message

 

アセンブルしてdumpbin

どうだ?

 

00000007  REL32                      00000000         D  testdd

 

(´・ω・`)

(´・ω・`)(´・ω・`)

(´・ω・`)(´・ω・`)(´・ω・`)

 

‥‥あれ?

REL32ってREAL 3232ビット整数でしょ?

どうしてWORDでもこうなるの?

 

うーむ(´・ω・`)

 

と思ったら整数じゃなく実数だた

謎は深まるばかり。

 

浮動小数点数は通常64ビットだから

32ってことは単精度でしょうねー。

 

とりあえず04 00は単なる区切り文字だと思っときます。
ただ、シンボルテーブルだからにはTypeがどこかに書いているはずで、

それが書いてそうな場所が04 00以外にないんですよね‥‥。

 

とりあえず、まとめると

l  シンボルテーブルはファイルの最後にまとめられてる!

l  textセクションの最後に簡単なシンボルテーブルもとぎがある
textセクションのここにこのインデックスを挿入しますよっていう感じ)

 

ところで

解析結果の最後にあった

 

00A 00000000 UNDEF  notype       External     | ExitProcess

00B 00000000 UNDEF  notype       External     | MessageBoxA

00C 0000000B SECT2  notype       Static       | message

00D 00000000 SECT2  notype       Static       | caption

 

0000000Bは、

textセクションの中の位置ではなく

シンボルテーブルの中の位置かなぁ?(´・ω・`)

 

たくさんありすぎて1記事内ではとても書ききれない

それくらい謎が多いし、面白いことも多い

 

僕はそういうことに喜びを(略