4

私はこの質問に対する答えを見つけようとしてウェブを精査してきましたが、それは私を逃しているようです. この質問をする前に、次の情報源を調べました。

私は 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 が取得されます。

4

1 に答える 1

4

Microsoft Symbol Server を使用して、シンボルのデバッグ情報を取得します。http://support.microsoft.com/kb/311503/en-us

0:001> !dh -a notepad
    ....
    3689 address of entry point
    ...
    00ac0000 image base
    ...
0:001> u ac3689 
notepad!WinMainCRTStartup:

編集:ダンプビン出力を追加します(エントリポイントは同じオフセットです。画像がメモリに読み込まれるときにASLRが機能するため、画像ベースは異なる場合があります):

Microsoft (R) COFF/PE Dumper Version 11.00.50727.1
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file c:\windows\notepad.exe

PE signature found

File Type: EXECUTABLE IMAGE

FILE HEADER VALUES
             14C machine (x86)
               4 number of sections
        4A5BC60F time date stamp Tue Jul 14 03:41:03 2009
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
             102 characteristics
                   Executable
                   32 bit word machine

OPTIONAL HEADER VALUES
             10B magic # (PE32)
            9.00 linker version
            A800 size of code
           22400 size of initialized data
               0 size of uninitialized data
            3689 entry point (01003689) _WinMainCRTStartup

編集 2 x64 の出力を追加

ごみ箱:

Microsoft (R) COFF/PE Dumper Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file c:\windows\notepad.exe

PE signature found

File Type: EXECUTABLE IMAGE

FILE HEADER VALUES
            8664 machine (x64)
               6 number of sections
        4A5BC9B3 time date stamp Tue Jul 14 03:56:35 2009
               0 file pointer to symbol table
               0 number of symbols
              F0 size of optional header
              22 characteristics
                   Executable
                   Application can handle large (>2GB) addresses

OPTIONAL HEADER VALUES
             20B magic # (PE32+)
            9.00 linker version
            A800 size of code
           25800 size of initialized data
               0 size of uninitialized data
            3570 entry point (0000000100003570) WinMainCRTStartup

ウィンドバック:

    0:000> !dh -a notepad

    File Type: EXECUTABLE IMAGE
    FILE HEADER VALUES
        8664 machine (X64)
        ...
        1000 base of code
             ----- new -----
    00000000ff0c0000 image base
    ...
0:000> u ff0c0000+3570
notepad!WinMainCRTStartup:
于 2013-01-08T08:14:56.350 に答える