Символы Функция обратного вызова перечисления вызывается более одного раза для одного и того же символа?

Я написал небольшую программу, которая использует библиотеку 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);
 }

0 ответов

Другие вопросы по тегам