首页
论坛
课程
招聘
[原创]IDAPython+OdbgScript动态获取程序执行流程
2011-5-18 20:49 20255

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

2011-5-18 20:49
20255
题记: 最近知道了有一种方法,可以获取到程序的执行流程,具体做法是先获取程序中每一个函数的地址,在这些地址上设置断点,然后让程序运行起来,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()


导出函数地址保存到指定路径的bp_Func.txt中
打开IDA,载入目标程序,安装好了IDAPython插件以后IDA  IDAPython的菜单项目,有的是版本IDA点文件能看到,有的是编辑---plugins 下面。这里以一个小程序ipMsg为例,点击IDAPython菜单项,选择刚才编写的py脚本文件,运行成功后,IDA提示窗口会显示导出断点的数量,这时候bp_Func.txt里面就保存有断点的信息。

执行结果
Out Put bp number 566
打开bp_Func.txt 会看到有很多行bp xxxxxxx


接下来再编写OdbgScript脚本:

//bc
//msg "是否允许脚本"
var _bp_nub
#INC " bp_Func.txt "  //导入断点信息
msg "断点设置完毕!"
wrta "out.txt","-----------------------------"
continue:	
	add _bp_nub,1		
	//msg _bp_nub
	wrta "out.txt","\r\n"
	wrta "out.txt",_bp_nub
	wrta "out.txt","-->"
	wrta "out.txt",eip	
	run
jmp continue


OdbgScript脚本的功能是通过#INC导入bp_Func.txt执行里面的bp指令,然后就不停执行run指令,run相当于F9,没运行一次记录EIP的信息到out.txt中。当然这里的2个txt文件需要在同一个目录下。

好了,再用od载入ipMsg.exe,按工具栏上的”B”,显示断点信息。
插件--->OdbgScript--->运行脚本,等上一会所有的断点设置完毕后会弹出一个框显示”断点设置完毕!”

先不确认,也不要取消,那个框先放一边

我们知道,window有消息驱动机制,程序需要去处理消息循环这些代码由开放工具帮我们实现,找到那些函数先把那些断点取消掉,要不然会一直在那个地方浪费时间,Ctrl+N 找到这些函数PostMessage、PeekMessage、TranslateMessage,在这些函数上按回车找到调用的代码,F2把这些地方的断点取消掉。也可以在运行到这些断点的时候按F2。

现在点确认运行脚本,会看到,od在哪里像抽风了一样,有的地方会不停的执行,通过刚才的方法处理消息的地方并没有被完全排除掉,可以再按F2将一些反复执行的断点去掉。这里有个麻烦就是要不停的按F2,因为太多的地方设置了断点。

过一段时间od就会稳定下来,程序正常的运行起来了。这个时候只有把鼠标移到程序的图标会发现od又会疯狂的中断,这当然还是消息循环啦,手动删除那些断点。获取焦点时od就没有反应了,如果你对获取焦点的事件感兴趣,可以关注这个地方,od有Run跟踪的功能,打开它,获取焦点时执行的代码就会被记录下来。

        下面简单分析一下这个程序的按钮事件,我这里干扰的断点基本上已经去掉了,显示界面,拖动窗体,点击窗体OD都不会有动静,附加中有我经过筛选的断点文件bp_Func.txt。

先打开OD的Run跟踪,调试---->打开或清除Run跟踪,查看--->Run跟踪,确认记录是空的。切换到ipMsg的界面用户列表里不用选任何人,直接点”发送”,回到OD 查看--->Run跟踪,会发现几条记录,00411F6F就是发送按钮的单击事件。

0041200C  |.  FFD3          call    ebx      ; \IsDlgButtonChecked
//这里很显然就是判断界面上发送按钮后面的复选框有没有选上。


用通样方法可以得到”关于”按钮的单击事件就,还有关于对话框上点击显示网页那个按钮,00409BF7 是打开网站的按钮的事件,往下看我们知道 004210C4这个地址是存放网址的字符串。  

好了,以上简单分析了一下,其他的各位自己实验吧。

有了这样的方法我们便可不通过提示信息也能找到程序中的关键代码。

5.29 补充,见16楼

看雪论坛2020激励机制:能力值、活跃值和雪币体系!会员积分、权限和会员发帖、回帖活跃程度关联!

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

学习了

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

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
雪    币: 84
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pojiemyie 活跃值 2011-5-29 22:48
17
0
好东西,可以节省时间,支持一下。
雪    币: 601
活跃值: 活跃值 (12)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Second 活跃值 1 2011-5-29 23:12
18
0
其他更智能化.
雪    币: 20
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lyweng 活跃值 2011-5-30 08:24
19
0
不错, 学习了
雪    币: 49
活跃值: 活跃值 (14)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-5-31 12:59
20
0
想法不错,学习了,顶起
雪    币: 232
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Steve 活跃值 1 2011-5-31 19:00
21
0
不错,学习了,只是大点的程序,下断函数大多,脚本运行就太慢了
雪    币: 687
活跃值: 活跃值 (33)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
FishSeeWater 活跃值 11 2011-9-14 08:46
22
0
Mark 留名,很好~:)
雪    币: 108
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
pushebp 活跃值 2011-9-14 09:51
23
0
思路非常好,应该加精
雪    币: 235
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zuoyefeng 活跃值 2011-9-14 11:33
24
0
markkkkkkkk
游客
登录 | 注册 方可回帖
返回