第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ファイルの最後の方にまとめられているみたい。
(´・ω・`)
難しいなぁー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のシンボルテーブルに該当する部分なわけです。
最初の6D~65のあたりはmessageというASCIIコード文字で、
0Bっていうのはさっきのアドレスっていうのは分かるんですが
0000002F REL32 00000000 C message
はーいmessage様御当選おめでとうございますそれではくじをもう一度―
のあたりの
0000002F
これをどこに書いてるのが分からないんですね。
‥‥
‥‥‥‥
‥‥‥‥‥‥‥‥
2F 00 00 00 0C 00 00 00 04 00
んん?あやしいぞ!?
なーんか、
ここが怪しい‥
臭う‥臭うぞ!
最後に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 32?32ビット整数でしょ?
どうして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記事内ではとても書ききれない
それくらい謎が多いし、面白いことも多い
僕はそういうことに喜びを(略