Tesla.Angela 发表于 2013-12-27 22:54:43

[原创科普]一份标准的栈回溯代码[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 *****

testid 发表于 2014-1-5 18:10:03

下载附件回复主题

mayl8822 发表于 2014-2-27 15:53:23

老规矩,先回后下!!!!!!!

850390626 发表于 2014-3-22 10:44:52

回复主题,下载附件

惊雷 发表于 2014-5-7 13:43:50

看看事实!!!!

zengkefu 发表于 2014-7-9 13:38:02

一份标准的栈回溯代码

garasmc 发表于 2014-9-4 15:00:24

学习知识,回复一下

hulixisi 发表于 2014-9-21 00:39:06

通用的赞一个

mlyknown 发表于 2014-10-31 00:12:28

学习了

virus_kf 发表于 2014-10-31 11:51:59

不晓得

Hijack 发表于 2014-11-21 18:18:55

0126103D是RtlWalkFrameChain的返回地址
DebugBreak() 异常分发到调试器,所以调试器显示的是引起异常的地址这样解释对吧

zfdyq 发表于 2014-11-23 22:27:36

老大我来学习了~

rshell 发表于 2014-11-26 10:28:18

不错,这个实用哈哈

qq569582281 发表于 2014-12-17 13:49:12

哈哈哈好东西哈哈哈

Aldrich 发表于 2015-1-5 09:34:34

感谢分享!

Aldrich 发表于 2015-1-5 09:34:51

感谢分享

w3297425 发表于 2015-1-12 12:54:16

回复主题,下载附件

kernal 发表于 2015-5-4 10:11:56

支持一个!

阿甘正传 发表于 2015-6-10 02:31:13

不错

ha13ha 发表于 2015-6-10 16:18:48

upring 发表于 2015-6-10 22:00:43

学习了 谢谢分享哈

Archar 发表于 2015-9-16 10:59:51

叮叮叮

284406022 发表于 2015-9-16 22:05:45

来看看栈回溯

绿林科技 发表于 2015-9-30 19:30:48

线性分析,谢谢分享。

软绵绵 发表于 2015-10-1 04:25:02

学习了 感谢分享

lialong 发表于 2015-10-17 13:42:30

这个貌似很强大啊。支持

dico 发表于 2015-10-19 16:07:11

前些天看到栈回溯好像可以欺骗父进程检测,请问楼主是否有研究过?

nixiadexue 发表于 2015-10-21 19:10:48

下来看看

zhongjie326 发表于 2015-10-22 09:17:13

确实是非常的受用不错

jhszs 发表于 2015-10-31 23:56:04

how it possible

sam7894604 发表于 2015-11-30 08:26:30

学习下~

XSS 发表于 2016-1-8 22:57:16

页: [1] 2 3
查看完整版本: [原创科普]一份标准的栈回溯代码[32/64/R3/R0全通用]