Loading... # 一、什么是Olly Debugger? 援引作者Oleh Yuschuk 的话“OllyDbg 是一个用于微软Windows 的32 位汇编级分析调试器”。在没有源代码的情况下,二进制代码分析非常有用。Olly也是一个动态调试器,意味着它允许用户在程序运行时修改一些东西。这在实际分析二进制文件尝试找出程序工作原理时非常的重要。Olly 有许多许多很棒的特性,这就是为什么它是逆向工程领域的天字第一号调试器(至少在Ring3级是,我们马上就接触到了)。 --- # 二、概览 下面是Olly 的主界面图片,上面有一些说明性的标签。 ![0f3486a5b0304bc5791bfc089832258c.png](https://www.fanlis.xyz/usr/uploads/2020/09/1017158612.png) 打开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 都有一组寄存器。用来临时存放数值,和高级语言中的变量很像。下面是寄存器窗口的特写(有标记): ![3b916d17a29b45ee5e0157cef05776bd.png](https://www.fanlis.xyz/usr/uploads/2020/09/3549758536.png) 顶部实际上是CPU 的寄存器。如果值有变化,寄存器会从黑色变为红色(对于观察数值的变化真的非常有用)。你也可以双击任何一个寄存器来改变它的内容。这些寄存器能做很多事情,后面会讨论更多。 中间那块是标志寄存器,是CPU 用来标记代码中一些事情的发生(两个数相等、一个数比另外一个大等等)。双击其中一个标志寄存器就可以修改它。这些玩意儿在我们的学习过程中扮演着重要的角色。 底下的部分是FPU,或者叫浮点运算器。只要CPU 执行任何涉及小数点的运算就会用到它们。逆向者很少用到它们,主要是在我们接触加密的时候用。 ## 3. 堆栈区 ![2167c09b36490e48bc15afec73100dbc.png](https://www.fanlis.xyz/usr/uploads/2020/09/1838570158.png) 堆栈是内存中的一段区域,用于存储二进制数据的临时列表。这些数据包括指向内存中地址的指针,字符串,制造者(makers)及大部分重要的数据,还包括函数调用后的返回地址。当程序中的一个方法调用另一个方法时,控制权需要转移到新方法以便于它能够返回。CPU 必须知道一个新方法执行完后它是从哪被调用的,CPU 能够返回到它被调用的地方,继续执行该调用之后的代码。堆栈就是CPU 保存返回地址的地方。关于栈你需要知道一点,他是“先进后出”的数据结构。打个常用的比方,就像是自助餐厅里下面带有弹簧的一摞盘子一样。当你向顶部“压(PUSH)”进一个盘子,下面的所有盘子都会被往下压。当你移除(“POP”)顶部的一个盘子,下面的所有盘子都会被往上提升一级。下个教程我们会实际看看,所以这里别担心看不太懂。 图片中,第一列是每一个数据成员的地址,第二列是十六进制的32 位数据,如果Olly 能够分析出来的话,那么最后一列是Olly 关于数据项的注释。如果你注意看第一行的话,会看到“RETURN to kernel…”的注释。这里是CPU 放在栈上的一个地址,以便于在当前的函数执行完后,CPU 知道返回到哪。 在Olly 中,你可以右键点击堆栈区,并且选择“修改(modify)”来更改内容。 ## 4. 内存数据区 ![03e1b3f0a1fe6e7cdb7f96e5a01a3330.png](https://www.fanlis.xyz/usr/uploads/2020/09/2807008814.png) 在教程的开始,当我们讨论CPU 从二进制文件中读取的原生“操作码”时,我提到过你能在十六进制查看器中看到原始数据。不过,在Olly 中你不需要这么做。因为内存数据区就是一个内置的十六进制查看器,以便于你查看原始的二进制数据,只查看内存中的而不是磁盘上的。通常对于同样的数据有两种查看方式,十六进制的和ASCII 的。图片中右边的两列就是(第一列是数据驻留内存中的地址)。Olly 允许修改这些数据的显示方式,后面的教程就会看到。 --- # 三、工具栏 不幸的是,Olly 的工具栏给大家留下了一点念想(尤其是当英语并不是作者的母语)。我将左边的工具栏图标进行了注释: ![9bbe20a4c65d2bbdd8ed7ab835deabb3.png](https://www.fanlis.xyz/usr/uploads/2020/09/94111362.png) 这些都是控制代码运行的主要工具。记住这些,尤其是你开始使用Olly 的时候,这些按钮的所有功能都可以从“调试(Debug)”菜单的下拉菜单中访问到。如果你不知道某些东西是什么,你可以从菜单中看到。关于一些图标我要多说几句。“Re-load”是用来重新启动应用并暂停在入口点处。所有的补丁(后面会看到)都会被删除,一些断点会失效,应用程序也不会运行任何代码。好吧,大部分情况下是这样的。“Run” 和“Pause”做的就是你看到的那样。“Step In”意思是运行一行代码然后暂停,如果有的话它会跟进函数的内部。“Step Over”做同样的事情,不过它会跳过对另一个函数的调用。“Animate”有点像Step In 和Step Over,不过它特别慢好让你观察。这个你用的不多,不过有时候看代码运行也挺有意思的,尤其是遇到多态二进制的时候能够观察到代码的变化。讲的有点超前了...... 下面是各窗口的按钮图标(更加有点神秘): ![ec9f0cf3bd10a646e5a5f3192458e7c7.png](https://www.fanlis.xyz/usr/uploads/2020/09/4108538717.png) 点击其中的任何一个按钮都会弹出一个窗口,有些你会经常用到,而有的却很少用。看这些字母并不是很直观,这点你可以像我学习,把它们都点一遍直到你找到你需要的那个。每一个都可以通过“View”菜单来访问,所以在第一次征程时你可以获得些许帮助。下面我会介绍最常用的窗口: ## 1. (M)emory——内存映射窗口 ![9c660eb4b07c6214c7a829ac89c886b8.png](https://www.fanlis.xyz/usr/uploads/2020/09/2080515900.png) 内存窗口显示程序已经分配的所有的内存块。它包括正在运行的程序的主段(本例中,是Owner 列中的“Showstr”)。在下面你能看到很多其他的段,这些都是程序载入进内存的DLL 的,准备将来用的。如果你双击其中的任何一行,都会打开一个显示该段的反汇编代码(或十六进制数据)的窗口。这个窗口也显示了块的类型和访问权限、大小以及该段载入内存的地址。 ## 2. (P)atches——补丁窗口 该窗口显示的是你做的任何“补丁”,即对原始代码的任何修改。注意那个状态(State 列)是激活的(Active)。如果你重新载入应用程序(通过点击re-load图标),这些补丁就会失效。为了简便的使它们重新生效(或失效),点击期望的补丁以及敲击空格键。这可以打开或关闭补丁。注意那个“Old”和“New”列,显示的是原始的指令和修改后的指令。 ## 3. (B)reakpoints——断点窗口 ![1c47fd4a61a904a4fa134c334a37cc27.png](https://www.fanlis.xyz/usr/uploads/2020/09/1271896157.png) 该窗口显示了当前所有断点设置的位置。这个窗口将会是你的好朋友 ## 4. (K)all Stack——调用栈窗口 (哎呀,我知道为什么初学者记这些图标比较难了......) ![2ef060b3b2e8be9099342d8c1cc412b8.png](https://www.fanlis.xyz/usr/uploads/2020/09/3161865557.png) 这个窗口与前面看到的“堆栈区”不一样,它显示了更多信息,有关于代码中的调用、发送给这些函数的值以及其他的东西。不久我们会了解到更多。 *下一教程,我会包含我的经过“升级”的Olly 版本,有些是你一看就明白的按钮。这里有张图片* ![c821a9e24a62a2bd735c598371f930a5.png](https://www.fanlis.xyz/usr/uploads/2020/09/2451543860.png) --- # 四、上下文菜单 本教程的最后,我会快速介绍Olly 的右键菜单。它是许多操作产生的地方,所以你最少应该熟悉一下它。右键反汇编区的任何地方都会调出该菜单: ![5c3573c97b30074b734a4987189eb6a7.png](https://www.fanlis.xyz/usr/uploads/2020/09/1968051858.png) 我只会介绍最常用的几项。随着经验的增多,你最终会遇到那些较少用到的选项。“Binary”菜单项允许你按字节编辑二进制数据。在这里你可以将埋在一堆二进制数据中的“未注册”几个字改成“已注册”。“Breakpoint”菜单可以设置断点。断点分好几种,下一章我会讲到。“Search for”有一个相当大的子菜单。这里你可以搜索类似字符串、函数调用等二进制数据。“Analysis”菜单会强制Olly 重新分析当前正在查看的代码段。有时候Olly 会对你正在查看的是代码还是数据感到困惑(记住,它们俩都只是一些数字),这个可以强制Olly 将你正在看的内容当做是代码,并且尝试猜测该部分看起来应该是什么样子的。 注意,我的菜单看起来和你的可能不太一样,因为我装了一些插件,这些插件在菜单中添加了一些功能。不过别担心,后面的教程中我会介绍这些菜单的。 最后修改:2020 年 09 月 11 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏