在默认配置下,IDA(从 6.1 版开始)会在对新二进制文件的初始加载和分析阶段创建 7 个显示窗口
3 个立即可见的窗口分别为 IDA-View 窗口、函数窗口和消息输出窗口
可以通过 View -> Open Subviews 菜单打开这些窗口
在 IDA 中,ESC 键是一个非常有用的热键
在反汇编窗口中,ESC 键的作用与Web浏览器的“后退”按钮类似
在打开的其他窗口中,ESC 键用于关闭窗口
反汇编窗口
反汇编窗口也叫 IDA-View 窗口,它是操作和分析二进制文件的主要工具
反汇编窗口有两种显示格式:默认的基于图形的视图和面向文本的列表视图
可以使用空格键在图形视图与列表视图之间切换
IDA 图形视图
图形视图将一个函数分解成许多基本块,以生动显示该函数由一个块到另一个块的控制流程
基本块是一个不包含分支,从头执行到尾的最大指令序列
基本块中的第一条指令通常是分支指令的目标,而最后一条指令则往往是一条分支指令
IDA 使用不同的彩色箭头区分函数块之间各种类型的流
正常流(也叫做普通流)表示指令默认连续执行,跳转流表示当前的指令跳转到(或可能跳转到)某个非连续性位置,调用流表示当前指令会调用一个子例程
根据测试条件,在条件跳转位置终止的基本块可能会生成两种流:Yes 边的箭头(是的,执行分支)默认为绿色,No 边的箭头(不,不执行分支)默认为红色
只有一个后继块的基本块会利用一个正常边(默认为蓝色)指向下一个即将执行的块
在图形模式下,IDA 一次显示一个函数
使用滑轮鼠标的用户,可以使用“CTRL+鼠标滑轮”来调整图形的大小
概况窗口始终显示图形完整的块状结构,并用一个虚线框指出你当前在反汇编窗口中查看的图形区域
可以用鼠标在概况窗口中拖动该虚线框,以迅速将图形视图调整到任何想到的位置
控制图形视图的显示方式:
1.平移。首先,除了使用“图形概况”窗口迅速定位图形外,你还可以通过单击和拖动图形视图的背景来定位图形
2.重新调整块位置。通过单击指定块的标题栏并将其拖动到一个新位置,用户可以移动图形中的每一个块的位置
IDA 会尽可能少地重新设定一个被移动的块的连接线的位置,即连接两个块的带箭头的折线
如果想还原默认的图形布局,可以右击图形,并选择 Layout Graph
可以拖动连接线的顶点,手动更改连接线的路径
在按下 shift 键的同时,在连接线的任何位置双击鼠标,即可在该位置添加一个新顶点
3.分组和折叠块。可以对块分组,每个块单独分组,或者与其他块一起分组,并可将分组后的块折叠起来,以减少显示的混乱程度
折叠块可以帮助追踪已经分析过的块,要折叠块,可以右击块的标题栏,然后选择 Group Nodes
4.创建其他反汇编窗口。如果想要同时查看两个不同函数的图形,可以通过 Views -> Open Subviews -> Disassembly 命令打开另一个反汇编窗口
这样打开的第一个反汇编窗口叫做 IDA View-A,随后的反汇编窗口叫做 IDA View-B、IDA View-C,依次类推
每个反汇编窗口都独立于其他窗口,可以在一个窗口中查看一个图形,在另一个窗口中查看文本列表,或者在 3 个不同的窗口中查看 3 个不同的图形
IDA 文本视图
面向文本的反汇编窗口是查看和操作 IDA 生成的反汇编代码的传统显示窗口
文本显示窗口会呈现一个程序的完整反汇编代码清单(而在图形模式下一次只能显示一个函数),用户只有通过这个窗口才能查看一个二进制文件的数据部分
图形显示窗口中的所有信息均以某种形式存在于文本显示窗口中
在使用图形视图时,获得的有关每一个反汇编代码行的信息似乎要更少一些
因为 IDA 隐藏了许多与每个反汇编行有关的更加传统的信息(如虚拟地址信息),以最大限度地减少显示每个基本块所需的空间
要想显示与每个反汇编行有关的其他信息,可以通过 Options -> General 命令打开 IDA 常规选项,然后在 Disassembly 选项卡的可用的反汇编行部分选择相应的选项
例如,要给每一个反汇编行添加虚拟地址,可以启用“行前缀”
启用行前缀
函数的文本视图列表如下图
窗口中的反汇编代码分行显示,虚拟地址则默认显示
通常,虚拟地址以 [ 区域名称 ]:[ 虚拟地址 ] 这种格式显示,如 .text:00401589
显示窗口的左边部分叫做箭头窗口(1),用于描述函数中的非线性流程
实线箭头表示非条件跳转,虚线箭头则表示条件跳转
如果一个跳转(条件或非条件)将控制权转交给程序中的某个地址(以前的),这时会使用粗线(实线或虚线)
出现这类逆向流程,通常表示程序中存在循环
在上图中,地址 0040158E 至 00401592 之间就有一个循环箭头
位置 1 的声明(也出现在图形视图中)是 IDA 对于函数栈帧布局的最准确估算
IDA 会对函数栈指针及函数使用的任何栈帧指针的行为进行仔细分析,从而计算出该函数的栈帧的结构
栈帧(或激活记录)是在程序的运行时栈中分配的一个内存块,其中包含传递给一个函数的参数和该函数声明的局部变量
栈帧在函数的入口点位置分配,并在函数退出时释放
位置 2 的注释(以分号开头)属于交叉引用
代码交叉引用(而不是数据交叉引用),它表示另一个程序指令将控制权转交给交叉引用注释所在位置的指令
函数窗口
函数窗口用于列举 IDA 在数据库中识别的每一个函数
Functions 窗口中的条目如下所示:
在二进制文件中虚拟地址为 0040E600 的 .text 部分找到 scanf 函数,该函数长为 41 字节(十六进制为 29 字节)
它返回调用方( R ),并使用 EBP 寄存器( B )引用它的局部变量
双击 Functions 窗口中的一个条目,反汇编窗口将跳转到选定函数所在的位置
输出窗口
打开一个新文件时,IDA 工作区底部的输出窗口与其他窗口一起组成了 IDA 的默认窗口
输出窗口是 IDA 的输出控制台,从中可以找到与 IDA 所执行的任务有关的信息
例如,初次打开一个二进制文件时,IDA 将生成消息,指出它在某个时刻所处的分析阶段,以及它为创建新数据库而执行的操作
当你使用数据库时,输出窗口将输出你所执行的各种操作的状态
可以将输出窗口中的内容复制到系统剪贴板中,也可以右击窗口的任何位置,并在出现的菜单中选择相应的操作而完全删除输出窗口的内容
通常,输出窗口是显示 IDA 开发的任何脚本和插件的输出的主要窗口