0

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

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);
 }
4

0 回答 0