2013-01-20 43 views
3

我從.pdb文件由SymEnumSymbols看看我的函數的地址,該值是0x0100116e0.pdb中的函數地址與.exe不同,爲什麼?

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的dissamble代碼地址是004116E0

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

然後我試圖通過將兩個不同的地址傳遞給SymGetSymFromAddr64來驗證結果,我預期會得到相同的funcitun符號,惟一的區別是PIMAGEHLP_SYMBOL64的地址成員,一個是100116e0,另一個是4116E0。 我也試圖通過微軟的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

這些地址是「相同的」,它們有所不同,因爲PDB中的地址是相對虛擬地址,而您使用枚舉進程查找的地址已被虛擬化。如果你減去基於負載地址(或取決於.code節的開始)的PDB將始終使用不能由基礎重建等

被遮蔽的地址,你會得到的RVA。 This這個問題可能被證明是有用的閱讀。

+0

謝謝你的解釋! – user1991149

相關問題