第二章:介绍 Olly Debug
2016-06-05 18:46
176 查看
第二章:介绍 Olly Debug
一、什么是 Olly Debugger?
援引作者 Oleh Yuschuk 的话“OllyDbg 是一个用于微软 Windows 的 32 位
汇编级分析调试器”。在没有源代码的情况下,二进制代码分析非常有用。Olly 也是一个动态调试器,意味着它允许用户在程序运行时修改一些东西。这在实 际分析二进制文件尝试找出程序工作原理时非常的重要。Olly 有许多许多很棒 的特性,这就是为什么它是逆向工程领域的天字第一号调试器(至少在 Ring3 级是,我们马上就接触到了)。
二、概览
下面是 Olly 的主界面图片,上面有一些说明性的标签。
![](http://s3.51cto.com/wyfs02/M01/82/63/wKioL1dUA3aQWg2-AABUaJuMOHk390.jpg)
打开 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 都有一组寄存器。用来临时存放数值,和高级语言中的变量很像。 下面是寄存器窗口的特写(有标记):
![](http://s3.51cto.com/wyfs02/M02/82/63/wKioL1dUA3ewKwyuAABrru69MXo576.jpg)
顶部实际上是 CPU 的寄存器。如果值有变化,寄存器会从黑色变为红色(对 于观察数值的变化真的非常有用)。你也可以双击任何一个寄存器来改变它的内 容。这些寄存器能做很多事情,后面会讨论更多。
中间那块是标志寄存器,是 CPU 用来标记代码中一些事情的发生(两个数
相等、一个数比另外一个大等等)。双击其中一个标志寄存器就可以修改它。这 些玩意儿在我们的学习过程中扮演着重要的角色。
底下的部分是 FPU,或者叫浮点运算器。只要 CPU 执行任何涉及小数点的 运算就会用到它们。逆向者很少用到它们,主要是在我们接触加密的时候用。
3、堆栈区
![](http://s3.51cto.com/wyfs02/M00/82/64/wKiom1dUAnPzytBCAAAuUsjpCOw693.jpg)
堆栈是内存中的一段区域,用于存储二进制数据的临时列表。这些数据包 括指向内存中地址的指针,字符串,制造者(makers)及大部分重要的数据, 还包括函数调用后的返回地址。当程序中的一个方法调用另一个方法时,控制 权需要转移到新方法以便于它能够返回。CPU 必须知道一个新方法执行完后它 是从哪被调用的,CPU 能够返回到它被调用的地方,继续执行该调用之后的代 码。堆栈就是 CPU 保存返回地址的地方。
关于栈你需要知道一点,他是“先进后出”的数据结构。打个常用的比方, 就像是自助餐厅里下面带有弹簧的一摞盘子一样。当你向顶部“压(PUSH)” 进一个盘子,下面的所有盘子都会被往下压。当你移除(“POP”)顶部的一个 盘子,下面的所有盘子都会被往上提升一级。下个教程我们会实际看看,所以 这里别担心看不太懂。
图片中,第一列是每一个数据成员的地址,第二列是十六进制的 32 位数据, 如果 Olly 能够分析出来的话,那么最后一列是 Olly 关于数据项的注释。如果你 注意看第一行的话,会看到“RETURN to kernel…”的注释。这里是 CPU 放 在栈上的一个地址,以便于在当前的函数执行完后,CPU 知道返回到哪。
在 Olly 中,你可以右键点击堆栈区,并且选择“修改(modify)”来更改内 容。
4、内存数据区
![](http://s3.51cto.com/wyfs02/M00/82/63/wKioL1dUA33Dyn2aAAD7N2Tutic524.png)
在教程的开始,当我们讨论 CPU 从二进制文件中读取的原生“操作码”时, 我提到过你能在十六进制查看器中看到原始数据。不过,在 Olly 中你不需要这 么做。因为内存数据区就是一个内置的十六进制查看器,以便于你查看原始的 二进制数据,只查看内存中的而不是磁盘上的。通常对于同样的数据有两种查 看方式,十六进制的和 ASCII 的。图片中右边的两列就是(第一列是数据驻留 内存中的地址)。Olly 允许修改这些数据的显示方式,后面的教程就会看到。
三、工具栏
不幸的是,Olly 的工具栏给大家留下了一点念想(尤其是当英语并不是作 者的母语)。我将左边的工具栏图标进行了注释:
![](http://s3.51cto.com/wyfs02/M01/82/63/wKioL1dUA37iYg-OAAA4a7oj-HU439.jpg)
这些都是控制代码运行的主要工具。记住这些,尤其是你开始使用 Olly 的 时候,这些按钮的所有功能都可以从“调试(Debug)”菜单的下拉菜单中访问 到。如果你不知道某些东西是什么,你可以从菜单中看到。
关于一些图标我要多说几句。“Re-load”是用来重新启动应用并暂停在入 口点处。所有的补丁(后面会看到)都会被删除,一些断点会失效,应用程序 也不会运行任何代码。好吧,大部分情况下是这样的。“Run” 和 “Pause” 做的就是你看到的那样。 “Step In”意思是运行一行代码然后暂停,如果有的 话它会跟进函数的内部。 “Step Over”做同样的事情,不过它会跳过对另一 个函数的调用。“Animate”有点像 Step In 和 Step Over,不过它特别慢好让 你观察。这个你用的不多,不过有时候看代码运行也挺有意思的,尤其是遇到 多态二进制的时候能够观察到代码的变化。讲的有点超前了......
下面是各窗口的按钮图标(更加有点神秘):
![](http://s3.51cto.com/wyfs02/M02/82/63/wKioL1dUA_qisMJkAADSVP5ExeU568.png)
点击其中的任何一个按钮都会弹出一个窗口,有些你会经常用到,而有的 却很少用。看这些字母并不是很直观,这点你可以像我学习,把它们都点一遍 直到你找到你需要的那个。每一个都可以通过“View”菜单来访问,所以在第 一次征程时你可以获得些许帮助。下面我会介绍最常用的窗口:
1、(M)emory――内存映射窗口
![](http://s3.51cto.com/wyfs02/M02/82/64/wKiom1dUAvmj5UGlAAEzUlJx73M533.png)
内存窗口显示程序已经分配的所有的内存块。它包括正在运行的程序的主 段(本例中,是 Owner 列中的“Showstr”)。在下面你能看到很多其他的段, 这些都是程序载入进内存的 DLL 的,准备将来用的。如果你双击其中的任何一 行,都会打开一个显示该段的反汇编代码(或十六进制数据)的窗口。这个窗 口也显示了块的类型和访问权限、大小以及该段载入内存的地址。
2. (P)atches――补丁窗口
该窗口显示的是你做的任何“补丁”,即对原始代码的任何修改。注意那个 状态(State 列)是激活的(Active)。如果你重新载入应用程序(通过点击 re-load 图标),这些补丁就会失效。为了简便的使它们重新生效(或失效),点击期望 的补丁以及敲击空格键。这可以打开或关闭补丁。注意那个“Old”和“New” 列,显示的是原始的指令和修改后的指令。
3. (B)reakpoints――断点窗口
![](http://s3.51cto.com/wyfs02/M01/82/64/wKiom1dUAvqSLhycAAAbimW-6-8962.jpg)
该窗口显示了当前所有断点设置的位置。这个窗口将会是你的好朋友
4. (K)all Stack――调用栈窗口
(哎呀,我知道为什么初学者记这些图标比较难了......)
![](http://s3.51cto.com/wyfs02/M02/82/63/wKioL1dUA_-Bh0fqAAAqqH7n-pE052.jpg)
这个窗口与前面看到的“堆栈区”不一样,它显示了更多信息,有关于代 码中的调用、发送给这些函数的值以及其他的东西。不久我们会了解到更多。
*下一教程,我会包含我的经过“升级”的 Olly 版本,有些是你一看就明白 的按钮。这里有张图片*
![](http://s3.51cto.com/wyfs02/M00/82/63/wKioL1dUBAPRea9mAADU-AfmuPg134.png)
四、上下文菜单
本教程的最后,我会快速介绍 Olly 的右键菜单。它是许多操作产生的地方, 所以你最少应该熟悉一下它。右键反汇编区的任何地方都会调出该菜单:
![](http://s3.51cto.com/wyfs02/M01/82/63/wKioL1dUBAOQd1xNAABI5JdZgmM984.png)
我只会介绍最常用的几项。随着经验的增多,你最终会遇到那些较少用到 的选项。“Binary”菜单项允许你按字节编辑二进制数据。在这里你可以将埋在 一堆二进制数据中的“未注册”几个字改成“已注册”。“Breakpoint”菜单可以 设置断点。断点分好几种,下一章我会讲到。“Search for”有一个相当大的子 菜单。这里你可以搜索类似字符串、函数调用等二进制数据。“Analysis”菜单 会强制 Olly 重新分析当前正在查看的代码段。有时候 Olly 会对你正在查看的是 代码还是数据感到困惑(记住,它们俩都只是一些数字),这个可以强制 Olly 将 你正在看的内容当做是代码,并且尝试猜测该部分看起来应该是什么样子的。
注意,我的菜单看起来和你的可能不太一样,因为我装了一些插件,这些 插件在菜单中添加了一些功能。不过别担心,后面的教程中我会介绍这些菜单 的。
一、什么是 Olly Debugger?
援引作者 Oleh Yuschuk 的话“OllyDbg 是一个用于微软 Windows 的 32 位
汇编级分析调试器”。在没有源代码的情况下,二进制代码分析非常有用。Olly 也是一个动态调试器,意味着它允许用户在程序运行时修改一些东西。这在实 际分析二进制文件尝试找出程序工作原理时非常的重要。Olly 有许多许多很棒 的特性,这就是为什么它是逆向工程领域的天字第一号调试器(至少在 Ring3 级是,我们马上就接触到了)。
二、概览
下面是 Olly 的主界面图片,上面有一些说明性的标签。
![](http://s3.51cto.com/wyfs02/M01/82/63/wKioL1dUA3aQWg2-AABUaJuMOHk390.jpg)
打开 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 都有一组寄存器。用来临时存放数值,和高级语言中的变量很像。 下面是寄存器窗口的特写(有标记):
![](http://s3.51cto.com/wyfs02/M02/82/63/wKioL1dUA3ewKwyuAABrru69MXo576.jpg)
顶部实际上是 CPU 的寄存器。如果值有变化,寄存器会从黑色变为红色(对 于观察数值的变化真的非常有用)。你也可以双击任何一个寄存器来改变它的内 容。这些寄存器能做很多事情,后面会讨论更多。
中间那块是标志寄存器,是 CPU 用来标记代码中一些事情的发生(两个数
相等、一个数比另外一个大等等)。双击其中一个标志寄存器就可以修改它。这 些玩意儿在我们的学习过程中扮演着重要的角色。
底下的部分是 FPU,或者叫浮点运算器。只要 CPU 执行任何涉及小数点的 运算就会用到它们。逆向者很少用到它们,主要是在我们接触加密的时候用。
3、堆栈区
![](http://s3.51cto.com/wyfs02/M00/82/64/wKiom1dUAnPzytBCAAAuUsjpCOw693.jpg)
堆栈是内存中的一段区域,用于存储二进制数据的临时列表。这些数据包 括指向内存中地址的指针,字符串,制造者(makers)及大部分重要的数据, 还包括函数调用后的返回地址。当程序中的一个方法调用另一个方法时,控制 权需要转移到新方法以便于它能够返回。CPU 必须知道一个新方法执行完后它 是从哪被调用的,CPU 能够返回到它被调用的地方,继续执行该调用之后的代 码。堆栈就是 CPU 保存返回地址的地方。
关于栈你需要知道一点,他是“先进后出”的数据结构。打个常用的比方, 就像是自助餐厅里下面带有弹簧的一摞盘子一样。当你向顶部“压(PUSH)” 进一个盘子,下面的所有盘子都会被往下压。当你移除(“POP”)顶部的一个 盘子,下面的所有盘子都会被往上提升一级。下个教程我们会实际看看,所以 这里别担心看不太懂。
图片中,第一列是每一个数据成员的地址,第二列是十六进制的 32 位数据, 如果 Olly 能够分析出来的话,那么最后一列是 Olly 关于数据项的注释。如果你 注意看第一行的话,会看到“RETURN to kernel…”的注释。这里是 CPU 放 在栈上的一个地址,以便于在当前的函数执行完后,CPU 知道返回到哪。
在 Olly 中,你可以右键点击堆栈区,并且选择“修改(modify)”来更改内 容。
4、内存数据区
![](http://s3.51cto.com/wyfs02/M00/82/63/wKioL1dUA33Dyn2aAAD7N2Tutic524.png)
在教程的开始,当我们讨论 CPU 从二进制文件中读取的原生“操作码”时, 我提到过你能在十六进制查看器中看到原始数据。不过,在 Olly 中你不需要这 么做。因为内存数据区就是一个内置的十六进制查看器,以便于你查看原始的 二进制数据,只查看内存中的而不是磁盘上的。通常对于同样的数据有两种查 看方式,十六进制的和 ASCII 的。图片中右边的两列就是(第一列是数据驻留 内存中的地址)。Olly 允许修改这些数据的显示方式,后面的教程就会看到。
三、工具栏
不幸的是,Olly 的工具栏给大家留下了一点念想(尤其是当英语并不是作 者的母语)。我将左边的工具栏图标进行了注释:
![](http://s3.51cto.com/wyfs02/M01/82/63/wKioL1dUA37iYg-OAAA4a7oj-HU439.jpg)
这些都是控制代码运行的主要工具。记住这些,尤其是你开始使用 Olly 的 时候,这些按钮的所有功能都可以从“调试(Debug)”菜单的下拉菜单中访问 到。如果你不知道某些东西是什么,你可以从菜单中看到。
关于一些图标我要多说几句。“Re-load”是用来重新启动应用并暂停在入 口点处。所有的补丁(后面会看到)都会被删除,一些断点会失效,应用程序 也不会运行任何代码。好吧,大部分情况下是这样的。“Run” 和 “Pause” 做的就是你看到的那样。 “Step In”意思是运行一行代码然后暂停,如果有的 话它会跟进函数的内部。 “Step Over”做同样的事情,不过它会跳过对另一 个函数的调用。“Animate”有点像 Step In 和 Step Over,不过它特别慢好让 你观察。这个你用的不多,不过有时候看代码运行也挺有意思的,尤其是遇到 多态二进制的时候能够观察到代码的变化。讲的有点超前了......
下面是各窗口的按钮图标(更加有点神秘):
![](http://s3.51cto.com/wyfs02/M02/82/63/wKioL1dUA_qisMJkAADSVP5ExeU568.png)
点击其中的任何一个按钮都会弹出一个窗口,有些你会经常用到,而有的 却很少用。看这些字母并不是很直观,这点你可以像我学习,把它们都点一遍 直到你找到你需要的那个。每一个都可以通过“View”菜单来访问,所以在第 一次征程时你可以获得些许帮助。下面我会介绍最常用的窗口:
1、(M)emory――内存映射窗口
![](http://s3.51cto.com/wyfs02/M02/82/64/wKiom1dUAvmj5UGlAAEzUlJx73M533.png)
内存窗口显示程序已经分配的所有的内存块。它包括正在运行的程序的主 段(本例中,是 Owner 列中的“Showstr”)。在下面你能看到很多其他的段, 这些都是程序载入进内存的 DLL 的,准备将来用的。如果你双击其中的任何一 行,都会打开一个显示该段的反汇编代码(或十六进制数据)的窗口。这个窗 口也显示了块的类型和访问权限、大小以及该段载入内存的地址。
2. (P)atches――补丁窗口
该窗口显示的是你做的任何“补丁”,即对原始代码的任何修改。注意那个 状态(State 列)是激活的(Active)。如果你重新载入应用程序(通过点击 re-load 图标),这些补丁就会失效。为了简便的使它们重新生效(或失效),点击期望 的补丁以及敲击空格键。这可以打开或关闭补丁。注意那个“Old”和“New” 列,显示的是原始的指令和修改后的指令。
3. (B)reakpoints――断点窗口
![](http://s3.51cto.com/wyfs02/M01/82/64/wKiom1dUAvqSLhycAAAbimW-6-8962.jpg)
该窗口显示了当前所有断点设置的位置。这个窗口将会是你的好朋友
4. (K)all Stack――调用栈窗口
(哎呀,我知道为什么初学者记这些图标比较难了......)
![](http://s3.51cto.com/wyfs02/M02/82/63/wKioL1dUA_-Bh0fqAAAqqH7n-pE052.jpg)
这个窗口与前面看到的“堆栈区”不一样,它显示了更多信息,有关于代 码中的调用、发送给这些函数的值以及其他的东西。不久我们会了解到更多。
*下一教程,我会包含我的经过“升级”的 Olly 版本,有些是你一看就明白 的按钮。这里有张图片*
![](http://s3.51cto.com/wyfs02/M00/82/63/wKioL1dUBAPRea9mAADU-AfmuPg134.png)
四、上下文菜单
本教程的最后,我会快速介绍 Olly 的右键菜单。它是许多操作产生的地方, 所以你最少应该熟悉一下它。右键反汇编区的任何地方都会调出该菜单:
![](http://s3.51cto.com/wyfs02/M01/82/63/wKioL1dUBAOQd1xNAABI5JdZgmM984.png)
我只会介绍最常用的几项。随着经验的增多,你最终会遇到那些较少用到 的选项。“Binary”菜单项允许你按字节编辑二进制数据。在这里你可以将埋在 一堆二进制数据中的“未注册”几个字改成“已注册”。“Breakpoint”菜单可以 设置断点。断点分好几种,下一章我会讲到。“Search for”有一个相当大的子 菜单。这里你可以搜索类似字符串、函数调用等二进制数据。“Analysis”菜单 会强制 Olly 重新分析当前正在查看的代码段。有时候 Olly 会对你正在查看的是 代码还是数据感到困惑(记住,它们俩都只是一些数字),这个可以强制 Olly 将 你正在看的内容当做是代码,并且尝试猜测该部分看起来应该是什么样子的。
注意,我的菜单看起来和你的可能不太一样,因为我装了一些插件,这些 插件在菜单中添加了一些功能。不过别担心,后面的教程中我会介绍这些菜单 的。
相关文章推荐
- 静态变量和成员变量有什么区别?应该怎么调用?
- C++第七次上机实验—数组素数排序
- SSH框架介绍以及如何搭建(myEclipse下)
- Unity3d优化
- c++作业7
- HtmlParser基础教程 - 在java中解析获取的HttpResponse
- 第十二周项目一(3)-实现复数类中的运算符重载
- 视频转换成flv注意事项
- 三层架构
- HTTP协议学习# (一)request 和response 解析
- 二维数组中的查找
- iOS开发中几种常用设计模式
- android 侧滑菜单
- 贪吃蛇的java代码分析(二)
- java之基础(01)
- codeblocks 多线程编程时:对pthread_create未定义的引用
- 第七次实验
- 关于Android studio中httpclient不能用的问题
- lamp discuz+wordpress+phpmyadmin
- SVN部署及使用