我正在使用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之类的名字吗?
我还发现了这两个试图获取值的代码:
但是他们没有太大帮助。如果该值在内存中,则可以通过将pSymbol->Address
转换为指针类型并取消引用来轻松读取该值,但是我不知道该“ 30002”的作用!!