- 献词
- 致谢
- 前言
- 第一部分 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 交叉引用
26.1 使用 IDA 进行远程调试
所有版本的 IDA 均附带有用于实现远程调试会话的服务器组件。此外,IDA 还可以连接到使用 gdb_server
或内置 gdb 存根的远程 gdb 会话。远程调试的主要优点之一在于,它能够将 GUI 调试器界面作为任何调试会话的前端。多数情况下,除设置并建立远程调试服务器连接外,远程调试会话与本地调试会话并不存在太大区别。
26.1.1 使用 Hex-Rays 调试服务器
要开始远程调试,首先需要在进行进程调试的计算机上启动相应的调试服务器组件。IDA 附带有以下服务器组件。
win32_remote.exe 。在 Windows 计算机上执行的、用于调试 32 位 Windows 应用程序的服务器组件。
win64_remotex64.exe 。在 64 位 Windows 计算机上执行的、用于调试 64 位 Windows 应用程序的服务器组件(仅用于 IDA 高级版)。
wince_remote_arm.dll 。上传到 Windows CE 设备(通过 ActiveSync)的服务器组件。
mac_server 。在 OS X 计算机上执行的、用于调试 32 位 OS X 应用程序的服务器组件。
mac_serverx64 。在 64 位 OS X 计算机上执行的、用于调试 64 位 OS X 应用程序的服务器组件(仅用于 IDA 高级版)。
linux_server 。在 Linux 计算机上执行的、用于调试 32 位 Linux 应用程序的服务器组件。
linux_serverx64 。在 64 位 Linux 计算机上执行的、用于调试 64 位 Linux 应用程序的服务器组件(仅用于 IDA 高级版)。
armlinux_server 。在基于 ARM 的计算机上执行的、用于调试 ARM 应用程序的服务器组件。
android_server 。在 Android 设备上执行的、用于调试 Android 应用程序的服务器组件。
要在任何平台上执行远程调试,你只需要在该平台上执行相应的服务器组件。你不需要在远程平台上安装 IDA 的完整版本。换句话说,如果你要将 Windows 版本的 IDA 作为调试客户端,并且希望远程调试 Linux 应用程序,则除了要调试的二进制文件外,你只需复制 linux_server 文件1 并在 Linux 系统上执行该文件。
1. 请注意,IDA 附带的 * _server
二进制文件依赖大量共享库。你可以使用 ldd
(在 OS X 上为 otool –L
)命令列出这些共享库。
不论你在服务器上运行什么平台,服务器组件均接受以下 3 个命令行选项。
-p<port number> 用于指定备用 TCP 端口,以便服务器监听。默认端口为 23946。请注意,
-p
与端口号之间没有空格。-P<password> 用于指定客户端连接调试服务器所必需的密码。请注意,
-P
与提供的密码之间没有空格。-v 将服务器置于详细模式。
并没有选项用于限制服务器所监听的 IP 地址。如果你希望限制进入的连接,可以将基于主机的防火墙规则应用于调试平台。启动服务器后,你可以在任何受支持的操作系统上运行 IDA ,并将它作为连接调试服务器的客户端界面,但任何时候,服务器都只能处理一个活动调试会话。如果你希望保持几个同步调试会话,你必须在几个不同的 TCP 端口上启动多个调试服务器实例。
从客户端的角度看,远程调试通过 Debugger ▶Process Options 命令指定服务器主机名称与端口来启动,如图 26-1 所示。你必须首先执行此操作,然后再启动或连接要调试的进程。
图 26-1 调试器进程选项对话框
此对话框中的前 4 个字段可用于本地和远程调试会话,而 Hostname、Port 和 Password 字段仅用于远程调试会话。下面简要介绍这个对话框中的字段。
Application 。你要调试的应用程序二进制文件的完整路径。对于本地调试会话,该路径为本地文件系统中的路径。对于远程调试会话,该路径为调试服务器上的路径。如果你选择不使用完整路径,远程服务器将搜索它当前的工作目录。
Input file 。用于创建 IDA 数据库的文件的完整路径。对于本地调试会话,该路径为本地文件系统中的路径。对于远程调试会话,该路径为调试服务器上的路径。如果你选择不使用完整路径,远程服务器将搜索它当前的工作目录。
Directory 。应在其中启动进程的工作目录。对于本地调试,该目录必须为本地文件系统中的目录。对于远程调试,该目录为调试服务器上的目录。
Parameters 。用于指定在进程启动时传递给它的任何命令行参数。请注意,其中不得包含任何 shell 元字符(如<、>和|)。任何此类字符将作为命令行参数传递给进程。因此,你将无法在调试器中启动一个进程,并让该进程执行任何类型的输入或输出重定向。对于远程调试会话,进程输出将在用于启动调试服务器的控制台中显示。
Hostname 。远程调试服务器主机或 IP 地址。对于本地调试会话,请将此字段留空。
Port 。远程调试服务器监听的 TCP 端口号。
Password 。远程调试服务器所需的密码。请注意,在此字段中输入的数据不会受到屏蔽,因此,任何能够看到你的显示器的人都能够获得该密码。而且,此密码将以明文形式传送给远程服务器,任何能够拦截网络数据包的人也能够获得此密码。
初看起来,图 26-1 中 Application 字段与 Input File 字段的值似乎完全相同。如果你在 IDA 数据库中打开的文件与你在远程计算机上运行的可执行文件为同一文件,则这两个字段中的值也为同一个值。但是,有些时候,你可能希望调试你在 IDA 数据库中分析的库文件(如 DLL )。你无法直接调试库文件,因为它们并非独立的可执行文件。这时,你需要将 Input File 字段设置为库文件的路径。而 Application 字段则必须设置为使用你要调试的库文件的应用程序的名称。
连接远程 gdb 服务器的过程与连接远程 IDA 调试服务器的过程基本相同,只存在两个细微的差别。首先,连接到 gdb_server
不需要密码;其次,IDA 允许你通过调试器设置对话框中的相关选项按钮来指定特定于 gdb 的行为。GDB 配置对话框如图 26-2 所示。
图 26-2 GDB 配置对话框
值得注意的是,IDA 无法获知运行 gdb_server
的计算机的体系结构,因此,你需要为其指定处理器类型(默认为 Intel x86 ),并可能还需要指定该处理器的字节次序。当前,IDA 可为 x86、ARM、PowerPC 和 MIPS 处理器提供调试界面。
26.1.2 连接到远程进程
许多时候,你可能需要连接到远程调试服务器上运行的某个进程。例如,如果你在 IDA 中没有打开数据库,你可以执行 Debugger ▶Attach 命令,从 IDA 的可用调试器列表中进行选择。如果你选择一个 IDA 远程调试器,你将看到如图 26-3 所示的配置对话框。
图 26-3 远程调试器配置
提供适当的连接参数并单击 OK(确定)按钮后,IDA 将获得并显示远程调试服务器中的进程列表,以便你选择并连接到特定的进程。
此外,你可能已在 IDA 中打开了一个二进制文件,并且希望连接到一个远程进程。这时,你可能需要选择一个调试器(如果之前没有为打开的文件类型指定调试器)或切换调试器类型(如果当前并未选择远程调试器)。选择调试器后,你还必须提供远程调试服务器的主机名称和密码信息(见图 26-1 ),然后你就可以使用 Debugger ▶Attach to Process 命令连接到远程进程。
26.1.3 远程调试期间的异常处理
在第 25 章中,我们讨论了 IDA 调试器的异常处理及如何修改调试器的异常处理行为。在远程调试会话过程中,调试器的默认异常处理行为由 exceptions.cfg 文件规定,该文件保存在客户计算机中(即你实际运行 IDA 的计算机)。因此,你可以修改 exceptions.cfg 文件,并通过 Debugger Setup 对话框(见图 25-4 )重新加载修改后的文件,而无需访问远程服务器。
26.1.4 在远程调试过程中使用脚本和插件
在远程调试会话中,你仍然可以利用脚本和插件自动完成调试任务。你选择执行的任何脚本或插件将在客户计算机上的 IDA 中运行。IDA 将依次处理与远程进程交互所需的任何操作,如设置断点,查询状态,修改内存或恢复执行。在脚本看来,调试会话就像在本地发生一样。唯一需要注意的是,你必须确保你执行的脚本和插件适用于目标进程运行的体系结构,而非 IDA 客户端运行的体系结构(除非它们碰巧为同一体系结构)。换言之,如果你在 Linux 上将 Windows 版本的 IDA 作为远程调试客户端,就不能指望 Windows 调试器隐藏脚本发挥任何作用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论