- 献词
- 致谢
- 前言
- 第一部分 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 交叉引用
24.1 启动调试器
调试器通常用于执行以下两种任务:分析与已崩溃进程有关的内存映像(内核转储),以一种完全受控的方式执行进程。调试会话以选择一个接受调试的进程为起点。通常,你可以通过两种方式选择一个进程。第一,大多数调试器能够 依附到 一个正在运行的进程上(假设用户拥有此权限)。根据你所使用的调试器,调试器本身也许能够提供一个可供它自己选择的可用进程列表。如果调试器不具备这样的能力,则用户必须确定想要依附的进程的 ID,然后命令调试器依附到指定的进程上。调试器依附进程的具体方式因操作系统而异,这一内容不在本书的讨论范围之列。依附一个现有的进程时,你不可能监视或控制这个进程的初步启动顺序,因为在你有机会依附进程之前,它的所有启动和初始化代码已经执行完毕。
你使用 IDA 调试器依附进程的方式取决于 IDA 当前是否打开一个数据库。如果没有数据库打开,那么你可以使用 Debugger ▶Attach 菜单,如图 24-1 所示。
图 24-1 依附到任意一个进程
通过这个菜单中的可用选项,可以选择不同的 IDA 调试器(远程调试将在第 26 章讨论)。这个菜单中的选项因运行 IDA 的平台而有所不同。选择本地调试器,IDA 将显示一个正在运行的进程列表,你可以依附这些进程。这个列表的一个例子如图 24-2 所示。
图 24-2 调试器进程选择对话框
选择一个进程后,调试器将捕获该进程的内存快照,以此创建一个临时数据库。除这个正在运行的进程的内存映像外,临时数据库中还包含该进程加载的所有共享库,这使得这个数据库比我们常见的数据库要复杂得多。以这种方式依附于一个进程的缺点在于:在反汇编这个进程时,IDA 没有多少可用的信息。因为 IDA 的加载器绝不会处理对应的可执行文件映像,因而也不会对相关二进制文件进行自动分析。实际上,一旦调试器依附到这个进程,二进制文件中唯一被反汇编的指令只有指令指针当前指向的指令。依附一个进程会立即暂停这个进程,以便你在恢复进程执行之前设置断点。
依附于一个正在运行的进程的另一个方法是在依附之前,在 IDA 中打开相关的可执行文件。有数据库打开时,Debugger 菜单将呈现一种截然不同的形式,如图 24-3 所示。
图 24-3 有数据库打开时的调试器菜单
如果此菜单(或与之非常相似的菜单)并未显示,则你可能尚未为用户当前打开的文件类型指定调试器。这时,Debugger ▶Select Debugger (调试器▶选择调试器)将根据当前的文件类型显示适合的调试器列表。一个典型的调试器选择对话框如图 24-4 所示。
图 24-4 调试器选择对话框
通过选中该对话框底部的复选框,你可以为当前文件类型选择默认调试器。当前的默认调试器(如果有)将在该复选框上方显示。选择调试器后,你随时可以通过 Debug▶Switch Debugger(调试▶切换调试器)菜单更改调试器。
选择 Debugger ▶Attach to Process (调试器▶依附到进程)时,IDA 的行为各有不同,具体取决于在活动数据库中打开的文件的类型。如果打开的文件为可执行文件,IDA 将显示与数据库中打开的文件同名的所有进程的列表。如果 IDA 找不到名称相匹配的进程,IDA 将显示包含每一个正在运行进程的列表,让你自己来选择所要依附到的正确进程。你可以随时依附到任何显示的进程,但 IDA 无法保证启动该进程使用的是加载到打开的 IDA 数据库中的同一个二进制映像。
如果当前打开的数据库为共享库,则 IDA 的行为会有所不同。在 Windows 系统上,IDA 会对显示的进程列表进行过滤,只留下那些加载了对应的.dll 文件的进程。例如,如果你当前正在 IDA 中分析 wininet.dll 文件,那么当你选择 Debugger ▶Attach to Process 时,只会看到那些当前已加载 wininet.dll 的进程。在 Linux 和 OS X 系统中,IDA 不提供这种过滤功能,并且会显示你有权依附到的所有进程。
另外,要依附于一个正在运行的进程,你可以在调试器的控制下启动一个新进程。由于 IDA 没有打开数据库,你可以通过 Debugger ▶Run 来启动一个新进程。如果 IDA 打开了一个数据库,则可以通过 Debugger ▶Start Process 或 Debugger ▶Run to Cursor 启动一个新进程。如果使用前一个命令,新进程将继续执行,直到它遇到一个断点(你需要在选择 Debugger ▶Start Process 之前设置),或者直到你选择使用 Debugger ▶Pause Process 使该进程暂停。使用 Debugger ▶Run to Cursor 将在启动新进程之前,在当前光标位置设置一个断点。这时,新进程将继续执行,直到它到达当前光标位置或者遇到一个较早的断点。如果执行永远无法到达当前光标位置(或任何其他断点),该进程将继续运行,直到你强制暂停或终止(Debugger ▶Terminate Process)该进程。
在调试器的控制下启动一个进程(而不是依附一个现有的进程)是监控该进程执行的每一项操作的唯一方法。在进程启动之前设置断点,你可以严密监控一个进程的整个启动顺序。如果你调试的是一个模糊程序,那么控制启动顺序就显得特别重要,因为你往往希望在去模糊程序完成任务之后,进程开始执行其正常操作之前,立即暂停该进程。
从 IDA 数据库启动进程的另一个好处在于 IDA 会在启动该进程之前,对进程映像进行初步分析。与将调试器依附于现有进程相比,这样做得到的反汇编代码清单的质量将显著提高。
IDA 调试器可以进行本地调试和远程调试。对本地调试而言,你只能调试可在你的平台上运行的二进制文件。对于在其他平台或 CPU 上运行的二进制文件,没有模拟层允许它们在 IDA 的本地调试器中运行。至于远程调试,IDA 自带了许多调试服务器,包括用于 Windows 32/64、Windows CE/ARM、Mac OS X 32/64、Linux 32/64/ARM 和 Android 的服务器。调试服务器旨在与你要调试的二进制文件并行执行。运行远程调试服务器后,IDA 将能够与该服务器通信,在远程计算机上启动目标进程,或依附到该进程。对于 Windows CE ARM 设备,IDA 使用 ActiveSync 与远程设备通信,并远程安装调试服务器。IDA 还能够与 GUN Debugger(gdb)1 的 gdbserver2 组件通信,或与链接到合适的 gdb 远程存根3 的程序通信。最后,对于 Symbian 设备上的远程调试,你必须安装并配置 Metrowerk 的 App TRK4 以便 IDA 通过串行端口与该设备通信。任何时候,IDA 只能作为在 x86、x64、MIPS、ARM 和 PPC 处理器上运行的进程的调试器前端。远程调试将在第 26 章中讨论。
1. 参见 http://www.gnu.org/software/gdb/ 。
2. 参见 http://www.sourceware.org/gdb/current/onlinedocs/gdb/Server.html#Server 。
3. 参见 http://www.sourceware.org/gdb/current/onlinedocs/gdb/Remote-Stub.html#Remote-Stub 。
4. 参见 http://www.tools.ext.nokia.com/agents/index.htm 。
和任何其他调试器一样,如果你想使用 IDA 的调试器启动新进程,需要在调试主机上提供原始的可执行文件,而且,你需要使用运行 IDA 的用户的完全权限执行这个原始的二进制文件。换句话说,只有一个加载要调试二进制文件的 IDA 数据库并不够。使用 IDA 调试器分析恶意软件时,了解这一点尤其重要。如果你无法正确控制恶意软件样本,你用于调试的机器可能很容易受到恶意软件的感染。任何时候,只要你选择 Debugger ▶Start Process(或者在打开数据库时选择 Debugger ▶Attach to Process ),IDA 将显示如下所示的调试器警告消息,向你警告这种可能性。
您即将启动调试器。调试一个程序意味着它的代码将在您的系统上运行。
请小心恶意程序、病毒和木马。
注意:如果你选择 No,调试器将被自动禁用。
您确定想要继续吗?
对于这个警告,如果你选择 No,“调试器”菜单将从 IDA 主窗口中消失。除非你关闭当前打开的数据库,你才能恢复“调试器”菜单。
我们强烈建议你在一个沙盒环境中调试恶意软件。与之相比,我们在第 21 章中讨论的 x86 模拟器插件既不需要原始的二进制文件,也不需要在实施模拟的机器上执行二进制文的任何指令。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论