Считать значение регистровой относительной переменной в 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

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]