在dbghelp中读取寄存器相对变量的值

时间:2018-07-20 01:58:27

标签: c++ dbghelp

我正在使用Dbghelp的SymFromName函数来获取函数中局部变量的值。

在调用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标志,根据the docs表示它具有“相对注册”地址。

pSymbol->Address是-4,pSymbol->Register是30006,正如我在唯一可以找到的工作代码示例中看到的,TypeInfoDump,在这些情况下,这些值很重要。但是该示例没有说明如何获取存储在该奇数寄存器中的值。

这个数字30006是什么? (通用)寄存器不是像EAX,EBX之类的名字吗?

我还发现了这两个试图获取值的代码:

    this code和中的
  1. write_var_values函数 this code中的
  2. fill_sym_lvalue函数实际上使用了memory_get_register函数here

但是他们没有太大帮助。如果该值在内存中,则可以通过将pSymbol->Address转换为指针类型并取消引用来轻松读取该值,但是我不知道该“ 30002”的作用!!

0 个答案:

没有答案