在上一章节介绍了如何利用EBP指针获取上一层的调用地址,从而用来检测非法call,这一章节我们将介绍如何实现一个类似VS调试器中的“调用堆栈窗口”这种效果,能显示出当前模块名、函数名、行号等,如下图所示:

这里我们需要用到微软MSDN官方提供的几个API函数:
一、实现原理
1.SymInitialize
这个函数是初始化进程所对应的符号处理程序。
BOOL IMAGEAPI SymInitialize(
[in] HANDLE hProcess,
[in, optional] PCSTR UserSearchPath,
[in] BOOL fInvadeProcess
);
hProcess:当前进程句柄,可使用GetCurrentProcess获取到;

本文介绍了如何使用C++实现类似VS2010调试器的调用堆栈列表功能,涉及SymInitialize、CaptureStackBackTrace、SymFromAddr和SymGetLineFromAddr64等API,以及示例代码和实现效果展示。文章还提到这种方法的局限性,即依赖Windows API,并预告了不依赖API遍历调用堆栈的技术。
订阅专栏 解锁全文
2958

被折叠的 条评论
为什么被折叠?



