首页
社区
课程
招聘
[求助]请求如何获取栈信息的实现方式
发表于: 2009-3-6 09:34 3218

[求助]请求如何获取栈信息的实现方式

2009-3-6 09:34
3218
请教: 大家知道,程序运行时系统会分配给该进程一个栈空间: 在该栈中会为每一个函数分配一个栈帧,并且每次调用一个函数都会为该函数分配一个栈帧。我现在想每次函数调用时,都会触发一个读栈操作。
我的目的是想分析函数调用栈获取函数间的调用关系,构建函数调用关系图,谢谢大家给予建议

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
系统只为线程分配栈空间。而函数调用,硬件只将返回地址压栈,栈帧是由函数自己(或者说编译器)维护的,函数可以完全不使用标准的(或说通常的)EBP帧结构。

“每次函数调用都触发一个事件”,不管是硬件还是操作系统,都没有提供支持。

分析函数的调用关系,通过静态分析代码可以实现部分功能,而对于诸如虚函数调用、函数指针调用等情况,需要在静态分析的基础上结合动态调试获得相关信息。

要想仅通过动态调试,想让“每次函数调用都触发一个事件”,我能想到的办法。也只有使用“指令集模拟级别”的虚拟机,HOOK虚拟机处理CALL指令的代码来实现了。
2009-3-6 10:11
0
雪    币: 232
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
静态分析不是没有考虑过,不过存在诸如你说说的间接调用、不确定路径(由运行时输入决定)等问题。动态分析,如你所说,就是十分依赖编译器了。如对于特定平台,比如linux+gcc 可以通过修改内核,比如每当call指令发生时,及时触发中断,按照程序的pid将栈中的内容及时拷贝到一个缓冲区中。“HOOK虚拟机处理CALL指令” 现在有这方面的仿真环境吗,麻烦介绍些仿真和分析软件? 谢谢指教。。。
2009-3-6 10:49
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
CALL指令不属于特权指令,我不知道你说的Linux下让CALL指令陷入内核是怎么实现的。

如果是让编译器把CALL指令都替换成INT3,那其实与我所说的“静态分析结合动态调试”是一个方法,只是我的意思是让反汇编器标记所有的CALL:对于直接调用,反汇编器可以直接生成调用参考;对于间接调用,反汇编器可以将CALL指令标记,然后传递给调试器,调试器在其设置断点,通过动态调试来获取调用地址。

指令级的模拟器,可以看一下bochs,是一个开源的x86体系结构的模拟器(实际上已经支持AMD64体系结构),而且本身就带有调试功能。
2009-3-6 11:55
0
雪    币: 232
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
受教了,继续研究研究。 我主要想做个watchdog的监控软件。监控运行时程序的动态形成的函数调用图。 所以静态分析不适用。设置断点的方法会影响到正在运行的程序,主要还是想从操作系统分配给该进程的函数调用栈中获取动态的函数调用图。 栈中含有函数的返回地址,并且通过对比不同时刻入栈出栈的变化,结合EIP寄存器的值,应该可以构建出函数动态执行图。
2009-3-6 16:13
0
雪    币: 232
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
现在决定用书呆彭建议的静态分析加动态调试方法获取程序的控制流图了,具体如何实现还希望大虾给点建议。
IDA可以形成静态控制流图,对于间接函数调用可以先标记,再动态形成。
具体的工具和方法希望大家帮忙

疑问: 1)IDA会提供我们使用其形成的控制流程图的接口吗?
2) 有开源的静态分析工具吗?(这样更容易做实验)
大家对给建议啊
2009-3-19 16:02
0
游客
登录 | 注册 方可回帖
返回
//