我试图遍历调用栈帧并从中提取一些信息。我能够通过使用WinDBG的StackWalk64
、SymGetSymFromAddr64
和SymGetLineFromAddr64
API提取文件名、行号和函数名。
然而,在STACKFRAME64
中的DWORD64 Params[4]
只支持从一个帧中读取回四个64位函数参数。更糟糕的是,在32位系统上,只有Params[4]
的低32位被使用,因此具有超过32位的单个参数需要两个或更多元素。
typedef struct _tagSTACKFRAME64 {
ADDRESS64 AddrPC;
ADDRESS64 AddrReturn;
ADDRESS64 AddrFrame;
ADDRESS64 AddrStack;
ADDRESS64 AddrBStore;
PVOID FuncTableEntry;
DWORD64 Params[4];
BOOL Far;
BOOL Virtual;
DWORD64 Reserved[3];
KDHELP64 KdHelp;
} STACKFRAME64, *LPSTACKFRAME64;
我找不到任何可以读取堆栈帧中所有参数的API,没有限制地读取。
我想使用 ebp
/ rbp
从堆栈(x86 / x64)和寄存器(x64)中提取值。但是,如果我这样做,仍然只能获得“可能”的参数值。
是否有任何API可用于获取准确的值?如果我能够获得参数的类型和名称,那将更好。
SymGetSymFromAddr64
可以给你函数本身的符号名称,这是一个混淆的 C++ 名称。如果你通过解淆器运行它,你可以推导出参数类型,尽管仅仅知道类型可能不足以解释Params
成员。但我认为这已经是你能得到的最接近的答案了。 - Mooing Duck