私はこの質問に対する答えを見つけようとしてウェブを精査してきましたが、それは私を逃しているようです. この質問をする前に、次の情報源を調べました。
- http://www.csn.ul.ie/~caolan/publink/winresdump/winresdump/doc/pefile.html
- http://msdn.microsoft.com/en-us/magazine/cc301805.aspx
私は PE 形式を理解しています (または、少なくとも理解していると思います)。コマンド ライン デバッガー (cdb) を使用して、最初の呼び出しが何であるかを確認するために、RVA のアドレスを逆アセンブルできるようにしたいと考えています。ネイティブ アプリケーション (メモ帳など) の場合、notepad!WinMainCRTStartupが表示されることを期待し、.NET アプリケーションの場合、CLR への jmp コマンドが表示されることを期待します。
例としてメモ帳を使用して、その上でdumpbin /headersを実行し、エントリ ポイントの値 3570 を取得しました。cdb メモ帳を実行してこのコマンドを実行すると - u [メモリ内のベース アドレス]+0x3570 - WinMainCRTStartup 呼び出しが得られません。
dumpbin からの PE 出力を誤解していますか? アプリケーションの開始関数をメモリ内で探す場所を正確に知るにはどうすればよいですか?
編集 (1/7/13):これを 64 ビット Windows 7 で実行していることを忘れていました。Windows XP モードで cdb を使用しようとすると (32 ビット OS から結果を取得するため)、AddressOfEntryPoint を逆アセンブルします。 PE ファイルの分析から得た情報は、期待どおりに WinMainCRTStartup への呼び出しを取得します。言い換えれば、私が見るように言われた正確なアドレスには、32 ビット OS であると思われるものが含まれています。アプリケーションを 64 ビット マシンで実行すると、本当にそれほど大きな違いが生じるのでしょうか?
さらに複雑なことに、cdb で 64 ビット OS の ImageBaseAddress に対して !dh を実行すると、使用する必要がある正確な AddressOfEntryPoint が取得されます。