返回介绍

26.2 使用 Bochs 进行调试

发布于 2024-10-11 21:05:51 字数 4220 浏览 0 评论 0 收藏 0

Bochs 是一种开源 x86 模拟环境。使用 Bochs 可以模拟整个 x86 计算机系统,包括模拟常用的 I/O 设备及一个自定义 BIOS。Bochs 为虚拟化软件(如 VMware Workstation)提供了一个基于模拟的替代方案。Hex-Rays 开发团队的 Elias Bachaalany 首先将 Bochs 集成到 IDA 中,从而为传统的调试提供了一种基于模拟的替代方案。1 Windows 版本的 IDA 附带并安装有兼容版本的 Bochs,非 Windows 用户如果需要使用 Bochs,必须在他们的系统上安装 2.4.2 或更高版本的 Bochs。

1. 参见 Recon 2011 ( http://www.recon.cx/ )中的“Designing a minimal operating system to emulate 32/64bits x86 code snippets, shellcode or malware in Bochs” 。

安装 Bochs 后,任何时候你在 IDA 中打开一个 x86 二进制文件,IDA 将提供 Local Bochs 调试器选项。Bochs 的出现使得在非 Windows 系统上调试 Windows 应用程序成为可能,因为这时你可以使用 Bochs 模拟 Windows 应用程序,而不必将其作为本机进程来运行。作为模拟器,Bochs 的配置选项与更加传统的调试器提供的配置选项略有不同。最重要的区别在于,Bochs 可在以下 3 种模式下运行:磁盘映像模式、IDB 模式和 PE 模式。你可以使用 Bochs 调试器配置对话框来选择运行模式,如图 26-4 所示。

enter image description here

图 26-4 Bochs 调试器选项对话框

就所执行枚举的质量和类型而言,每种模式的精确程度截然不同。

26.2.1 Bochs IDB 模式

IDB 是最基本的 Bochs 模式。在 IDB 模式下,Bochs 仅识别你的数据库中的代码。内存区域将映射到 Bochs 中,并通过从数据库中复制字节进行填充。可配置的栈空间的数量取决于 Bochs 选项对话框中的设置,IDA 将自行决定栈的位置。模拟从名为 ENTRY 的数据库符号(如果已定义)处开始执行(即最初指定指令指针的位置)。如果 ENTRY 符号不存在,IDA 会在打开的数据库中进行检查,看当前是否有一定范围的位置处于选中状态,并将这个范围的起始位置作为调试器的入口点。如果没有选择范围,则将指令指针的初始值作为光标的当前位置。在 IDB 模式下运行时,需要记住的是:Bochs 不提供任何操作系统支持,如共享库或典型进程地址空间中任何众所周知的结构的位置。只要代码没有引用数据库以外的任何内容,你完全可以遍历 PE 文件、ELF 文件、Mach-O 文件或一小段原始机器码(如入侵程序负载)。如果你需要执行某个函数以了解其行为,这时就可以使用 IDB 模式,而不必构造整个进程或磁盘映射。

26.2.2 Bochs PE 模式

在 PE 模式下,你可以执行在一定程度上接近进程级别的调试。选择并激活 PE 模式后,IDA 的 Bochs 控制模块(一个 IDA 插件)将接管控制权,并以类似于 Windows 进程加载器的方式运行(如果你确实在运行本机 Windows 进程)。PE 模式进程将接收进程环境块(PEB )与线程环境块(TEB ),以及一个模仿将在实际进程中创建的环境块的栈。

Bochs 插件还会将大量常用 Windows 库加载到模拟的进程地址空间中(无需执行任何代码),以便于正确处理进程作出的任何库调用。你可以配置 Bochs 在调试器启动时具体加载哪些库,并在<IDADIR>/plugins/bochs/startup.idc 文件中指定这些库。任何库都可以“按原样”加载,或者指定为“将被拨除”。如果某个库带有“将被拨除”标记,Bochs 插件将自动“钩住”该库导出的每个函数,并将这些函数重定向到一个 Bochs 解释函数(有关详细信息,请参阅 startup.idc 文件和 IDA 帮助系统)。这种“拨除”技巧为用户定义任何库函数的自定义行为提供了极大便利。对于任何由 IDA “拨除”的库,你可以定义一个对应的脚本文件,在其中定义你定制的行为。对于其他库(如 foolib.dll ), Bochs 插件将扫描<IDADIR>/plugins/bochs 目录,在其中搜索名为 api_foolib.idc 或 api_foolib.py 的相关脚本。IDA 附带有<IDADIR>/plugins/bochs/api_kernel32.idc 文件,你可以通过该文件了解这类文件的结构,以及如何实现各种函数的自定义行为。

在 PE 模式下,“钩住”库函数并定义自定义行为非常重要,因为这种模式不提供任何操作系统层来执行共享库所需的所有重要操作。例如,通过为函数(如 VirtualAlloc )提供备用的、基于脚本的行为(如果该函数无法与操作系统通信,此操作将失败),你可以让模拟的进程(在某种程度上)确信,它正作为具体的进程运行。创建此类基于脚本的行为的目的是,为模拟的进程提供它在与具体库函数通信时(这些函数反过来又会与具体的操作系统进行通信)期待看到的响应。

如果你在非 Windows 平台上使用 IDA ,你可以将任何所需的库(在 startup.idc 文件中指定)从 Windows 系统复制到 IDA 系统中,并编辑 startup.idc 文件,使其指向包含所有复制的库的目录,从而充分利用 Bochs PE 模式的优势。下面的代码清单为你所需作出的更改提供了一个示例。

// Define additional DLL path  
// (add triple slashes to enable the following lines)  
/// path /home/idauser/xp_dlls/=c:\winnt\system32\

使用 PE 模式在 Bochs 下启动一个进程时,你会注意到一个不同之处,即这时 IDA 不会显示警告对话框,提醒你在调试器控制下启动一个潜在恶意的进程的风险。出现这种情况,是因为这时 IDA 只会创建 Bochs 模拟器进程,且你调试的所有代码均被 Bochs 模拟器视为它所模拟的代码。IDA 甚至不会以你所调试的二进制文件创建任何本机进程。

26.2.3 Bochs 磁盘映像模式

Bochs 调试器的第三种运行模式称为磁盘映像模式。除可与 IDA 集成外,Bochs 本身也是一个成熟的 x86 系统模拟器。因此,你完全可以使用 Bochs 提供的 bximage 工具创建磁盘映像,并使用 Bochs 及任何所需的相关操作系统安装媒介在磁盘映像上安装一个操作系统,并最终使用 Bochs 在模拟环境中运行你的客户操作系统。

如果你使用 IDA/Bochs 的主要目的是了解某个进程的行为,那么磁盘映像模式可能并不适合你。要隔离在完全模拟的操作系统中运行的进程并观察该进程的行为,并不是一个简单的任务,你需要深入了解该操作系统,以及它如何管理进程和内存。分析系统 BIOS 与启动代码是 IDA/Bochs 的优势所在,因为这时操作系统代码还未接管控制权,分析它们会相对容易一些。

在磁盘映像模式下,你不会将可执行文件映像加载到 IDA 中。相反,IDA 附带有一个识别 Bochs 配置文件(bochsrc)2 的加载器。使用 Bochs 模拟整个系统时,bochsrc 文件用于描述硬件执行环境。IDA 的默认 bochsrc 文件为<IDADIR>/cfg/bochsrc.cfg。bochsrc 文件主要用于指定系统 BIOS、视频 ROM 和磁盘映像文件的位置。IDA 的 bochsrc 加载器提供最少的加载服务,仅读取所加载的 Bochs 配置文件指定的第一个磁盘映像文件的第一部分,然后将 Bochs 调试器用于新的数据库。Hex-Rays 博客3 上讨论了如何在开发主启动记录时使用 IDA/Bochs 。

2. 参见 http://bochs.sourceforge.net/doc/docbook/user/bochsrc.html ,了解有关 bochsrc 文件格式的信息。
3. 参见 http://www.hexblog.com/?p=103

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文