符号枚举回调函数对同一符号多次调用?

时间:2016-09-08 22:38:12

标签: c winapi debug-symbols dbghelp dia

我写了一个小程序,它使用dbghelp库打印某些可执行文件的所有符号。 我调用的主要枚举函数是:SymEnumSymbols,它应该接收为每个符号调用的回调。 我试图在kernel32.dll上运行程序,我遇到了两个奇怪的问题:

1)有些符号位于同一地址,但它们在SYMBOL_INFO结构的所有字段值中相等(除了唯一索引字段) - 那么我怎么能区分? (例如:0x6b814c23 -StringCopyWorkerW)

2)在某些情况下,在同一地址中有两个具有相同特征的符号。 (当我在IDA中打开文件时,我看到有两个导出的条目 - 但一个是函数而另一个不是(例如:WerGetFlag和WerGetFlagsWorker,位于0x6b84c840)。

谢谢!

这是代码:

#include <windows.h>
#include <dbghelp.h>
#include <stdio.h>

BOOL CALLBACK EnumSymProc(PSYMBOL_INFO pSymInfo,ULONG SymbolSize,PVOID   UserContext)
{
/* Print props of the current symbol */\
printf("%08x", pSymInfo->Address);
printf("|%d", pSymInfo->Tag);
printf("|%08x", pSymInfo->Flags);
printf("|%d", pSymInfo->TypeIndex);
printf("|%s\n", pSymInfo->Name);
return TRUE;
}
void main()
{
  DWORD64 BaseOfDll=0;
  DWORD currOpt = 0;
  HANDLE hProcess = GetCurrentProcess();
  SymInitialize(hProcess, NULL, FALSE);
  BaseOfDll =         SymLoadModule64(hProcess,NULL,"c:\\windows\\system32\\kernel32.dll",NULL,0,0);
  SymEnumSymbols(hProcess, BaseOfDll, NULL, EnumSymProc, NULL);
  SymUnloadModule64(hProcess, BaseOfDll);
  SymCleanup(hProcess);
 }

0 个答案:

没有答案