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

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

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

アセンブラの概形もできたので

アセンブラ開発と機械語解析を並行して行いまーす。

 

f:id:kmynews:20130519112450p:plain

 

こちらの解析を行いましたー。

えーと、こちらには2つの構造体がありましてー

 

typedef struct _IMAGE_SYMBOL {

    union {

        BYTE    ShortName[8];

        struct {

            DWORD   Short;     // if 0, use LongName

            DWORD   Long;      // offset into string table

        } Name;

        DWORD   LongName[2];    // PBYTE [2]

    } N;

    DWORD   Value;

    SHORT   SectionNumber;

    WORD    Type;

    BYTE    StorageClass;

    BYTE    NumberOfAuxSymbols;

} IMAGE_SYMBOL;

 

typedef struct IMAGE_AUX_SYMBOL_TOKEN_DEF {

    BYTE  bAuxType;                  // IMAGE_AUX_SYMBOL_TYPE

    BYTE  bReserved;                 // Must be 0

    DWORD SymbolTableIndex;

    BYTE  rgbReserved[12];           // Must be 0

} IMAGE_AUX_SYMBOL_TOKEN_DEF;

 

それっぽいのをwinnt.hから探すだけの簡単なお仕事です(泣)

ちなみにセクションでない場合はIMAGE_SYMBOL1つだけでいいみたい。

というかIMAGE_AUX_SYMBOL_TOKEN_DEF構造体は、IMAGE_SYMBOLのNumberOfAuxSymbolsで数を指定できるみたい。

 

なんとなくで分かってくれ(切実)

 

ち~~~ん(笑)

 

名前が8文字より長いシンボルは

シンボルテーブルの後ろに文字を書くスペースがあって

そこへのポインタを書くのかしら

 

っていう

 

あと、textセクション本体の最後に書いてあるシンボルテーブルっていうのは

リロケーション=再定義なんとか?で

この構造体を使ってるみたい。

 

typedef struct _IMAGE_RELOCATION {

    union {

        DWORD   VirtualAddress;

        DWORD   RelocCount;             // Set to the real count when IMAGE_SCN_LNK_NRELOC_OVFL is set

    } DUMMYUNIONNAME;

    DWORD   SymbolTableIndex;

    WORD    Type;

} IMAGE_RELOCATION;

 

わかったよーなわかんないよーな(´・ω・`)

 

この構造体の数はセクションヘッダのnumber of relocationsで指定するのか‥‥めんどい

けど機械語には区切りっていうものがないから、こういう長さのデータも書かなきゃいけないという。

 

ところで

 

ところで

 

ところで

 

f:id:kmynews:20130519113626p:plain

 

わ・か・ら・ん☆

 

これ、ネットで調べたら

なーんかCodeViewみたいなのを使ってるらしい。

 

なので

その線でいろいろ調べたけどわかんない(´・ω・`)

 

.debug$Sセクションであることは分かったけど

資料見ても項目はあったのに何も書いてないよヽ(`Д´#)ノ

 

textセクション本体の後にあるdataセクションで

文字列なんとかいろいろ定義した後に

debug$Sセクションがきてるわけなんですが

 

04 00 00 00 F1 00 00 00 6E 00 00 00 33 00 01 11 00 00 00 00

 

こちらーがー問題の機械語となってるわけですが

 

それっぽいのを見つけてきた(dbgHelp.h)

 

typedef struct _MODLOAD_DATA {

    DWORD   ssize;                  // size of this struct

    DWORD   ssig;                   // signature identifying the passed data

    PVOID   data;                   // pointer to passed data

    DWORD   size;                   // size of passed data

    DWORD   flags;                  // options

} MODLOAD_DATA, *PMODLOAD_DATA;

 

けど

これ、サイズ的には合ってるけど

なんか違和感がするんですーするんですー

 

そもそも構造体の名前からしてアレ。

 

困ったなぁー

 

とりあえず機械語を適当に分解すると

04 00 00 00

F1 00 00 00

6E 00 00 00

33 00 01 11

00 00 00 00

になるのかしら。

 

これ、test64.objの話ですが

いろいろあってたまたま「test64_2.obj」を作ったら

その中にはこう書かれてました。

 

04 00 00 00

F1 00 00 00

70 00 00 00

35 00 01 11

00 00 00 00

 

となっておりますが

 

もしも先ほどの構造体でおkだとしたら

この構造体の直後にオブジェクト名の絶対パス名が書いてあったので

test64.objとtest64_2.objとじゃサイズが2つ変わっちゃうわけですよ。

なのでdataとsizeメンバの説明ができ‥‥るかなぁ。

 

気になるのが

35 00 01 11のあたりかなぁ。

上位(なのか?リトルエンディアンでこう呼んでいいのか?)の01 11

これが何を意味するのか

これを読んだあなた、どうか真相を暴いて下さい。

それだけが私の望みry

 

実はここ、dumpbinでも解析されないorz

どうすりゃいいってんだよこれ(´・ω・`)

 

もう1つ気になるのがですね

このdebug$Sセクションの終端が

6E 00 00 00の次のアドレスに6Eを足したものと一致するんですね。

構造体の終端でも先頭でもなく、6E 00 00 00という一変数の終端のアドレスが

基準になっているって

なんかおかしくありません?

 

そもそもこれは構造体ではないとか

2つの構造体で成っているとか

考えられるわけですが

 

もう1つ過程を。

33 00 01 11はDWORDではなく

33 00のWORD?かな?という。

 

少なくとも33 00っていうのは

この後にあるobjファイル名の文字列の長さを表していると思うんですが

その後の01 11から計算を始めると

アドレスを33進めたらオブジェクトファイル名終端のNULL文字と一致するんです。

 

01 11を入れずにその後の37 00を含むべきかも難しいところですし

オブジェクトファイル名の前の01 11 00 00 00 00が

何を表すかも不明ですし。

全然わかんないですし(´・ω・`)

 

誰か‥‥誰か資料を僕にくれるんだ‥‥!

 

 

※つ・い・き☆

04 00 00 00 → 4バイト後の6E 00 00 00、間接的に次のセクションの先端を指している?

F1 00 00 00 → 終端のアドレス+F1が、シンボルテーブルにおける.dataセクションのアドレスと一致

01 11 00 00 00 00 → 知らんがな