- 献词
- 致谢
- 前言
- 第一部分 IDA 简介
- 第 1 章 反汇编简介
- 第 2 章 逆向与反汇编工具
- 第 3 章 IDA Pro 背景知识
- 第二部分 IDA 基本用法
- 第 4 章 IDA 入门
- 第 5 章 IDA 数据显示窗口
- 第 6 章 反汇编导航
- 第 7 章 反汇编操作
- 第 8 章 数据类型与数据结构
- 第 9 章 交叉引用与绘图功能
- 第 10 章 IDA 的多种面孔
- 第三部分 IDA 高级应用
- 第 11 章 定制 IDA
- 第 12 章 使用 FLIRT 签名来识别库
- 第 13 章 扩展 IDA 的知识
- 第 14 章 修补二进制文件及其他 IDA 限制
- 第四部分 扩展 IDA 的功能
- 第 15 章 编写 IDA 脚本
- 第 16 章 IDA 软件开发工具包
- 第 17 章 IDA 插件体系结构
- 第 18 章 二进制文件与 IDA 加载器模块
- 第 19 章 IDA 处理器模块
- 第五部分 实际应用
- 第 20 章 编译器变体
- 第 21 章 模糊代码分析
- 第 22 章 漏洞分析
- 第 23 章 实用 IDA 插件
- 第六部分 IDA 调试器
- 第 24 章 IDA 调试器
- 第 25 章 反汇编器/ 调试器集成
- 第 26 章 其他调试功能
- 附录 A 使用 IDA 免费版本 5.0
- 附录 B IDC/SDK 交叉引用
5.1 IDA 主要的数据显示窗口
在默认配置下,IDA (从 6.1 版开始)会在对新二进制文件的初始加载和分析阶段创建 7 个显示窗口。这些窗口全部可以通过导航带下方显示的一组标题标签访问(如图 4-9 所示)。3 个立即可见的窗口分别为 IDA-View 窗口、函数窗口和消息输出窗口。无论这些窗口是否默认打开,我们在本章讨论的所有窗口都可通过 View▶Open Subviews 菜单打开。请记住这一点,因为你可能会经常无意中关闭 IDA 的显示窗口。
在 IDA 中,ESC 键是一个非常有用的热键。在反汇编窗口中,ESC 键的作用与 Web 浏览器的“后退”按钮类似,因此,它在导航反汇编窗口时非常有用(导航将在第 6 章详细介绍)。遗憾的是,在打开的其他窗口中,ESC 键用于关闭窗口。有时候,你可能恰恰想要关闭窗口,但其他情况下,你可能希望立即重新打开刚刚关闭的窗口。
5.1.1 反汇编窗口
反汇编窗口也叫 IDA-View 窗口,它是操作和分析二进制文件的主要工具。因此,熟悉反汇编窗口中信息的显示方式,对于我们非常重要。
反汇编窗口有两种显示格式:默认的基于图形的视图和面向文本的列表视图。多数 IDA 用户会有所偏好,具体使用哪一种视图,取决于用户如何使程序的流程可视化。如果你想将文本列表视图作为默认汇编视图,可以用 Options▶General 菜单命令打开 IDA Options 复选框,取消选择 Graph 选项卡下的 Use graph view by default(默认使用图形视图)选项。在打开的反汇编窗口中,你可以使用空格键在图形视图与列表视图之间切换。
1. IDA 图形视图
图 5-1 显示了图形视图中一个非常简单的函数。图形视图会让人联想到程序流程图,因为它将一个函数分解成许多基本块1 ,以生动显示该函数由一个块到另一个块的控制流程。
1. 基本块 是一个不包含分支,从头执行到尾的最大指令序列。因此,每个基本块都有唯一的入口点(块中的第一条指令)和退出点(块中的最后一条指令)。基本块中的第一条指令通常是分支指令的目标,而最后一条指令则往往是一条分支指令。
图 5-1 IDA 图形视图
在屏幕上你会发现,IDA 使用不同的彩色箭头区分函数块之间各种类型的流2 。根据测试条件,在条件跳转位置终止的基本块可能会生成两种流:Ye s 边的箭头(是的,执行分支)默认为绿色,No 边的箭头(不,不执行分支)默认为红色。只有一个后继块的基本块会利用一个正常边(默认为蓝色)指向下一个即将执行的块。
2. IDA 使用术语 流 来表示某个指令如何继续执行。 正常流 (也叫做 普通流 )表示指令默认连续执行。 跳转流 表示当前的指令跳转到(或可能跳转到)某个非连续性位置。 调用流 表示当前指令会调用一个子例程。
在图形模式下,IDA 一次显示一个函数。使用滑轮鼠标的用户,可以使用“CTRL+鼠标滑轮”来调整图形的大小。键盘缩放控制需要使用“CTRL+加号键”来放大,或使用“CTRL+减号键”来缩小。大型或复杂的函数可能会导致图形视图变得极其杂乱,使得用户难于导航。在这种情况下,使用“图形概况”窗口(见图 5-2)会有所帮助。概况窗口会始终显示图形完整的块状结构,并用一个虚线框指出你当前在反汇编窗口中查看的图形区域。用户可以用鼠标在概况窗口中拖动该虚线框,以迅速将图形视图调整到任何想到的位置。
图 5-2 “图形概况”窗口
用户可以通过几种方式控制图形视图的显示方式,使其满足你的要求。
平移 。首先,除了使用“图形概况”窗口迅速定位图形外,你还可以通过单击和拖动图形视图的背景来定位图形。
重新调整块位置 。通过单击指定块的标题栏并将其拖动到一个新位置,用户可以移动图形中的每一个块的位置。需要注意的是,IDA 会尽可能少地重新设定一个被移动的块的连接线3 的位置。你可以拖动连接线的顶点,手动更改连接线的路径。在按下 SHIFT 键的同时,在连接线的任何位置双击鼠标,即可在该位置添加一个新顶点。如果希望还原默认的图形布局,可以右击图形,并在出现的菜单中选择 Layout Graph。
3. 即连接两个块的带箭头的折线。——译者注
分组和折叠块 。最后,你可以对块分组,每个块单独分组,或者与其他块一起分组;并可将分组后的块折叠起来,以减少显示的混乱程度。折叠块特别有用,可以帮助你追踪已经分析过的块。要折叠块,可以右击块的标题栏,然后在出现的菜单上选择“Group Nodes”。
创建其他反汇编窗口 。如果你想要同时查看两个不同函数的图形,可以通过 Views▶Open Subviews▶Disassembly 命令打开另一个反汇编窗口。这样打开的第一个反汇编窗口叫做 IDA View-A。随后的反汇编窗口叫做 IDA View-B、IDA View-C,依次类推。每个反汇编窗口都独立于其他窗口。你完全可以在一个窗口中查看一个图形,在另一个窗口中查看文本列表,或者在 3 个不同的窗口中查看 3 个不同的图形。
需要指出的是,对于视图的控制并不仅限于这些示例。我们将在第 9 章介绍其他 IDA 图形功能,有关操作 IDA 图形视图的更多信息,请参见 IDA 的帮助文档。
2. IDA 文本视图
面向文本的反汇编窗口是查看和操作 IDA 生成的反汇编代码的传统显示窗口。文本显示窗口会呈现一个程序的完整反汇编代码清单(而在图形模式下一次只能显示一个函数),用户只有通过这个窗口才能查看一个二进制文件的数据部分。图形显示窗口中的所有信息均以某种形式存在于文本显示窗口中。
这里是否有遗漏信息
在使用图形视图时,你获得的有关每一个反汇编代码行的信息似乎要更少一些。这是因为 IDA 隐藏了许多与每个反汇编行有关的更加传统的信息(如虚拟地址信息),以最大限度地减少显示每个基本块所需的空间。要想显示与每个反汇编行有关的其他信息,可以通过 Options▶General 命令打开 IDA 常规选项,然后在 Disassembly 选项卡的可用的反汇编行部分选择相应的选项。例如,要给每一个反汇编行添加虚拟地址,可以启用“行前缀”,将图 5-1 中的图形转变为如图 5-3 所示的图形。
图 5-3 启用“行前缀”的图形视图
图 5-1 和图 5-3 所显示的函数的文本视图列表如图 5-4 所示。窗口中的反汇编代码分行显示,虚拟地址则默认显示。通常,虚拟地址以 [区域名称]:[虚拟地址] 这种格式显示,如 .text:004011C1
。
显示窗口的左边部分叫做 箭头窗口 (➊),用于描述函数中的非线性流程。实线箭头表示非条件跳转,虚线箭头则表示条件跳转。如果一个跳转(条件或非条件)将控制权转交给程序中的某个地址(以前的),这时会使用粗线(实线或虚线)。出现这类逆向流程,通常表示程序中存在循环。在图 5-4 中,地址 004011CF
至 004011C5
之间就有一个循环箭头。
位置➋的声明(也出现在图形视图中)是 IDA 对于函数栈帧4 布局的最准确估算。IDA 会对函数栈指针及函数使用的任何栈帧指针的行为进行仔细分析,从而计算出该函数的栈帧的结构。栈显示将在第 6 章详细讨论。
4. 栈帧 (或 激活记录 )是在程序的运行时栈中分配的一个内存块,其中包含传递给一个函数的参数和该函数声明的局部变量。栈帧在函数的入口点位置分配,并在函数退出时释放。栈帧将在第 6 章详细介绍。
位置➌的注释(以分号开头)属于 交叉引用 。在这个例子中,我们看到的是代码交叉引用(而不是数据交叉引用),它表示另一个程序指令将控制权转交给交叉引用注释所在位置的指令。交叉引用将在第 9 章讨论。
图 5-4 IDA 文本视图
在本书的剩余部分,我们将主要以文本显示为例。只有在图形显示比文本显示更加清楚的情况下,我们才会用到图形显示。在第 7 章,我们将详细介绍文本显示,以整理和注释反汇编过程。
5.1.2 函数窗口
Functions 窗口用于列举 IDA 在数据库中识别的每一个函数。Functions 窗口中的条目如下所示:
malloc .text 00BDC260 00000180 R . . . B . .
这一行信息特别指出:用户可以在二进制文件中虚拟地址为 00BDC260
的 .text
部分找到 malloc
函数;该函数长为 384 字节(十六进制为 180 字节),它返回调用方( R
),并使用 EBP 寄存器( B
)引用它的局部变量。如需了解更多有关用于描述函数的标记(如上面的 R
和 B
)的信息,请参阅 IDA 的内部帮助文档(或右击一个函数并选择 Properties,标记将以可编辑的复选框显示)。
与其他显示窗口一样,双击 Functions 窗口中的一个条目,反汇编窗口将跳转到选定函数所在的位置。
5.1.3 输出窗口
当你打开一个新文件时,IDA 工作区底部的输出窗口与其他窗口一起组成了 IDA 的默认窗口。输出窗口是 IDA 的输出控制台,从中可以找到与 IDA 所执行的任务有关的信息。例如,当你初次打开一个二进制文件时,IDA 将生成消息,指出它在某个时刻所处的分析阶段,以及它为创建新数据库而执行的操作。当你使用数据库时,输出窗口将输出你所执行的各种操作的状态。你可以将输出窗口中的内容复制到系统剪贴板中,也可以右击窗口的任何位置,并在出现的菜单中选择相应的操作而完全删除输出窗口的内容。通常,输出窗口是显示你为 IDA 开发的任何脚本和插件的输出的主要窗口。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论