从4.17版开始IDA PRO就提供了流程图功能,它使用了VCG图形库里面的WinGrah32工具。IDA PRO可以提供标准的GDL图形给WinGrah32来绘制流程图。流程图工具条如下所示。
下面我们来看一些流程图工具的一些具体使用方法。
流程图
通过流程图来分析一个功能函数,可以清晰的看出程序的流程结构,使得分析更清楚,更容易。使用FlowChart按钮,可以绘制流程图。
如果你希望能在一张流程图中同时显示几个函数,或只显示一个大的函数中的一部分流程,我们可以选择相应代码区域来进行流程图显示。
函数调用
很多时候,我们需要分析函数之间的依存关系,IDA提供了一项分析函数间依存关系(交叉参考)的功能。如图:
这条命令对一些小程序比较有效,这是因为当程序比较庞大,包含大量函数时,其依存关系变得异常复杂。可以看到上面图中,根据函数地址的属性,被区分为不同的颜色(如程序入口点,外部函数,库函数……),颜色规则与反汇编窗口中的分析结果有关。
函数交叉参考
Xrefs to和Xrefs from可以看出一个指定函数的引用关系和被引用关系。
Xrefs to命令对指定函数的被其它代码或数据的引用情况给出了图形参考,让我们看一下C标准库中的toupper()函数,它的功能是将小写字母转换为大写字母。
在图形的顶部,我们注意到start() 函数,它调用了WinMain()函数,在左侧,我们注意到callback_function()的函数指针,在右侧底部我们注意到recursive_function(),调用自己。我们也看到strtoul()函数(C标准库里的一个函数,它转换一个字符串为一个无符号长整形),需要调用toupper()函数。最后,注意被选择的函数,总是使用蓝色粗线框。
Xrefs from命令给出了指定函数调用其它函数的图形参考。让我们再看一下toupper()函数的引用关系图。
通过这个引用关系图,我们注意到,toupper()函数调用了大量其它C标准库函数,它们直接或间接的引用了一些WINDOWSAPI函数,如VitrualAlloc(),WideCharToMultiByte()。和函数被引用图一样,它也可以指定选择区域,来显示多个函数的引用关系图,或一个函数的部分引用关系图。
用户自定义的交叉参考图
IDA PRO还为一些专业使用者提供一些高级图形功能,让我们实践一下如何使用这些功能。
下面我们具体看一下这些选项的用法。
函数被Xrefsfrom命令只绘出代码的交叉参考,但有时,数据的交叉参考也非常有用。让我们看一个一组函数指针的指针,我们取消Crossreferences to和IgnoreData的选项。
IDA也可以显示一个全局数据的参考关系图,我们可以显示一个全局数据的或一组数据的函数调用交叉参考图。最好指定最大的递归深度,以避免图形无法显示。
由于我们保留了Printrecursion dots,一些省略点显示在顶部,表示至少有一个交叉参考在指定的递归深度之外。
递推深度
正如我们前面提到的,函数调用FunctionsCall功能无法显示一个包含大量函数的正常程序的关系图。但如果我们设定递推深度RecursionDepth,我们就能得到同样类型的图形。我们来看一下fopen()函数。
忽略特定的函数
IDA的FLIRT(库快速识别技术)可以从许多库中识别出标准函数。由于这些函数的资料很多,我们可以不用关心这些函数的内部实现。我们可以通过使用Ignore From LibraryFunctions的选项,来忽略这些库函数内部的交叉参考。
然而,一些外部Windows API函数如MessageBox()总是显示在交叉参考的图形中。如果我们也想屏蔽这些函数的显示,只关注对库函数的调用,我们可以选择IgnoreExternals这个选项。
反之,我们也可以只显示对外部函数的引用,而屏蔽对库函数的调用。这可以看出一个函数对DLL的依赖程度。
显示注释
最后,在结束这个小教程之前,让我们来看一下,如何绘制一个Windows应用程序对一个特定DLL文件的依赖关系图。这可以通过创建一个基于特定DLL相关的所有外部声明的参考图来实现。我们可以选中PrintComment选项,它将会对这些外部函数打印注释。下面的例子给出了一个程序与comdlg32.dll的依存关系。
IDA和其集成的WinGraph32可以帮助我们快速分析复杂的程序,它将有用信息从复杂的程序中筛检出来,并使用流程图的方式清晰的展现给我们。