адрес функции в .pdb отличается от .exe, почему?

я прочитал адрес моей основной функции из файла .pdb от SymEnumSymbols, значение 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, один был 100116e0, а другой 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 разных ответа ???

3

Решение

Эти адреса являются «одинаковыми», они различаются, потому что один в PDB является относительным виртуальным адресом, а тот, который вы находите с помощью enum proc, был виртуализирован. PDB всегда будет использовать адрес, который не может быть скрыт перебазированием и т. Д.

Если вычесть основанный адрес загрузки (или начало .code раздел в зависимости), вы получите RVA. это ТАК вопрос может оказаться полезным для чтения.

5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector