3

SymEnumSymbols によって .pdb ファイルからメイン関数のアドレスを読み取りました。値は 0x0100116e0 です

BOOL CALLBACK SymEnumSymbolsProc(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID UserContext )
{   
    if( pSymInfo != NULL )
    {
        // Show the symbol      

        std::string str = pSymInfo->Name;
        if (str.find("main")!=-1)
        {
            int ss=pSymInfo->Address;
        }


    }
    return TRUE;
}

しかし、VS2008 のディスサンブル コードでのこの関数のアドレスは 004116E0 です。

int _tmain( int argc, const TCHAR* argv[] )
{
    004116E0  push        ebp  
    004116E1  mov         ebp,esp 
    ...
{

次に、2 つの異なるアドレスを SymGetSymFromAddr64 に渡して結果を確認しようとしましたが、予想どおり同じ funcitun シンボルを取得しました。唯一の違いは、PIMAGEHLP_SYMBOL64 のアドレス メンバーで、1 つは 100116e0 で、もう 1 つは 4116E0 でした。また、Microsoftのdbh.exeで確認しようとしましたが、コマンドは

load TestSymbolLookup.pdb
TestsymbolLookup [1000000]:n main
addr   : 10116e0
name   : main
size   : b2c
flags  : 0
type   : 2
modbase: 1000000
value  : 0
reg    : 0
scope  : SymTagExe<1>
tag    : SymTagFunction<5>
index  :1

メイン関数のアドレスは TestsymbolLookup.exe で一意ですが、なぜ 2 つの異なる回答が得られたのでしょうか?

4

1 に答える 1

5

これらのアドレスは「同じ」ですが、PDB 内のアドレスは相対仮想アドレスであり、enum proc で見つけたアドレスは仮想化されているため、異なります。PDB は、リベースなどによって不明瞭にできないアドレスを常に使用します。

ベースの読み込みアドレス (または.code依存するセクションの開始) を差し引くと、RVA が得られます。このSO の質問は、読むと役立つ場合があります。

于 2013-01-20T15:45:04.063 に答える