TLDR:有人可以解释如何正确使用SymGetTypeInfo
.
我的目标是获取局部变量的类型信息(无论Rip
/Eip
碰巧在哪里)。
根据文档,我需要使用填充适当值SymSetContext
的结构来调用。IMAGEHLP_STACK_FRAME
我在调用时使这部分工作SymEnumSymbols
(将BaseOfDll
参数设置0
为文档在设置上下文时所说的),实际上我只获取局部变量。
但是:
在枚举符号回调中,我尝试调用SymGetTypeInfo
,如下所示:
static BOOL s_enum_symbols_callback(
PSYMBOL_INFO pSymInfo,
ULONG SymbolSize,
PVOID UserContext) {
// ...
HANDLE hProcess = /*Defined elsewhere*/;
wchar_t *buffer = (wchar_t *)allocate_symname_memory();
SymGetTypeInfo(hProcess, pSymInfo->ModBase, pSymInfo->TypeIndex, TI_GET_SYMNAME, &buffer);
}
SymGetTypeInfo
失败并出现错误 1(“功能不正确”)。
好的,现在我正在排除故障以找出为什么会发生这种情况。我的第一个理论是这可能与设置上下文有关,所以我删除SymSetContext
并再次枚举。这一次(我显然得到了所有符号),除了少数类型之外,我得到了同样的问题,特别是:我能够得到__scrt_current_native_startup_state
(即__scrt_native_startup_state
)的类型。
好吧,也许...问题是我在 Sym* 回调函数中调用 SymGetTypeInfo ?(虽然怀疑)。无论如何,我对理论进行了测试,并仅列举了我在全球范围内定义的符号:
wchar_t global_variable = 12;
int global_variable0 = 12;
float global_variable1 = 12.0f;
int global_variable2 = 12;
再一次,不设置上下文,我枚举符号并记下TypeIndex
每个符号的值,以便在枚举符号函数之外,我SymGetTypeInfo
这样调用:
SymGetTypeInfo(hProcess, process_pdb_base, type_index, TI_GET_SYMNAME, &buffer);
(process_pdb_base
从SymModuleLoad64
) 返回。
我遇到了同样的问题。
也许我完全误解了TypeIndex
真正的东西是什么?(尽管对于具有相同类型的不同变量是一致的),或者它可能仅适用于用户定义的类型??
所以是的,我迷路了,累了,请帮助上网。