- 献词
- 致谢
- 前言
- 第一部分 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 交叉引用
6.1 基本 IDA 导航
当你开始接触 IDA 时,你可能满足于 IDA 提供的导航功能。除提供相当标准的查找功能外(在使用文本编辑器或文字处理器时,你已经熟悉这些功能),IDA 还将生成并显示一个完整的交叉引用(其功能类似于 Web 页面上的超链接)列表。因此,多数情况下,要导航到你感兴趣的位置,只需双击鼠标即可。
6.1.1 双击导航
反汇编程序时,程序的每个位置都分配到了一个虚拟地址。因此,只要提供希望访问的位置的虚拟地址,就可以导航到程序的任何地方。遗憾的是,对我们而言,记住大量地址并非易事。这促使早期的程序员给他们希望引用的程序位置分配符号名称,这大大简化了他们的工作。给程序地址分配符号名称,与给程序操作码分配助记指令名称并无不同。由于程序更易于记忆,读取和写入程序也更加方便。
如前所述,在分析阶段,IDA 会通过检查二进制文件的符号表生成符号名称,或根据二进制文件引用位置的方式自动生成一个名称。除符号用途外,反汇编窗口中显示的任何名称都是一个潜在的导航目标,类似于网页中的超链接。这些名称与标准超链接之间的区别在于:其一,这些名称不像超链接那样突出显示,表示它们可以访问;其次,IDA 中的名称需要双击才能访问,而访问超链接只需单击即可。前面我们已经讨论过如何在各种子窗口(如导入、导出和函数窗口)中使用名称,在这些窗口中,双击一个名称,IDA 将跳转到反汇编窗口中被引用的位置。这只是在双击导航的一个简单例子。如下例所示,每一个标有➊的符号都是一个已命名的导航目标。双击任何一个符号,IDA 将跳转到相应的位置。
.text:0040132B loc_40132B: ; CODE XREF: ➋ sub_4012E4+B^j .text:0040132B cmp edx, 0CDh .text:00401331 jg short ➊ loc_40134E .text:00401333 jz ➊ loc_4013BF .text:00401339 sub edx, 0Ah .text:0040133C jz short ➊ loc_4013A7 .text:0040133E sub edx, 0C1h .text:00401344 jz short ➊ loc_4013AF .text:00401346 dec edx .text:00401347 jz short ➊ loc_4013B7 .text:00401349 jmp ➊ loc_4013DD ; default .text:00401349 ; jumptable 00401300 case 0 .text:0040134E ; ---------------------------------------------------------- .text:0040134E .text:0040134E loc_40134E: ; CODE XREF: ➋ sub_4012E4+4D^j
为方便导航,IDA 把另外两个显示实体看成是导航目标。首先,交叉引用(如➋所示)被当成导航目标。通常,交叉引用被格式化成一个名称和一个十六进制偏移值。在上面的代码中, loc_40134E
右边的交叉引用引用了 sub_4012E4
之前的 4D
16 或 77
10 字节的位置。双击交叉引用文本,IDA 将跳转到引用位置(本例中为 00401331
)。第 9 章将详细介绍交叉引用。
从导航角度看,第二种需要特别注意的显示实体是使用十六进制值的显示实体。如果窗口中的一个十六进制值是二进制文件中的一个合法虚拟地址,那么,双击这个值,反汇编窗口将显示你选择的虚拟地址。在下面的代码中,双击任何一个标有➌的值,反汇编窗口将跳转到相应的位置,因为它们都属于给定二进制文件中的合法虚拟地址。不过,双击标有➍的值则不会有任何效果。
.data:00409013 db ➍ 4 .data:00409014 dd ➌ 4037B0h .data:00409018 db ➍ 0 .data:00409019 db ➍ 0Ah .data:0040901A dd ➌ 404590h .data:0040901E db ➍ 0 .data:0040901F db ➍ 0Ah .data:00409020 dd ➌ 404DA8h
最后,双击导航还与 IDA 的输出窗口有关,尽管该窗口常用于显示各种信息性的消息。当一个导航目标(如前所述)出现在一条消息的开头位置时,双击这条消息,反汇编窗口将跳转到相应的位置。
Propagating type information... Function argument information has been propagated The initial autoanalysis has been finished. ➎ 40134e is an interesting location ➏ Testing: 40134e ➎ loc_4013B7 ➏ Testing: loc_4013B7
在上面的输出窗口中,两条标有➎的消息可用于导航到在消息开头位置指定的地址。双击其他任何消息,包括那些标有➏的消息,将不会有任何效果。
6.1.2 跳转到地址
有时候,你清楚地知道你想要导航的目的地址,但反汇编窗口中并没有可供双击导航的名称。在这种情况下,你有几种选项供选择。第一个是最基本的选项,即使用反汇编窗口滚动条上下滚动窗口,直到看到想要访问的地址。通常,只有知道要导航到的目标地址的虚拟地址时,才能采用这个选项,因为反汇编窗口是按虚拟地址逐行显示的。如果你仅仅知道一个已命名的位置,如一个名为 foobar
的子程序,那么,通过滚动条找目的地址就无异于大海捞针。这时,你可以选择对函数窗口按字母排序,滚动到想要的名称,然后再双击该名称。第三个选项是使用 IDA 的 Search 菜单提供的搜索功能。通常,在要求 IDA 搜索前需要指定一些搜索标准。如果你搜索的是一个已知的位置,使用该选项有点小题大做。
最后,到达一个已知的反汇编位置的最简单方法是,利用如图 6-1 所示的 Jump to Address (跳转到地址)对话框。
图 6-1 Jump to Address 对话框
使用 Jump▶Jump to Address 命令或在处于活动状态的反汇编窗口中按下热键 G,均可以打开 Jump to Address 对话框。如果把这个对话框看成 Go 对话框,可能有助于你记住相关的热键。要想导航到二进制文件中的某个位置,只需指定一个地址(名称或十六进制值),然后单击 OK,IDA 会立即显示你指定的位置。IDA 会记住你在这个对话框中输入的值,并通过一个下拉列表显示,以方便你随后使用。使用这项历史记录功能,你可以迅速返回你之前访问过的位置。
6.1.3 导航历史记录
如果将 IDA 的文档导航功能与 Web 浏览器的相应功能进行比较,我们可能会认为名称和地址等同于超链接,因为可以相对容易地访问它们以查看新地址。IDA 的另一项类似于传统 Web 浏览器的功能,是它的前进和后退导航功能(基于你浏览反汇编窗口的顺序)。每次你导航到反汇编窗口中的一个新位置,你当前的位置就会添加到位置列表中。有两种菜单操作可用于遍历这个列表。首先,Jump▶Jump to Previous Position (跳转▶跳转到前一个位置)命令可使反汇编窗口立即跳转到当前位置的前一个位置。这项操作在概念上等同于 Web 浏览器的后退按钮。其次为热键 ESC ,它是 IDA 中最有用的热键之一(可放入内存)。但是,需要注意的是,在反汇编窗口以外的其他窗口中,使用 ESC 键会关闭当前窗口。不过,你可以通过 View▶Open Subviews 命令重新打开你不小心关闭的窗口。在反汇编窗口中,如果你已经深入到一个函数调用链的几个层次,这时你希望导航到最初的位置,使用后退导航就极其方便。
Jump▶Jump to Next Position (跳转▶跳转到下一位置)类似于 Web 浏览器中的前进按钮,它可将反汇编窗口移动到列表中的下一个位置。与这项操作对应的热键是 CTRL+ENTER,尽管它并不如用于后退导航的 ESC 键有用。
最后,工具栏上还有两个更有用的导航按钮,如图 6-2 所示,它们的作用与浏览器中的前进和后退按钮类似。每个按钮旁边还有一个历史记录下拉列表,你可以迅速访问导航历史记录列表中的任何位置,而不必遍历整个历史记录列表。
图 6-2 前进和后退导航按钮
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论