EXEファイルの構造
MZヘッダー、PEヘッダー、セクションヘッダー からなる。- MZヘッダー:DOSヘッダー
- MZヘッダー:MS-DOS用スタブ
- PEヘッダー:シグネチャ
- PEヘッダー:ファイルヘッダー
- PEヘッダー:オプションヘッダー
- セクションデータ:セクションヘッダー1
- セクションデータ:セクションヘッダー2
- セクションデータ:…
- セクションデータ:セクション1
- セクションデータ:セクション2
- セクションデータ:…
DOSヘッダー
先頭はMZ。
MS-DOS用スタブ
This program cannot be run in DOS mode. を表示するプログラム
PEヘッダー
PEという2文字と2byte分の0からなるシグネチャが先頭。
セクションデータ
Windowsプログラム本体。いくつかのコード(命令)やデータのまとまり(セクション)に分けられている。
各セクションヘッダーの並びの後に、セクション本体が並ぶ。
EXEファイルの内容をダンプする
ダンプツール:dumpbin.exe → MZヘッダーを読み飛ばす。
以下のダンプ出力コードで、exeを作成すれば、すべて閲覧できる。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
int main(int argc, char *argv[]){ | |
FILE *fp; | |
int c, n; | |
if ((fp = fopen(argv[1], "rb")) == NULL) { | |
printf("file open error!\n"); | |
return -1; | |
} | |
n = 0; | |
while((c=fgetc(fp)) != EOF){ | |
if (n % 16 == 0) printf("\n%08X :" , n); | |
printf("%02X ", c); | |
n++; | |
} | |
printf("\nfile size = %d\n", n); | |
fclose(fp); | |
return 0; | |
} |
%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のナンバーが、セクションナンバーの数だけある。
逆アセンブル
コマンド: dissmdumpbin /disasm EXEファイル名
push や mov、call などから、callが関数、pushがそれに渡す引数のように使われていることがわかる。
簡単なプログラムを書いて、コンパイラがどのようにコードを整理するのか確認してみると
おもしろい
次は メモリーロード。
0 件のコメント:
コメントを投稿