我通过 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
我的 main 函数的地址在 TestsymbolLookup.exe 中是唯一的,但为什么我得到 2 个不同的答案???