我通过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的地址成员,一个是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个不同的答案???
解决方法:
这些地址是“相同的”,它们不同,因为PDB中的地址是相对虚拟地址,而您使用枚举过程发现的地址是虚拟化的. PDB将始终使用不能通过变基等模糊的地址.
如果您减去基于的加载地址(或.code部分的开头取决于),您将获得RVA. This SO问题可能被证明是有用的阅读.