第4回 COFFオブジェクトファイルの解析(2)
はーい
今日も痛い文が飛び出てきますよー
さっきの記事の最後に
「0Bは文字列リテラルのかたまりの中のアドレスじゃね」って
書いたわけですが
オブジェクトファイルに上のような変更を加えて
リンクしてみたんだ。
そしたら
(`・ω・´)
(※変更前の動作はこちら)
ね?
機械語でどこをどう変えたら
どうなっちゃうか分かっちゃうってのが
楽しいというか
念のためEXEファイルの中をメモ帳で開いてみましたが
「いやっほーい」のとこはちゃんと残ってました。
一度も使われていないリテラルであっても
オブジェクトファイルに残ってればそのままファイルサイズに‥‥ごくり
シンボルテーブルの見方をメモっとく。
00B 00000000 UNDEF notype External | MessageBoxA
00C 0000000B SECT2 notype Static | message
00B、00CってのはSymbol Indexかなぁー。textセクションの最後にあるテーブルでも使う。
00000000、0000000Bはシンボルテーブル‥じゃなかった、
シンボルテーブルの前に文字列定義してるかたまりがあったんだけど
その中のアドレス。多分。
というかMessageBoxAはまだリンクしてないのでUNDEFです(´・ω・`)
UNDEFは無条件で00000000になるのかしら?
SECT2は2番目のセクションと関係してますよーって意味?なのかしら?(´・ω・`)
2番目のセクションと言ったらtextかなぁー。。
notypeってなにそれおいしいのry
とりあえず他も全部notype(関数のStartだけ最後にかっこついてた)
MessageBoxAにかっこがついてないのはまだ関数かどうかも分からないから?
今はまだ詮索せんとこうと。
ExternalとかStaticとかは知らんがな。
Externalって「これからリンクする時外部にあるかもよー」って意味?
でもStartにもExternalついてるし(´・ω・`)
もう関数=External、アドレス=Staticでええわ。知らんがな(´・ω・`)
隊長!シンボルテーブルの1行の情報は構造体になっているものと思われます!
何だと!して、構造体の定義は?
知らんがな(´・ω・`)
バイナリの中の定義部分確認してみました。
(※messageの行の00を0Bに戻し忘れてたけどまあいっか)
6D 65 73 73 61 67 65 00 00 00 00 00 02 00 00 00 03 00
のうち
6D 65 73 73 61 67 65 00
はもちろんmessageのASCIIですよね。
そしたら
02 00 00 00
はSECT2、
03 00
はStaticを表す?
なーんか選択部分の直前の02 00が引っかかるんですよ。
2 → External
3 → Static
でいいのかなぁ(´・ω・`)知らんがな
なんか知らんがなばかりだけど暗中模索だから仕方ない‥‥orz
notypeということは当然0だろうけど、どこにあるんだろそんなデータ。
messageとNULL文字のすぐ後の4バイトはアレでしょ、
文字列のかたまりの中の、自身のデータが格納されているアドレス。
最近の若者言葉で言うところのRVAなのかしらー。
しかしRVAって無駄にかっこいい。
Tシャツ作ってもいいレベル。
ついでなのでExitProcess、MessageBoxAの定義部分も確認します。
なーんかどちらも文字列が入るべきところが00 00 00 00になってて、その後に04だとか10だとかあるわけなんですが、これはファイル最後の「ExitProcess」「MessageBoxA」関数名がまとまってるところがあって、そこのアドレスだと思いまし
1C@2DEのところが0にあたる?