2013-01-20 3 views
3

i는, 값이 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; 
} 

입니다 SymEnumSymbols에 의해 .PDB 파일에서 내 주요 함수의 주소를 읽을 수 있지만 VS2008의 dissamble 코드에서이 함수의 주소가 난 후

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

004116E0입니다 SymGetSymFromAddr64에 2 개의 다른 주소를 전달하여 결과를 확인하려고했는데 예상 한 것과 동일한 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에있는 주소가 상대 가상 주소이고 enum proc로 찾은 주소가 가상화되어 있기 때문에 주소가 다릅니다. PDB는 항상 리베이스 등으로 가려 질 수없는 주소를 사용합니다.

기본 로딩 주소 (또는 따라 달라진 .code 섹션의 시작 부분)를 빼면 RVA가 표시됩니다. This SO 질문이 유용 할 수 있습니다.

+0

설명해 주셔서 감사합니다. – user1991149