2013年7月3日水曜日

EXEファイルの仕組み

EXEファイルの構造

MZヘッダー、PEヘッダー、セクションヘッダー からなる。

  1. MZヘッダー:DOSヘッダー
  2. MZヘッダー:MS-DOS用スタブ
  3. PEヘッダー:シグネチャ
  4. PEヘッダー:ファイルヘッダー
  5. PEヘッダー:オプションヘッダー
  6. セクションデータ:セクションヘッダー1
  7. セクションデータ:セクションヘッダー2
  8. セクションデータ:…
  9. セクションデータ:セクション1
  10. セクションデータ:セクション2
  11. セクションデータ:…

DOSヘッダー

先頭はMZ。


MS-DOS用スタブ

This program cannot be run in DOS mode. を表示するプログラム


PEヘッダー

PEという2文字と2byte分の0からなるシグネチャが先頭。


セクションデータ

Windowsプログラム本体。いくつかのコード(命令)やデータのまとまり(セクション)に分けられている。
各セクションヘッダーの並びの後に、セクション本体が並ぶ。



EXEファイルの内容をダンプする


ダンプツール:dumpbin.exe → MZヘッダーを読み飛ばす。

以下のダンプ出力コードで、exeを作成すれば、すべて閲覧できる。



%02Xは16進数を表す%xに02: 最低2文字出力し、足りなければ 0 で埋める。と X: 大文字で表記を追加した書き方。
%08Xであれば、最低8文字で足りなければ0で、大文字表記。


上記をコンパイル&リンクすれば、良い。

cl dump.c
上記で作成した dump.exe でMZ(4D 5A)ヘッダも確認できる。 50 45 00 00 はPEヘッダー。


このダンププログラムは exe だけに使えるわけではなく、txt ファイルなどにももちろん使える。

たとえばある文字列が exe のヘッダに含まれていることを確認したければ、txt ファイルに文字列を
記述して dump した文字列が、exe のdump結果に含まれているか見ればよい。


PEヘッダーとセクションデータの内容

dumpbin /[オプション] EXEファイル名

FILE HEADER VALUES の number of sections の個数分、section ヘッダー があることを確認できる。

プログラム中に分散したコードやデータは、コードのセクションとデータのセクションにまとめれていることも確認できる。


セクションの内容を見る

dumpbin /rawdata EXEファイル名
RAW DATAのナンバーが、セクションナンバーの数だけある。


逆アセンブル

コマンド: dissm

dumpbin /disasm EXEファイル名

push や mov、call などから、callが関数、pushがそれに渡す引数のように使われていることがわかる。


簡単なプログラムを書いて、コンパイラがどのようにコードを整理するのか確認してみると
おもしろい

次は メモリーロード。






0 件のコメント:

コメントを投稿