【摘要】OLLYDBG是一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3级调试器,非常容易上手,己代替SoftICE成为当今最为流行的调试解密工具了。同时还支持插件扩展功能,是目前最强大的调试工具。
【关键词】OLLYDBG 反汇编 调试专用工具
一、OllyDBG 的安装
OllyDBG 2.01b版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行其中的OllyDBG.exe 就可以了。汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可(如图1-1)。
在其文件夹中:
Plugin目录为OllyDebug软件的插件的存放文档。
UDD 目录的作用是保存你调试的工作。比如你调试一个软件,设置了断点,添加了注释,一次没做完,这时 OllyDBG 就会把你所做的工作保存到这个 UDD 目录,以便你下次调试时可以继续以前的工作。如果不设置这个 UDD 目录,OllyDBG 默认是在其安装目录下保存这些后缀名为 udd 的文件,时间长了就会显的很乱,所以还是建议专门设置一个目录来保存这些文件。
图1-1
(注:对于初学者本软件不需用额外进行设置,全部使用默认设置即可。)
二、OllyDBG的操作界面
OllyDBG的操作界面主要如图1-2所示。
1
2
3
图1-2
整个操作界面分成四大部分:
4
1. 反汇编窗口:显示被调试程序的反汇编代码,具体的有: 地址:本条汇编代码的内存地址。
HEX 数据:Intel HEX文件是记录文本行的ASCII文本文件,由十六进制数组成的机器码或者数据常量,Intel HEX文件经常被用于将程序或数据传输存储ROM、EPROM,大多数编程器和模拟器使用Intel HEX文件。 反汇编:由反汇编得到的代码。 注释
2. 寄存器窗口:显示当前所选线程的 CPU 寄存器内容,可以实时查看所有寄存器的
变化情况。
3. 内存数据窗口:显示内存或文件的内容,并且可以用快捷键Ctrl+G方便的查看和
修改内存中的任意位置的数据,就像是一个小型的“内存编辑器”。
4. 堆栈窗口:显示当前程序的堆栈情况。其中除了显示地址和内容外,还会在注释区
自动标注返回的地址等信息。
三、OllyDBG的基本操作
快捷键 F8 F7 F2 F4 F9 Ctrl+G 功 能 单步执行 单步执行 设置断点 执行到当前光标所选中的命令 运行程序 查看任意位置数据 说 明 遇到函数调用指令不跟入 遇到函数调用指令跟入 在一条指令上按F2即可变红,表示已经设置上断点,双击HEX数据同样可以设置断点。 运行程序知道遇到断点 在指令、堆栈、内存数据区都可以使用,方便的查看任意位置的指令和数据。 四、实例演示
(一)“1+1”程序的例子
1、首先,我们自己编一个小的程序来使用OllyDBG来进行调试。
这个程序执行的功能就是将1+1的结果赋给sum这个功能。
此为运行后的画面。
2、现在我们使用OllyDBG打开加载这个程序。 点击菜单栏里的文件,打开文件,选中所编程序的exe文件,单击打开,即进入OLLYDBG反汇编界面。如图1-3:
图1-3
一进入光标所在的那一行,即图中反汇编界面中的标黄的那一行,在默认情
况下,OllyDBG将程序中断在PE装载器开始处,而之前的许多步骤则是程序在即将开始进入主函数时所需要的各种数据的初始化准备的操作。
然后我们按F8键单步执行,遇到函数调用指令不跟入。发现整个过程所执
行的指令就是下图红框所示的。
(一) 第一条指令如下图:
将004DFA64存入基址指针寄存器ebp; (二) 第二条指令如下图:
(三)
此处的call为函数的调用,按F7则可以进入函数步步跟踪。 4) 案“2”。
可以发现执行完此步骤之后程序变执行完毕,在cmd窗口中即出现最终的答
(二)简单的口令验证破解实验
1. 程序具体内容如下图所示:
上图口令认证的程序的主要功能就是输入密码看与正确密码是否相同,若不相同则显示“incorrect password!”,若相同则显示“Congratulation! You have passed the verification”。如下图所示:(正确密码:123456)
2. 使用OllyDBG对上述程序分析: 1) 打开OllyDBG,点击菜单栏里的文件,打开文件,选中所编程序的exe文件,
单击打开,即进入OLLYDBG反汇编界面,如图2-1。具体各个功能区不再赘述。
2)
图2-1
分析此程序可知,密码验证的过程主要是通过if()语句来实现,所以我们搜索其中的输出字符串“incorrect password!”,然后点击“跟随”即可以定位到其反汇编代码的具体位置。如图2-2.
图2-2
从图2-2中红框内,我们从注释区可以看见程序中的if else结构。在if语句处按F2键,再按F9键程序开始执行,使程序先执行到if语句处停止。 3) 此时便出现如图2-3所示的命令提示符框:
4)
图2-3
我们输入错误的密码“987654”,如图2-4,然后再按F8键继续按步执行程序。
5)
图2-4
现在我们主要分析以下几条指令,如图2-5:
执行到000D14D7时,显示,跳转为实
现,执行跳转之前使用F7键跟入函数即可发现,程序又调回
verify_password函数中,并且通过比较的过程,具体到汇编语句
TEST EAX,EAX来判断所输入的密码是否与正确密码相符,因为所输入的密码与正确密码不相同,不能跳到000F14F2步,所以执行输出”incorrect password”。同时,从寄存器去可以发现:正确密码存在ECX中,所输入密码存在EDX中。
6) 7)
再按F8继续执行,要执行printf函数,进行相应的压栈出栈操作。 执行到000D14F0步,跳转指令满足,按照指令跳转到000D1510步,如图2-6(图中红线所框):
至此,因为输入密码错误,所以不执行else语句中的内容,具体汇编语言用jmp实现。
8) 然后继续使用F8执行,到再次输入密码,可以发现,输入操作是在
此语句之后,而这时的寄存器情况如图2-7所示:
图2-7
这是上次所输入密码“987654”已经存在EAX中。
从图2-8中可以看出此时所输入的密码“123456”存在了地址为0034F78C的堆中。
图2-8
然后继续执行,判定时满足跳转指令,执行printf“Congratulation! You have passed the verification”。程序执行完毕。
五、自己的思考与体会
OllyDBG是一个强大的反汇编工具,能够深入分析程序的具体执行过程,并且可以完成修改响应汇编指令和一些寄存器内容的操作。在初学中,我们应该多用F7键跟入具体函数,一步一步进行分析,而这个过程与汇编语句相结合能够使我们对程序的执行过程有更深入的理解和认识。同时,OllyDBG也是一个
强大的破解软件,只要反汇编出程序并且了解清楚其具体执行过程,那么便可以达到跟着自己意愿修改程序的目的。在本文中的自己的小实验中,自己编了一个小的指令认证的程序,但因为还是不够熟练和对汇编语言的不了解,所以自己只是分析了整个过程,本来想进行破解,但没有找到具体的汇编比较语句TEST xxx,xxx,所以没有完成破解过程,希望能够通过以后的学习能够完成这一想法。
【参考文献】
1. 0day安全:软件漏洞分析技术,王清著;
2. 百度百科http://baike.baidu.com/link?url=jJLInv-_a0vp6vAoLnb-ktRV5oSyGyI3-MRPsnmYHttIPW9GVYMh_sDmYDsw60KK 3. OllyDBG完美教程(超强入门级)——
因篇幅问题不能全部显示,请点此查看更多更全内容