[.NET]実行ファイルをダンプする
バイナリ情報をダンプする
ちょっと組込を思い出して楽しかった。
マイクロアドBTパートナーはブログやサイトに貼るだけ。お小遣いをゲットしよう!
[テスト環境]
Visual Studio 2008 StandardEdition
実行ファイルのダンプを行ってみる。
ダンプのためには、VisualStudio付属の dumpbin.exe を使用する。
先ず、ダンプする実行ファイルとして以下の簡単なソースを作成してみた。
(フォームLoad時にメッセージボックスを表示するだけ)
[テストコード]
using System;
using System.Windows.Forms;
namespace HelloWorld
{
public partial class HelloWolrdForm : Form
{
public HelloWolrdForm()
{
InitializeComponent();
}
private void HelloWolrdForm_Load(object sender, EventArgs e)
{
MessageBox.Show("Hello World");
}
}
}
ダンプするために以下を実行。
「ツール」→「Visual Studio 2008 Command Prompt」
コマンドプロンプトから、上記プロジェクトのexeファイルのあるディレクトリに移動し、プロンプトから以下を実行する。
>dumpbin /headers HelloWorld.exe
得られた結果は以下のような感じ。
--------------------------------------------------------------------------------------
Dump of file HelloWorld.exe
PE signature found
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
(中略)
OPTIONAL HEADER VALUES
10B magic # (PE32)
8.00 linker version
1400 size of code
800 size of initialized data
0 size of uninitialized data
32AE entry point (004032AE)
2000 base of code
4000 base of data
400000 image base (00400000 to 00407FFF)
2000 section alignment
(中略)
SECTION HEADER #1
.text name
12B4 virtual size
2000 virtual address (00402000 to 004032B3)
1400 size of raw data
200 file pointer to raw data (00000200 to 000015FF)
0 file pointer to relocation table
0 file pointer to line numbers
(以下略)
--------------------------------------------------------------------------------------
青字で示した部分の説明
entry point
最初の実行される命令が格納された場所
virtual address
メモリに読み込みまれる仮想アドレス
file pointer to raw data
実行ファイルのの読み込まれるアドレス
つまり、上記の情報から
(0x004032AE - 0x00402000 + 0x200) = 0x14AE
のアドレスが最初に実行される。
実際のexeファイルをバイナリエディタで開き、0x14AEのアドレスを確認すると、
FF 25 00 20 40 00
と続いていた。
上記は、アセンブリでは
jmp 0x00402000
ということらしい。
ということで、仮想アドレスの最初にジャンプするということになる。
今回のdumpbinには「/headers」オプションのほかにも多数のオプションがあるので、いろいろ試してみるべし。