题记: 最近知道了有一种方法,可以获取到程序的执行流程,具体做法是先获取程序中每一个函数的地址,在这些地址上设置断点,然后让程序运行起来,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楼
上传的附件 疯狂的断点.rar
IPMSG2007.rar