Считать значение регистровой относительной переменной в Dbghelp

Я использую функцию SymFromName из Dbghelp, чтобы получить значение локальной переменной в функции.

Перед вызовом SymFromName я вызываю SymSetContext и передаю адрес моей целевой функции, чтобы получить локальные переменные. Установленная часть контекста работает отлично, как я тестировал. (Создавая переменные со случайными именами и находя их с помощью SymFromName)

TCHAR szSymbolName[MAX_SYM_NAME];
ULONG64 buffer[(sizeof(SYMBOL_INFO) +
    MAX_SYM_NAME * sizeof(TCHAR) +
    sizeof(ULONG64) - 1) /
    sizeof(ULONG64)];
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;

strcpy_s(szSymbolName, MAX_SYM_NAME, TEXT("NAME_OF_THE_VARIABLE"));
pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
pSymbol->MaxNameLen = MAX_SYM_NAME;

HANDLE hProcess = GetCurrentProcess();
IMAGEHLP_STACK_FRAME sf;
sf.InstructionOffset = ADDRESS_OF_THE_FUNCTION;
if (SymSetContext(hProcess, &sf, 0) && SymFromName(hProcess, szSymbolName, pSymbol))
{
    if (pSymbol->Flags & SYMFLAG_REGREL) {
        // Hmmmmmmmm 
    } else {
        VAR_TYPE value = *reinterpret_cast<VAR_TYPE*>(pSymbol->Address);
    }
}

Проблема в возвращаемой информации о символах, pSymbolимеет SYMFLAG_REGREL флаг, который согласно документам означает, что он имеет адрес "относительный регистр".

pSymbol->Address это -4, pSymbol->Register равно 30006, и, как я увидел в единственном рабочем примере кода, который я смог найти, TypeInfoDump, эти значения имеют значение в таких случаях. Но в этом примере не указано, как получить значение, хранящееся в этом нечетном регистре.

Что это за номер 30006? Разве (универсальные) регистры не названы как EAX, EBX и тому подобное?

Я также нашел эти два кода, которые пытаются получить значение:

  1. write_var_values функция в этом коде и
  2. fill_sym_lvalue функция в этом коде, который на самом деле использует memory_get_register функционировать здесь

Но они не очень помогли. В случае, если значение находится в памяти, значение может быть легко прочитано с помощью приведения pSymbol->Address к типу указателя и разыменованию его, но я понятия не имею, что делать с этим "30002"!!

0 ответов

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