[原创科普]一份标准的栈回溯代码[32/64/R3/R0全通用]
今天忽然间对栈回溯产生了兴趣,因为有人说WIN64AST的的行为监视器看不到调用堆栈,于是打算实现相关功能。无意中上网搜索关于栈回溯的知识,结果震惊了,这么标准的东西,竟然被那些所谓的“大牛”写得繁杂无比,还要内联汇编,还只支持STDCALL!
于是怀着“帮助后人”的想法,写下了这份简单的代码,通用于R3和R0,支持WIN32/WIN64,因为没有内嵌汇编和使用硬编码,相信能支持所有的架构,包括ARM、MIPS、IA64等。
#include <stdio.h>
#include <Windows.h>
typedef ULONG (WINAPI *RTLWALKFRAMECHAIN)(OUT PVOID *Callers, IN ULONG Count, IN ULONG Flags);
RTLWALKFRAMECHAIN RtlWalkFrameChain=(RTLWALKFRAMECHAIN)GetProcAddress(GetModuleHandleW(L"ntdll.dll"),"RtlWalkFrameChain");
void PrintStack()
{
PVOID ary={0}; //这里应该动态分配内存实现,直接用数组是偷懒的办法。
ULONG StackCount;
StackCount=RtlWalkFrameChain(ary,MAX_PATH,0);
printf("\nStackCount=%ld\n",StackCount);
for(ULONG i=0;i<StackCount;i++)
printf("Stack[%d]=%p\n",i,ary);
DebugBreak();
}
void funD()
{
PrintStack();
}
void funC()
{
funD();
}
void funB()
{
funC();
}
void funA()
{
funB();
}
int main()
{
funA();
getchar();
return 0;
}
使用方法:
用WINDBG运行程序,按下F5,然后用WINDBG查看栈信息即可。
思考题:
为什么WINDBG里显示的数据和程序打印的数据有一个不同呢?
附件:
**** Hidden Message ***** 下载附件回复主题 老规矩,先回后下!!!!!!!
回复主题,下载附件 看看事实!!!! 一份标准的栈回溯代码 学习知识,回复一下 通用的赞一个 学习了 不晓得 0126103D是RtlWalkFrameChain的返回地址
DebugBreak() 异常分发到调试器,所以调试器显示的是引起异常的地址这样解释对吧
老大我来学习了~ 不错,这个实用哈哈 哈哈哈好东西哈哈哈 感谢分享! 感谢分享 回复主题,下载附件 支持一个! 不错
学习了 谢谢分享哈 叮叮叮 来看看栈回溯 线性分析,谢谢分享。 学习了 感谢分享 这个貌似很强大啊。支持 前些天看到栈回溯好像可以欺骗父进程检测,请问楼主是否有研究过? 下来看看 确实是非常的受用不错 how it possible 学习下~