1.3 调试工具OllyDbg
在软件的开发过程中,程序员会使用一些调试工具,以便高效地找出软件中存在的错误。而在逆向分析领域,分析者也会利用调试工具来分析软件的行为并验证分析结果。由于操作系统提供了完善的调试接口,所以通过各类调试工具可以非常方便灵活地观察和控制目标软件。在使用调试工具分析程序的过程中,程序会按调试者的意愿,以指令为单位执行。调试者可以随时中断目标的指令流程,以观察相关计算结果和当前设备状况,也可以随时执行程序的后续指令。像这样使用调试工具加载程序并一边运行一边分析的过程,我们称之为动态分析。
对于有源代码的程序,我们使用Visual Studio 2019进行调试,它可以将C++源码反汇编;对于无源码的程序,我们使用OllyDbg进行调试分析,它的调试功能十分强大。Visual Studio 2019的调试功能相对简单,同时有源码作对照,故不过多讲解。OllyDbg的默认功能界面如图1-20所示。
图1-20 OllyDbg的默认功能界面
图1-20中的标号说明如下。
1:汇编代码对应的地址窗口。
2:汇编代码对应的十六进制机器码窗口。
3:反汇编窗口。
4:反汇编代码对应的注释信息窗口。
5:寄存器信息窗口。
6:当前执行到的反汇编代码的信息窗口。
7:数据窗口,数据所在的内存地址。
8:数据窗口,数据的十六进制编码信息。
9:数据窗口,数据对应的ASCII码信息。
10:栈窗口,栈地址。
11:栈窗口,栈地址中存放的数据。
12:栈窗口,对应的说明信息。
熟悉了各窗口视图的功能之后,我们来进一步了解OllyDbg的操作方法。首先介绍一下OllyDbg的快捷键。掌握各个快捷键,可以提高分析效率。OllyDbg的基本快捷键及其功能如表1-1所示。
表1-1 OllyDbg的基本快捷键及其功能
通过实际操作演练,我们可以进一步熟悉OllyDbg。调试一个简单的“Hello world”
程序,将对话框标题“Hello world”修改为“I Like C++”,步骤如下。
1. 加载可执行程序
选择调试程序的方式有以下3种。
- 使用快捷键F3选择要调试程序的路径。
- 在菜单选项中(“文件”→“打开”)选择调试程序路径。
- 将OllyDbg加入系统资源管理菜单中,鼠标右键“打开”。
依次选择OllyDbg菜单“选项”→“添加到浏览器”→“添加OllyDbg到系统资源管理菜单”→“完成”,即可将OllyDbg加入系统资源管理菜单中,如图1-21所示。
图1-21 初识OllyDbg
在图1-21中,代码运行到地址0x00401000处,对应反汇编指令PUSH 0,此汇编指令对应的机器码为6A 00(汇编指令对应的机器码可查询Intel的指令帮助手册)。在OllyDbg的注释窗口中,已经分析出此汇编指令的含义:OllyDbg根据CALL指令的地址,得知这个函数的首地址为API MessageBoxA的首地址,进而分析出对应的参数个数和参数功能。
2. 查看API MessageBoxA各参数的功能
查看MSDN文档,获取MessageBoxA各参数的功能,找到弹出对话框的标题参数(PUSH Hello.00403000),此参数保存了字符串“Hello world”的首地址。
3. 定位数据
选中数据窗口,使用快捷键Ctrl+G,弹出数据跟随窗口。输入查询地址0x00403000,单击“确定”快速定位到该地址处。
4. 修改数据
找到要修改数据的地址对应的HEX数据,在图1-22中,地址0x00403000对应的十六进制数据为0x48。双击HEX数据窗口中“48”处,弹出对应的编辑数据对话框,如图1-23所示。
图1-22 初识数据窗口
图1-23 数据编辑对话框
去掉“保持大小”的勾选,可向后修改数据。在ASCII文本编辑框中,输入“I Like C++”,由于C\C++中字符串以00结尾,需要将字符串最末尾的数据修改为00。选择十六进制编码文本框,在末尾处插入00。单击“确定”按钮,完成对字符串的修改。
5. 调试程序
使用快捷键F8单步调试运行,连续按4次F8键,单步运行4条汇编指令,观察栈窗口变化,如图1-24所示。函数MessageBoxA所需参数都已被保存在栈中。按快捷键F7可跟进到函数MessageBoxA的实现代码中,这个API为一个间接调用,须再次按快捷键F7,程序运行到函数MessageBoxA的首地址处。MessageBoxA的实现代码较多,不适合初学者学习,使用快捷键Alt+F9返回到用户代码处,MessageBoxA运行结束,弹出运行结果对话框,查看是否修改成功。
图1-24 栈窗口信息
如图1-25所示,标题已经修改成功。到此,OllyDbg的初识之旅就结束了。本节我们初步认识了OllyDbg,在后面的章节中,还会进一步介绍它的强大功能。
图1-25 运行结果