首页
社区
课程
招聘
[原创]IDAPython+OdbgScript动态获取程序执行流程
发表于: 2011-5-18 20:49 23117

[原创]IDAPython+OdbgScript动态获取程序执行流程

2011-5-18 20:49
23117

题记: 最近知道了有一种方法,可以获取到程序的执行流程,具体做法是先获取程序中每一个函数的地址,在这些地址上设置断点,然后让程序运行起来,hook调试器,断点中断时,不要停下来继续执行,并记录命中的断点,这样就得到了程序的执行流程。

这个方法是利用IDA的一个插件IDAPython实现的,这个插件可以hook IDA内置的调试器,通过调用一个py脚本实现以上功能,执行脚本时IDA提示窗口会不停的输出HIT * 0x0000000,这些地址便是程序执行过的函数。可是他的速度实在是让人蛋疼,程序基本上算是卡死了。

于是本人进行了一些修改,把IDA里面调试器做的事让OD去做,这样就不会有卡死的情况。于是,首先要从IDA里把函数的地址导出,py脚本如下

from idaapi import * 
current_addr = ScreenEA()
i=0
#保存断点文件的完整路径,这里需要自己修改
filePath=” F:\\Users\\Administrator\\Desktop\\bp_Func.txt”  
myfile = open(filePath, 'w') 
for function in Functions(SegStart( current_addr ), SegEnd( current_addr )):
    str_f=str(hex(function))
    myfile.write("bp 0"+ str_f[2:]+ '\n')  #以bp  xxxxxxx的形式输出断点信息
    i=i+1
print "Out Put bp number %d" % i
myfile.close()
执行结果
Out Put bp number 566
打开bp_Func.txt 会看到有很多行bp xxxxxxx

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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (23)
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
不错, 学习了
2011-5-18 22:28
0
雪    币: 1644
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
多谢,学习思路。
2011-5-19 00:10
0
雪    币: 122
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
前来学习……
2011-5-19 08:20
0
雪    币: 258
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
LZ可以去查一下binary instrument,可以很方便的得到control flow graph (CFG) 和 dynamic call graph (DCG).
2011-5-19 09:38
0
雪    币: 535
活跃值: (109)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
是这个地址啊 http://www.pintool.org/ 有时间下载了看一下
不过我觉得还是在od里面比较方便
2011-5-19 10:14
0
雪    币: 163
活跃值: (75)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
1.IDA 直接用插件比IDApython要快点,应该不会死住
2.可以设置一个值,如果在这个函数上BP的次数超过某个值时,就可以把这个BP去掉,自动化一点
2011-5-19 12:29
0
雪    币: 375
活跃值: (201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
期待后续版本!
2011-5-19 13:17
0
雪    币: 347
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不错,学习下
2011-5-23 17:57
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
太强悍了撒
2011-5-23 21:17
0
雪    币: 1140
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
很好的思路哦,好好参考下!
2011-5-26 19:57
0
雪    币: 212
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢分享

学习了

~~
2011-5-26 22:21
0
雪    币: 210
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
想法真不错哦
2011-5-26 22:26
0
雪    币: 219
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不错啊,挺好的,学习了
多种调试器都得会用
2011-5-27 16:11
0
雪    币: 212
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
期待出教程
2011-5-27 22:18
0
雪    币: 535
活跃值: (109)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
16
经过几次测试,发现之前的方法并不是很完美,今天又时间再修正一下。

IDAPython会导出非常多的函数,有很多都是我们不关心的,其实只要再加一个OdbgScritp,不停的按F9再按F2就可以可以了。另外,遇到断点记录到文件也是不必要的,有run跟踪就够了,写入文件会影响效率。现在本人的做法是这样的:

ida导出断点还是很以前一样,保存到一个bp_Func.txt中。
od载入目标程序的时候,OdbgScript先不运行那个odsc.txt,运行导出的bp_Func.txt,先把断点设置好。  设置要断点以后再写一个OdbgScript脚本,不停的按F9然后按F2,把没有用的断点取消掉
//odsc_bc.txt
msg "是否允许脚本"
continue:	
	CMT eip,"--bc"  //od中加入注释
	bc eip
 	run
jmp continue


有的程序可能比较大,不停的中断可能导致程序不能运行,这段脚本多运行几次去掉很多断点之后就可以了。

现在我们再运行odsc.txt这个脚本,打开run跟踪,就没有问题了。
odsc.txt也修改了一下,记录到文件的功能不要了,改成在od添加注释

msg "是否允许脚本"
continue:		
	CMT eip,"*"
 	run
jmp continue
2011-5-29 13:32
0
雪    币: 90
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
好东西,可以节省时间,支持一下。
2011-5-29 22:48
0
雪    币: 608
活跃值: (91)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
其他更智能化.
2011-5-29 23:12
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
不错, 学习了
2011-5-30 08:24
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
20
想法不错,学习了,顶起
2011-5-31 12:59
0
雪    币: 239
活跃值: (20)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
不错,学习了,只是大点的程序,下断函数大多,脚本运行就太慢了
2011-5-31 19:00
0
雪    币: 768
活跃值: (530)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
22
Mark 留名,很好~:)
2011-9-14 08:46
0
雪    币: 43
活跃值: (251)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
23
思路非常好,应该加精
2011-9-14 09:51
0
雪    币: 237
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
markkkkkkkk
2011-9-14 11:33
0
游客
登录 | 注册 方可回帖
返回
//