.pdb中的函数地址与.exe中的不一样,为什么?

function address in .pdb is different from .exe,why?

本文关键字:为什么 不一样 函数 地址 pdb exe      更新时间:2023-10-16

我通过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来验证结果,我得到了相同的函数符号,唯一的区别是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个不同的答案?

这些地址是"相同的",它们不同,因为PDB中的地址是相对虚拟地址,而您在enum过程中找到的地址已被虚拟化。PDB将始终使用一个不能被重基等遮挡的地址。

如果减去基于加载地址(或.code段的开始,取决于),您将得到RVA。这个问题可能会被证明是有用的。