第二章:介绍 Olly Debug

一、什么是 Olly Debugger?

援引作者 Oleh Yuschuk 的话“OllyDbg 是一个用于微软 Windows 的 32 位

汇编级分析调试器”。在没有源代码的情况下,二进制代码分析非常有用。Olly 也是一个动态调试器,意味着它允许用户在程序运行时修改一些东西。这在实 际分析二进制文件尝试找出程序工作原理时非常的重要。Olly 有许多许多很棒 的特性,这就是为什么它是逆向工程领域的天字第一号调试器(至少在 Ring3 级是,我们马上就接触到了)。

二、概览

下面是 Olly 的主界面图片,上面有一些说明性的标签。

第二章:介绍 Olly Debug_源代码

打开 Olly 时有一个默认的子窗口是 CPU 窗口。这是那个“大图片”中大部 分数据所在的地方,如果你什么时候把它关掉了,只需要点击工具栏中那个“C” 图标就行了。窗口被分成了四个部分:反汇编区(Disassembly),寄存器区 (Registers),堆栈区(Stack)以及内存数据区(Dump)。下面是对每个区的

说明: 1、反汇编区

该部分主要包含了二进制文件的反汇编代码。这是 Olly 显示二进制信息的 地方,包括操作码(opcode)和翻译的汇编代码。第一列是指令的地址(内存 中地址)。第二列按汇编语言叫操作码,每个指令至少对应一条代码(有很多对 应多条)。这才是 CPU 真正需要并且是唯一能读懂的代码。这些操作码组成了 “机器语言”,也就是计算机的语言。如果你看过二进制的原始数据(用十六进 制编辑器),你除了看到这些操作码的字符串以外,就没有其他的了。Olly 的一 个主要工作是将这些“机器语言”“反汇编”成人类可读的汇编语言。第三列是 汇编语言。不过退一步讲,对于不太懂汇编的人来说,汇编不比操作码好多少。 不多随着学的越来越多,汇编提供了远多于代码所做的更多信息。

最后一列是 Olly 对于该行代码的注释。有时候会包含所调用 API 的名字, 比如 CreateWindow 和 GetDlgItemX。Olly 也会尝试通过将非 API 调用命名来 帮 助 我 们 理 解 代 码 , 上 图 中 的 “ ImageRed.00510C84 ″ 和 “ImageRed.00510BF4″就是此类情况。退一步讲,这些东西不是那么有用, Olly 也允许我们将它们修改成一个有意义的名字。你也可以在该列写自己的注 释。只要双击该列中的某行,就会弹出一个对话框让你输入注释。这些注释会 自动保存到下一次。

2、寄存器区

每个 CPU 都有一组寄存器。用来临时存放数值,和高级语言中的变量很像。 下面是寄存器窗口的特写(有标记):

第二章:介绍 Olly Debug_Windows_02

顶部实际上是 CPU 的寄存器。如果值有变化,寄存器会从黑色变为红色(对 于观察数值的变化真的非常有用)。你也可以双击任何一个寄存器来改变它的内 容。这些寄存器能做很多事情,后面会讨论更多。

中间那块是标志寄存器,是 CPU 用来标记代码中一些事情的发生(两个数

相等、一个数比另外一个大等等)。双击其中一个标志寄存器就可以修改它。这 些玩意儿在我们的学习过程中扮演着重要的角色。

底下的部分是 FPU,或者叫浮点运算器。只要 CPU 执行任何涉及小数点的 运算就会用到它们。逆向者很少用到它们,主要是在我们接触加密的时候用。

3、堆栈区

第二章:介绍 Olly Debug_源代码_03

堆栈是内存中的一段区域,用于存储二进制数据的临时列表。这些数据包 括指向内存中地址的指针,字符串,制造者(makers)及大部分重要的数据, 还包括函数调用后的返回地址。当程序中的一个方法调用另一个方法时,控制 权需要转移到新方法以便于它能够返回。CPU 必须知道一个新方法执行完后它 是从哪被调用的,CPU 能够返回到它被调用的地方,继续执行该调用之后的代 码。堆栈就是 CPU 保存返回地址的地方。

关于栈你需要知道一点,他是“先进后出”的数据结构。打个常用的比方, 就像是自助餐厅里下面带有弹簧的一摞盘子一样。当你向顶部“压(PUSH)” 进一个盘子,下面的所有盘子都会被往下压。当你移除(“POP”)顶部的一个 盘子,下面的所有盘子都会被往上提升一级。下个教程我们会实际看看,所以 这里别担心看不太懂。

图片中,第一列是每一个数据成员的地址,第二列是十六进制的 32 位数据, 如果 Olly 能够分析出来的话,那么最后一列是 Olly 关于数据项的注释。如果你 注意看第一行的话,会看到“RETURN to kernel…”的注释。这里是 CPU 放 在栈上的一个地址,以便于在当前的函数执行完后,CPU 知道返回到哪。

在 Olly 中,你可以右键点击堆栈区,并且选择“修改(modify)”来更改内 容。

4、内存数据区

第二章:介绍 Olly Debug_blank_04

在教程的开始,当我们讨论 CPU 从二进制文件中读取的原生“操作码”时, 我提到过你能在十六进制查看器中看到原始数据。不过,在 Olly 中你不需要这 么做。因为内存数据区就是一个内置的十六进制查看器,以便于你查看原始的 二进制数据,只查看内存中的而不是磁盘上的。通常对于同样的数据有两种查 看方式,十六进制的和 ASCII 的。图片中右边的两列就是(第一列是数据驻留 内存中的地址)。Olly 允许修改这些数据的显示方式,后面的教程就会看到。

三、工具栏

不幸的是,Olly 的工具栏给大家留下了一点念想(尤其是当英语并不是作 者的母语)。我将左边的工具栏图标进行了注释:

第二章:介绍 Olly Debug_blank_05

这些都是控制代码运行的主要工具。记住这些,尤其是你开始使用 Olly 的 时候,这些按钮的所有功能都可以从“调试(Debug)”菜单的下拉菜单中访问 到。如果你不知道某些东西是什么,你可以从菜单中看到。

关于一些图标我要多说几句。“Re-load”是用来重新启动应用并暂停在入 口点处。所有的补丁(后面会看到)都会被删除,一些断点会失效,应用程序 也不会运行任何代码。好吧,大部分情况下是这样的。“Run” 和 “Pause” 做的就是你看到的那样。 “Step In”意思是运行一行代码然后暂停,如果有的 话它会跟进函数的内部。 “Step Over”做同样的事情,不过它会跳过对另一 个函数的调用。“Animate”有点像 Step In 和 Step Over,不过它特别慢好让 你观察。这个你用的不多,不过有时候看代码运行也挺有意思的,尤其是遇到 多态二进制的时候能够观察到代码的变化。讲的有点超前了......

下面是各窗口的按钮图标(更加有点神秘):

第二章:介绍 Olly Debug_target_06

点击其中的任何一个按钮都会弹出一个窗口,有些你会经常用到,而有的 却很少用。看这些字母并不是很直观,这点你可以像我学习,把它们都点一遍 直到你找到你需要的那个。每一个都可以通过“View”菜单来访问,所以在第 一次征程时你可以获得些许帮助。下面我会介绍最常用的窗口:

1、(M)emory——内存映射窗口

第二章:介绍 Olly Debug_Windows_07

内存窗口显示程序已经分配的所有的内存块。它包括正在运行的程序的主 段(本例中,是 Owner 列中的“Showstr”)。在下面你能看到很多其他的段, 这些都是程序载入进内存的 DLL 的,准备将来用的。如果你双击其中的任何一 行,都会打开一个显示该段的反汇编代码(或十六进制数据)的窗口。这个窗 口也显示了块的类型和访问权限、大小以及该段载入内存的地址。

2. (P)atches——补丁窗口

该窗口显示的是你做的任何“补丁”,即对原始代码的任何修改。注意那个 状态(State 列)是激活的(Active)。如果你重新载入应用程序(通过点击 re-load 图标),这些补丁就会失效。为了简便的使它们重新生效(或失效),点击期望 的补丁以及敲击空格键。这可以打开或关闭补丁。注意那个“Old”和“New” 列,显示的是原始的指令和修改后的指令。

3. (B)reakpoints——断点窗口

第二章:介绍 Olly Debug_target_08

该窗口显示了当前所有断点设置的位置。这个窗口将会是你的好朋友

4. (K)all Stack——调用栈窗口

(哎呀,我知道为什么初学者记这些图标比较难了......)

第二章:介绍 Olly Debug_工作原理_09

这个窗口与前面看到的“堆栈区”不一样,它显示了更多信息,有关于代 码中的调用、发送给这些函数的值以及其他的东西。不久我们会了解到更多。

*下一教程,我会包含我的经过“升级”的 Olly 版本,有些是你一看就明白 的按钮。这里有张图片*

第二章:介绍 Olly Debug_blank_10

四、上下文菜单

本教程的最后,我会快速介绍 Olly 的右键菜单。它是许多操作产生的地方, 所以你最少应该熟悉一下它。右键反汇编区的任何地方都会调出该菜单:

第二章:介绍 Olly Debug_blank_11

我只会介绍最常用的几项。随着经验的增多,你最终会遇到那些较少用到 的选项。“Binary”菜单项允许你按字节编辑二进制数据。在这里你可以将埋在 一堆二进制数据中的“未注册”几个字改成“已注册”。“Breakpoint”菜单可以 设置断点。断点分好几种,下一章我会讲到。“Search for”有一个相当大的子 菜单。这里你可以搜索类似字符串、函数调用等二进制数据。“Analysis”菜单 会强制 Olly 重新分析当前正在查看的代码段。有时候 Olly 会对你正在查看的是 代码还是数据感到困惑(记住,它们俩都只是一些数字),这个可以强制 Olly 将 你正在看的内容当做是代码,并且尝试猜测该部分看起来应该是什么样子的。

注意,我的菜单看起来和你的可能不太一样,因为我装了一些插件,这些 插件在菜单中添加了一些功能。不过别担心,后面的教程中我会介绍这些菜单 的。