主窗口
IDA图形视图
图形视图会让人联想到程序流程图,因为它将一个函数分解成许多基本块,以生动显示该函数由一个块到另一个块的控制流程。
在屏幕上你会发现,IDA使用不同的彩色箭头区分函数块之间各种类型的流。
根据测试条件,在条件跳转位置终止的基本块可能会生成两种流:
- Yes边的箭头(是的,执行分支)默认为绿色
- No边的箭头(不,不执行分支)默认为红色
- 只有一个后继块的基本块会利用一个正常边(默认为蓝色)指向下一个即将执行的块。
在图形模式下,IDA一次显示一个函数
- 使用“CTRL+鼠标滑轮”来调整图形的大小
- 键盘缩放控制需要使用“CTRL+加号键”来放大,或使用“CTRL+减号键”来缩小
大型或复杂的函数可能会导致图形视图变得极其杂乱,使得用户难于导航。在这种情况下,使用“图形概况”窗口会有所帮助。概况窗口会始终显示图形完整的块状结构,并用一个虚线框指出你当前在反汇编窗口中查看的图形区域。用户可以用鼠标在概况窗口中拖动该虚线框,以迅速将图形视图调整到任何想到的位置。
几种方式控制图形视图的显示方式:
- 平移。首先,除了使用“图形概况”窗口迅速定位图形外,你还可以通过单击和拖动图形视图的背景来定位图形。
- 重新调整块位置。通过单击指定块的标题栏并将其拖动到一个新位置,用户可以移动图形中的每一个块的位置。如果希望还原默认的图形布局,可以右击图形,并在出现的菜单中选择Layout Graph。
- 分组和折叠块。最后,你可以对块分组,每个块单独分组,或者与其他块一起分组;并可将分组后的块折叠起来,以减少显示的混乱程度。折叠块特别有用,可以帮助你追踪已经分析过的块。要折叠块,可以右击块的标题栏,然后在出现的菜单上选择“Group Nodes”。
- 创建其他反汇编窗口。如果你想要同时查看两个不同函数的图形,可以通过Views-Open Subviews-Disassembly命令打开另一个反汇编窗口。这样打开的第一个反汇编窗口叫做IDA View-A。随后的反汇编窗口叫做IDA View-B、IDA View-C,依次类推。每个反汇编窗口都独立于其他窗口。你完全可以在一个窗口中查看一个图形,在另一个窗口中查看文本列表,或者在3个不同的窗口中查看3个不同的图形。
IDA文本视图
面向文本的反汇编窗口是查看和操作IDA生成的反汇编代码的传统显示窗口。文本显示窗口会呈现一个程序的完整反汇编代码清单(而在图形模式下一次只能显示一个函数),用户只有通过这个窗口才能查看一个二进制文件的数据部分。图形显示窗口中的所有信息均以某种形式存在于文本显示窗口中。
显示窗口的左边部分叫做箭头窗口,用于描述函数中的非线性流程。实线箭头表示非条件跳转,虚线箭头则表示条件跳转。如果一个跳转(条件或非条件)将控制权转交给程序中的某个地址(以前的),这时会使用粗线(实线或虚线)。出现这类逆向流程,通常表示程序中存在循环。在图5-4中,地址004011CF至004011C5之间就有一个循环箭头。
声明(也出现在图形视图中)是IDA对于函数栈帧布局的最准确估算。IDA会对函数栈指针及函数使用的任何栈帧指针的行为进行仔细分析,从而计算出该函数的栈帧的结构。
注释(以分号开头)属于交叉引用。在这个例子中,我们看到的是代码交叉引用(而不是数据交叉引用),它表示另一个程序指令将控制权转交给交叉引用注释所在位置的指令。
函数窗口
与其他显示窗口一样,双击Functions窗口中的一个条目,反汇编窗口将跳转到选定函数所在的位置。
输出窗口
当你打开一个新文件时,IDA工作区底部的输出窗口与其他窗口一起组成了IDA的默认窗口。输出窗口是IDA的输出控制台,从中可以找到与IDA所执行的任务有关的信息。
次窗口
十六进制窗口
默认情况下,十六进制窗口显示程序内容和列表的标准十六进制代码,每行显示16个字节,以及其对应的ASCII字符。
导出窗口
导出窗口导出窗口列出文件的入口点。这包括程序的执行入口点(在程序的文件头部分指定),以及任何由文件导出给其他文件使用的函数和变量。
通常,用户可在共享库(如Windows DLL文件)中找到导出的函数。导出的项目按名称、虚拟地址和序数(如果可用)排列。对于可执行文件,导出窗口中至少包含一个项目:程序的执行入口点。IDA将这个入口点取名为start。
导入窗口
导入窗口的功能与导出窗口的功能正好相反。它列出由被分析的二进制文件导入的所有函数。只有在二进制文件使用共享库时,IDA才需要用到导入窗口。静态链接的二进制文件不存在外部依赖关系,因此不需要导入其他内容。导入窗口中的每个条目列出一个导入项目(函数或数据)的名称,以及包含该项目的库的名称。由于被导入的函数的代码位于共享库中,窗口中每个条目列出的地址为相关导入表条目的虚拟地址。
结构体窗口
结构体窗口用于显示IDA决定在一个二进制文件中使用的任何复杂的数据结构(如C结构体和联合)的布局。在分析阶段,IDA会查询它的函数类型签名扩展库,设法将函数的参数类型与程序使用的内存匹配起来。
枚举窗口
举窗口有点类似于结构体窗口。如果IDA检测到标准枚举数据类型(C enum),它将在枚举窗口中列出该数据类型。你可以使用枚举来代替整数常量,提高反汇编代码的可读性。像结构体窗口一样,在枚举窗口中也可以定义自己的枚举类型,并将其用在经过反汇编的二进制代码中。
其他窗口
每一个窗口都可通过View-Open Subviews命令打开
默认关闭
Strings窗口
Strings窗口中显示的是从二进制文件中提取出的一组字符串,以及每个字符串所在的地址。
右击该窗口,在出现的菜单中选择Setup,即可开始设置
Display only defined strings(仅显示已定义的字符串)
这个选项使Strings窗口仅显示IDA自动创建或用户手动创建的已命名字符串数据项。在选中这个选项的同时禁用所有其他选项,IDA将不会自动扫描其他类型的字符串。
Ignore instructions/data definitions(忽略指令/数据定义)
这个选项会使IDA扫描指令和现有数据定义中的字符串。使用这个选项,可以让IDA扫描二进制代码中错误地转换成指令的字符串,或扫描数据中非字符串格式(如字节数组或整数)的字符串。这个选项还会导致IDA生成许多垃圾字符串,即那些由5个或更多ASCII字符构成的字符串(无论其是否合法)。使用这个选项的效果类似于使用strings -a命令。
Names窗口
简要列举了一个二进制文件的所有全局名称。名称是指对一个程序虚拟地址的符号描述。在最初加载文件的过程中,IDA会根据符号表和签名分析派生出名称列表。名称可以按字母排序,也可以按虚拟地址排序(升序或降序)。用户可通过Names窗口迅速导航到程序列表中的已知位置。双击Names窗口中的名称,可立即跳转到显示该名称的反汇编视图。
Names窗口中显示的名称采用了颜色和字母编码。其编码方案总结如下。
- F,常规函数。IDA认为这些函数不属于库函数。
- L,库函数。IDA通过签名匹配算法来识别库函数。如果某个库函数的签名并不存在,则该函数将被标记为常规函数。
- I,导入的名称,通常为共享库导入的函数名称。它与库函数的区别在于:导入的名称没有代码,而库函数的主体将在反汇编代码清单中显示。
- C,命名代码。这些是已命名的程序指令位置,IDA认为它们不属于任何函数。当IDA在程序的符号表中找到一个名称,但没发现对程序位置的任何调用时,就会出现这种情况。
- D,数据。已命名数据的位置通常表示全局变量。
- A,字符串数据。这是一个被引用的数据位置,其中包含的一串字符符合IDA的某种已知的字符串数据类型,如以’\0’字节结束的ASCIIC字符串。
在对一个程序进行反汇编的过程中,IDA会为所有直接作为代码(分支或调用目标)或数据(读取的、写入的或使用的地址)引用的位置生成名称。如果一个位置已在程序符号表中命名,IDA将采用该名称。如果符号表中某一程序位置没有名称,则IDA会生成一个默认的名称,以在反汇编过程中使用。
- sub_xxxxxx:地址xxxxxx处的子例程。
- loc_xxxxxx:地址xxxxxx处的一个指令。
- byte_xxxxxx:位置xxxxxx处的8位数据。
- word_xxxxxx:位置xxxxxx处的16位数据。
- dword_xxxxxx:位置xxxxxx处的32位数据。
- unk_xxxxxx:位置xxxxxx处的大小未知的数据。
段窗口
段窗口显示的是在二进制文件中出现的段的简要列表。需要注意的在,在讨论二进制文件的结构时,IDA术语段(segment)常称为节(section)。
该窗口中显示的信息包括段名称、起始和结束地址以及许可标志。起始和结束地址代表程序段在运行时对应的虚拟地址范围。
双击段窗口中的任何条目,IDA将跳转到反汇编窗口中该段的起始位置。右击一个条目,IDA将显示一个上下文菜单,你可以选择添加新段、删除现有段、或者编辑现有段的属性。在对非标准格式的文件进行逆向工程时,这些功能特别有用,因为二进制文件的段结构可能还没有被IDA加载器检测出来。
签名窗口
IDA利用一个庞大的签名库来识别已知的代码块。签名用于识别由编译器生成的常用启动顺序,以确定可能已被用来构建给定二进制文件的编译器。签名还可用于将函数划归为由编译器插入的已知库函数,或者因为静态链接而添加到二进制文件中的函数。
在签名窗口中按下INSERT键或右击窗口,IDA都会为你提供Apply new signature(应用新签名)选项
类型库窗口
要请求IDA加载其他类型库,可以在类型库窗口中按下INSERT键,或右击窗口并在出现的菜单中选择Load Type Library(加载类型库)。
函数调用窗口