首页
社区
课程
招聘
[原创]堆栈跟踪DEMO[vc6源码]
发表于: 2012-3-20 16:13 11635

[原创]堆栈跟踪DEMO[vc6源码]

2012-3-20 16:13
11635
#include <stdio.h>
#include "ade_asm.h"

int chk_addr_ret(void* addr)
{
        char* op_asm = (char*)addr;
        disasm_struct dis_op;

        /* 执行反汇编,直到返回指令 */
        while (!IsBadCodePtr((FARPROC)op_asm)
                && ade32_disasm(op_asm, &dis_op) > 0) {
                if (dis_op.disasm_flag & C_STOP)
                        return op_asm - (char*)addr;

                op_asm += dis_op.disasm_len;
        }

        return 0;
}

void do_stack_trace(void* __ebp)
{
        int frame_size;
        /* 执行堆栈回溯 */
        do {
                void* ret_addr = *((void**)__ebp + 1);
                void** fun_addr = (void**)__ebp + 1;
                
                frame_size = *(char**)__ebp - (char*)__ebp;
                printf("frame:%p ret_addr %p\n", __ebp, ret_addr);
                
                /* 从ebp堆栈位置向上搜索地址 */
                while (fun_addr++ < *(void***)__ebp){
                        if (chk_addr_ret(*fun_addr) > 0) {
                                printf("frame:%p ?ret_addr %p\n", __ebp, *fun_addr);
                        }
                }
                
                __ebp = *(void**)__ebp;
        } while (frame_size >= 8 && frame_size <= 65535);
}

int fun3(int p1, int p2, int p3)
{
        void* __ebp = &__ebp + 1;
        
        __asm mov __ebp, ebp;
        
        do_stack_trace(__ebp);
        
        return 3;
}

int fun2(int p1, int p2)
{
        int p = p1 + p2;
        return fun3(p, 3, 3);
}

int fun1(int p1)
{
        p1 = p1 * p1;
        fun2(p1, 2);
        return 0;
}

int main(int argc, char** argv)
{
        fun1(1);
        printf("----stack trace done! press any key to exit!-----\n");
        getchar();
        return 0;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (14)
雪    币: 86
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
想到了c 的重定位,编译貌似 需要修改,不同优化,就得修改一份.....
2012-3-20 17:05
0
雪    币: 2314
活跃值: (2205)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
3
堆栈回溯吗?

不是
mov eax, ebp
mov xx, [eax+4]
就可以了吗?
2012-3-20 19:41
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=莫灰灰;1055147]堆栈回溯吗?

不是
mov eax, [ebp]
mov xx, eax+4  
就可以了吗?[/QUOTE]

加了一些处理,可以搜索中间没有push ebp的函数调用
可以搜索到release编译的FPO函数地址,我截图就是release的exe堆栈回溯
2012-3-20 20:17
0
雪    币: 258
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
不错。。。。
2012-3-21 11:36
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
使用了第3方的库,有能够不用的嘛。
另外,使用系统API也行的吧。
2012-3-21 12:59
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
确实不错,不是普通的回溯
2012-3-21 17:57
0
雪    币: 306
活跃值: (85)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
8
谢了,你的方法,看不懂,
通过push pop ,定位?
2012-3-22 11:19
0
雪    币: 347
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
学习下
感谢分享源码
2012-3-23 13:26
0
雪    币: 1491
活跃值: (985)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
10
可否研究下数据回溯呢。呵呵
2012-3-23 14:14
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
11
表示看不懂老大的意思
2012-3-23 17:33
0
雪    币: 258
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
污点跟踪....................

2012-3-23 18:23
0
雪    币: 59
活跃值: (1506)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
记得论坛上有大牛逆过一个半成品的微点主动防御的代码,哪里应该有很多相关的技术
2012-3-24 17:38
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习中。。。。。。。。。
2012-3-26 16:14
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
谢谢你的代码,但是还是不是我想要了解的,看了下,还是利用ebp的,对于程序入口没有push ebp  mov ebp, esp的函数还是没有办法回溯,

__asm mov __ebp, ebp; 实际上还是取得ebp的值,另外        void* ret_addr = *((void**)__ebp + 1);                void** fun_addr = (void**)__ebp + 1; 也是利用ebp的原理来做的堆栈回溯,我想知道怎么回溯程序入口没有push ebp  mov ebp, esp的栈
2012-10-16 18:32
0
游客
登录 | 注册 方可回帖
返回
//