标题:使用IDA Pro.图表化函数
(文章来源数据拯救 2005
http://www.datarescue.com/idabase/graphs/graphs.pdf)
从IDA Pro4.17开始,可以使用VCG(可视化编译图表)图表库的一个局部端口――Wingraph32. IDA能够生成可转到Wingraph32的标准GDL 图表。在图表工具栏可以使用函数图表化命令。
让我们来详细看一看其更多的可能性。
流程图
通过图表观察一个函数代码的流程对一个函数的结构常常会提供比我们通过浏览得到的更好的全局概念。流程图命令绘制了这些图表。
如果你想要在同一时间图表化几个函数,或图表化一个较大函数的一部分,只要使用我们的标准选择键选择感兴趣的区域即可。
函数调用
通常分析函数之间的函数变量关系对于理解一个特定的应用程序如何工作是必要的。IDA提供给我们一个命令来图表化程序函数之间的所有存在的函数变量关系(交叉参考)
这个命令主要针对于小的程序,因为一旦一个程序包含大量的函数,图标会迅速变得极为复杂。注意:图标的颜色依据函数/地址的属性(外部函数,库函数,入口)。颜色配置和反汇编某一概念一致的。
函数交叉参考
Xref s to 和 Xref s from允许你专注于交叉参考至和自一个特定函数。
Xref s to控制导向一个指定函数的图表数据和代码的交叉参考。我们来看一看来自C标准库的toupper()函数调动特征至上一级情况(由某种特定程序采用的一个数据集)。
在图表顶部,我们注意到start()函数调用WinMain()函数。在左边,我们观察到一个指向回调函数()的函数指针。在底部右侧,我们可以观察到递归函数调用自身。我们也可以备注strtoul()(来自C标准库,将一个串转换为无符号长整型)间接依赖于toupper()函数。最后,要注意到被选择的函数始终由蓝色框架环绕。
Xref s from控制来自于一个指定函数的图表代码的交叉参考。从这个方向,在图表中仅使用代码交叉参考(而不是数据交叉代码)以避免使用所有来自每个函数的全局数据参考填充图表。 让我们在toupper()函数上使用这个命令。
这里,我们观察到toupper()函数广泛使用了其他C标准库函数,它们自身直接或间接地使用了一些Windows的应用程序接口,如WideCharToMultiByte()或VirtualAlloc()。和使用流程图命令一样,这些交叉参考命令也可以使用选择来图表化几个函数。
使用者定义过的交叉参考函数
IDA为熟练用户提供了高级图表化函数。我们来看看如何在实践中使用它们
来看一些需要使用这些选项的实例
数据交叉参考
要记住Xref s from命令仅能绘制代码交叉参考。不过有时,它会对跟踪数据交叉参考很有用。我们通过取消选择交叉参考至和从略数据选项应用它来观察一个指向函数指针阵列的指针。
更甚之的另一种可能性是显示全局数据的参考。我们可以通过一个函数或搜索涉及一组由参考函数引用的全局数据的函数来显示全局数据参考。这对于明确说明最大递归深度以避免一个几乎不可读的图表是个好意见。
因为我们把打印递归点选项留为格纹状,所有在顶部出现一些点,标志着在特定递归深度确定的范围外至少有一个交叉参考存在
递归深度
正如我们先前提到的,函数调用命令如果用于通常的包含大量函数的程序没有作用。另外,通过指定递归深度,我们可以尝试得到同样类型的图表,不过要专注于某一特定函数。我们在fopen()函数试一试。
忽略特定函数
IDA的FLIRT(快速库辨认和识别技术)确定了来自很多库德标准函数。因为这些函数已有丰富备证,我们通常对其内部不再十分关注。为了隐藏所有这些内部交叉参考并得到简单的、可读性更强的图表, 我们可以简单地激活忽略来自库的函数的选项。
尽管如此,涉及像MessageBox()这种的外部Windows 应用程序接口的交叉参考总会呈现在我们的图表里。如果我们想要隐藏这些交叉参考,切实关注于一个函数与库函数的函数变量关系,我们也可以激活忽略外部选项。
相反地,我们也可以绘制涉及外部Windows应用程序接口的交叉参考,并且忽略涉及库函数的交叉参考。以此说明一个函数依赖于动态链接库的程度。
打印注释
让我们通过展示一种图表化Windows应用程序和某一特定动态链接库函数的变量关系的方式来结束有关IDA函数图表化功能部件的小指南。通过基于涉及这一独特动态链接库的所有外部声明的选择创建一个图表,这是可以达到的。我们也可以激活打印注释选项,它将打印和这些外部函数相关的注释。以下例子说明一个程序依赖于comdlg32.dll输出函数的程度。
这里如何结合使用IDA和WinGraph32为直观表示复杂可执行文件的大量信息提供了可能。