您的位置:首页 > 其它

第二章:介绍 Olly Debug

2016-06-05 18:46 176 查看
第二章:介绍 Olly Debug
一、什么是 Olly Debugger?
援引作者 Oleh Yuschuk 的话“OllyDbg 是一个用于微软 Windows 的 32 位
汇编级分析调试器”。在没有源代码的情况下,二进制代码分析非常有用。Olly 也是一个动态调试器,意味着它允许用户在程序运行时修改一些东西。这在实 际分析二进制文件尝试找出程序工作原理时非常的重要。Olly 有许多许多很棒 的特性,这就是为什么它是逆向工程领域的天字第一号调试器(至少在 Ring3 级是,我们马上就接触到了)。
二、概览
下面是 Olly 的主界面图片,上面有一些说明性的标签。



打开 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 都有一组寄存器。用来临时存放数值,和高级语言中的变量很像。 下面是寄存器窗口的特写(有标记):



顶部实际上是 CPU 的寄存器。如果值有变化,寄存器会从黑色变为红色(对 于观察数值的变化真的非常有用)。你也可以双击任何一个寄存器来改变它的内 容。这些寄存器能做很多事情,后面会讨论更多。
中间那块是标志寄存器,是 CPU 用来标记代码中一些事情的发生(两个数
相等、一个数比另外一个大等等)。双击其中一个标志寄存器就可以修改它。这 些玩意儿在我们的学习过程中扮演着重要的角色。
底下的部分是 FPU,或者叫浮点运算器。只要 CPU 执行任何涉及小数点的 运算就会用到它们。逆向者很少用到它们,主要是在我们接触加密的时候用。
3、堆栈区



堆栈是内存中的一段区域,用于存储二进制数据的临时列表。这些数据包 括指向内存中地址的指针,字符串,制造者(makers)及大部分重要的数据, 还包括函数调用后的返回地址。当程序中的一个方法调用另一个方法时,控制 权需要转移到新方法以便于它能够返回。CPU 必须知道一个新方法执行完后它 是从哪被调用的,CPU 能够返回到它被调用的地方,继续执行该调用之后的代 码。堆栈就是 CPU 保存返回地址的地方。
关于栈你需要知道一点,他是“先进后出”的数据结构。打个常用的比方, 就像是自助餐厅里下面带有弹簧的一摞盘子一样。当你向顶部“压(PUSH)” 进一个盘子,下面的所有盘子都会被往下压。当你移除(“POP”)顶部的一个 盘子,下面的所有盘子都会被往上提升一级。下个教程我们会实际看看,所以 这里别担心看不太懂。
图片中,第一列是每一个数据成员的地址,第二列是十六进制的 32 位数据, 如果 Olly 能够分析出来的话,那么最后一列是 Olly 关于数据项的注释。如果你 注意看第一行的话,会看到“RETURN to kernel…”的注释。这里是 CPU 放 在栈上的一个地址,以便于在当前的函数执行完后,CPU 知道返回到哪。
在 Olly 中,你可以右键点击堆栈区,并且选择“修改(modify)”来更改内 容。
4、内存数据区



在教程的开始,当我们讨论 CPU 从二进制文件中读取的原生“操作码”时, 我提到过你能在十六进制查看器中看到原始数据。不过,在 Olly 中你不需要这 么做。因为内存数据区就是一个内置的十六进制查看器,以便于你查看原始的 二进制数据,只查看内存中的而不是磁盘上的。通常对于同样的数据有两种查 看方式,十六进制的和 ASCII 的。图片中右边的两列就是(第一列是数据驻留 内存中的地址)。Olly 允许修改这些数据的显示方式,后面的教程就会看到。
三、工具栏
不幸的是,Olly 的工具栏给大家留下了一点念想(尤其是当英语并不是作 者的母语)。我将左边的工具栏图标进行了注释:



这些都是控制代码运行的主要工具。记住这些,尤其是你开始使用 Olly 的 时候,这些按钮的所有功能都可以从“调试(Debug)”菜单的下拉菜单中访问 到。如果你不知道某些东西是什么,你可以从菜单中看到。
关于一些图标我要多说几句。“Re-load”是用来重新启动应用并暂停在入 口点处。所有的补丁(后面会看到)都会被删除,一些断点会失效,应用程序 也不会运行任何代码。好吧,大部分情况下是这样的。“Run” 和 “Pause” 做的就是你看到的那样。 “Step In”意思是运行一行代码然后暂停,如果有的 话它会跟进函数的内部。 “Step Over”做同样的事情,不过它会跳过对另一 个函数的调用。“Animate”有点像 Step In 和 Step Over,不过它特别慢好让 你观察。这个你用的不多,不过有时候看代码运行也挺有意思的,尤其是遇到 多态二进制的时候能够观察到代码的变化。讲的有点超前了......
下面是各窗口的按钮图标(更加有点神秘):



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



内存窗口显示程序已经分配的所有的内存块。它包括正在运行的程序的主 段(本例中,是 Owner 列中的“Showstr”)。在下面你能看到很多其他的段, 这些都是程序载入进内存的 DLL 的,准备将来用的。如果你双击其中的任何一 行,都会打开一个显示该段的反汇编代码(或十六进制数据)的窗口。这个窗 口也显示了块的类型和访问权限、大小以及该段载入内存的地址。
2. (P)atches――补丁窗口
该窗口显示的是你做的任何“补丁”,即对原始代码的任何修改。注意那个 状态(State 列)是激活的(Active)。如果你重新载入应用程序(通过点击 re-load 图标),这些补丁就会失效。为了简便的使它们重新生效(或失效),点击期望 的补丁以及敲击空格键。这可以打开或关闭补丁。注意那个“Old”和“New” 列,显示的是原始的指令和修改后的指令。
3. (B)reakpoints――断点窗口



该窗口显示了当前所有断点设置的位置。这个窗口将会是你的好朋友
4. (K)all Stack――调用栈窗口
(哎呀,我知道为什么初学者记这些图标比较难了......)



这个窗口与前面看到的“堆栈区”不一样,它显示了更多信息,有关于代 码中的调用、发送给这些函数的值以及其他的东西。不久我们会了解到更多。
*下一教程,我会包含我的经过“升级”的 Olly 版本,有些是你一看就明白 的按钮。这里有张图片*



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



我只会介绍最常用的几项。随着经验的增多,你最终会遇到那些较少用到 的选项。“Binary”菜单项允许你按字节编辑二进制数据。在这里你可以将埋在 一堆二进制数据中的“未注册”几个字改成“已注册”。“Breakpoint”菜单可以 设置断点。断点分好几种,下一章我会讲到。“Search for”有一个相当大的子 菜单。这里你可以搜索类似字符串、函数调用等二进制数据。“Analysis”菜单 会强制 Olly 重新分析当前正在查看的代码段。有时候 Olly 会对你正在查看的是 代码还是数据感到困惑(记住,它们俩都只是一些数字),这个可以强制 Olly 将 你正在看的内容当做是代码,并且尝试猜测该部分看起来应该是什么样子的。
注意,我的菜单看起来和你的可能不太一样,因为我装了一些插件,这些 插件在菜单中添加了一些功能。不过别担心,后面的教程中我会介绍这些菜单 的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: