2 调试器设计

调试器就是黑客的眼睛。你能够使用它对程序进行动态跟 踪和分析。特别是当涉及到 exploit ,fuzzer 和病毒分析的时候, 动态分析的能力决定你的技术水平。对于调试器的使用大家都再熟悉不过 了,但是对调试器的实现原理,估计就不是那么熟悉了。当我们对软件缺陷进行评估的时候,

调试器提供了非常多的便利和优点。比如运行,暂停,步进,一个进程;设置断点;操作寄存器和内存;捕捉内部异常,这些底层操作的细节,正是我这章要详细探讨的。

在深入学习之前,先让我们先了解下白盒调试和黑盒调试的不同。许多的开发平台都会 包含一个自带的调试器,允许开发工具结合源代码对程序进行精确的跟踪测试。这就是白盒 调试。当我们很难得到源代码的时候,开发者,逆向工程师, Hacker 就会应用黑盒调试跟 踪目标程序。黑盒调试中,被测试的软件对黑客来说是不透明的,唯一能看到的就是反汇编 代码。这时候要分析出程序的运作流程,找出程序的错误将变得更复杂,花费的时间也会更 多。但是高超的逆向技术集合优秀的逆向工具将使这个过程变得简单,轻松,有时候善于此 道的黑客,甚至比开发者更了解软件:)。

黑盒测试分成两种不同的模式:用户模式 和 内核模式。用户模式(通常指的是 ring3 级的程序)是你平时运行用户程序的一般模式(普通的程序)。用户模式的权限是最低的。 当你运行“运算器(cacl.exe)”的时候,就会产生一个用户级别的进程;对这个进程的调试 就是用户模式调试。核心模式的权限是最高的。这里运行着操作系统内核,驱动程序,底层 组件。当运行 Wireshark 嗅探数据包的时候,就是和一个工作在内核的网络驱动交互。如果 你想暂停驱动或者检测驱动状态,就需要使用支持内核模式的调试器了。

下面的这些用户模式的调试器大家应该再熟悉不过了:WinDbg(微软生产),OllyDbg(一个免费的调试器 作者是 Oleh Yuschuk)。当你在 Linux 下调试程序的时候,就需要使用 标准的 GNU 调试器(gdb)。以上的三个调试器相当的强大,都有各自的特色和优点。

最近几年,调试器的智能调试技术也取得了长足的发展,特别是在 Windows 平台。 智能调试体现在强大可扩展性上,常常通过脚本或者别的方式对调试器进行进一步的开发利 用,比如安装钩子函数,以及其他的专门为 Hacker 和逆向工程师专门定制的各种功能。在 这 方 面 出 现 了 两 个 新 的 具 有 代 表 性 的 作 品 分 别 是 PyDbg (byPedram Amini) 和 Immunity Debugger (from Immunity, Inc.)。

PyDbg 是一个纯 Python 实现的调试器,让黑客能够用 Python 语言全面的控制一个进程, 实现自动化调试。Immunity 调试器则是一个会让你眼前一亮的调试器,界面相当的友好, 类似 OllyDbg,但是拥有更强大的功能以及更多的 Python 调试库。这两个调试器在本书的 后面章节将会详细的介绍。现在先让我们深入了解调试器的一般原理。

在这章,我们将把注意力集中在 x86 平台下的用户模式,通过对 CPU 体系结构,(堆) 栈以及调试器的底层操作细节的深入探究,理解调试器的工作原理,为实现我们自己的调试 器打下基础。