第一部分 准备工作

第1章 熟悉工作环境和相关工具

1.1 调试工具Microsoft Visual C++6.0和OllyDBG

在软件的开发过程中,程序员会使用一些调试工具,以便高效地找出软件中存在的错误。而在逆向分析领域,分析者也会利用相关的调试工具来分析软件的行为并验证分析结果。由于操作系统提供了完善的调试接口,所以利用各类调试工具可以非常方便灵活地观察和控制目标软件。在使用调试工具分析程序的过程中,程序会按调试者的意愿以指令为单位执行。调试者可以随时中断目标的指令流程,以观察相关计算的结果和当前的设备情况,也可以随时继续执行程序的后续指令。像这样使用调试工具加载程序并一边运行一边分析的过程,我们称之为“动态分析”。

本书中使用了两款调试工具:Microsoft Visual C++6.0和OllyDBG。对于调试版(Debug编译选项组),我们使用Microsoft Visual C++6.0进行调试,它可以将C++源码反汇编,方便学习;对于发布版(Release编译选项组),我们使用OllyDBG进行调试分析,它的调试功能十分强大。Microsoft Visual C++6.0的调试功能相对简单,同时有源码做对照,故不过多讲解。OllyDBG的默认功能界面如图1-1所示。

图 1-1 OllyDBG的默认功能界面

图1-1中的标号说明如下:

1:汇编代码对应的地址窗口

2:汇编代码对应的十六进制机器码窗口

3:反汇编窗口

4:反汇编代码对应的注释信息窗口

5:寄存器信息窗口

6:当前执行到的反汇编代码的信息窗口

7:数据窗口—数据所在的内存地址

8:数据窗口—数据的十六进制编码信息

9:数据窗口—数据对应的ASCII码信息

10:栈窗口—栈地址

11:栈窗口—栈地址中存放的数据

12:栈窗口—对应的说明信息

熟悉了各窗口视图的功能之后,我们来更深一步了解OllyDBG的操作方法。首先介绍一下OllyDBG的快捷键,掌握各个快捷键的使用,可以提高分析效率。OllyDBG的基本快捷键及其功能如表1-1所示。

通过实际操作演练,我们可以进一步熟悉OllyDBG:调试一个简单的“Hello world”程序,将对话框标题“Hello world”修改为“I Like C++”,步骤如下。

(1)加载可执行程序(如图1-2所示)

选择一个调试程序,有多种方案:

使用快捷键F3选择所要调试程序的路径

在菜单选项中(文件\打开)选择调试程序路径

将OllyDBG加入系统资源管理菜单中,右击选择“打开”

(依次选择OllyDBG菜单\选项\添加到浏览器\添加OllyDBG到系统资源管理菜单\完成,即可将OllyDBG加入系统资源管理菜单中。)

图 1-2 初识OllyDBG

在图1-2中,代码运行到地址0x00401000处,对应反汇编指令PUSH 0,此汇编指令对应的机器码为6A 00(汇编指令对应的机器码可查询Intel的指令帮助手册)。在OllyDBG的注释窗口中,已经分析出此汇编指令的含义—OllyDBG根据CALL指令的地址得知这个函数的首地址为API MessageBoxA的首地址,进而分析出对应的参数个数和参数功能。

(2)查看API MessageBoxA各参数的功能

查看MSDN文档,获取MessageBoxA各参数的功能,找到弹出对话框的标题参数(PUSH Hello.00403000),此参数保存了字符串“Hello world”的首地址。

(3)定位数据(如图1-3所示)

选中数据窗口(如图1-1所示),使用快捷键Ctrl+G,弹出数据跟随窗口。输入查询地址0x00403000,单击“确定”按钮快速定位到该地址处。

图 1-3 初识数据窗口

(4)修改数据(如图1-4所示)

找到要修改数据的地址所对应的HEX数据,在图1-3中,地址0x00403000对应的十六进制数据为0x48。双击HEX数据窗口中“48”处,弹出对应的编辑数据对话框,如图1-4所示。去掉对“保持大小”的勾选,可向后修改数据。在ASCII文本编辑框中,输入“I Like C++”,由于C\C++中字符串以00结尾,需要将字符串最末尾的数据修改为00。选择十六进制编码文本框,在最末尾处插入00。单击“确定”按钮,完成对字符串的修改。

(5)调试程序

使用快捷键F8单步调试运行,连续按4次F8键,单步运行4条汇编指令,观察栈窗口变化,如图1-5所示。函数MessageBoxA所需参数都已被保存在栈中。按快捷键F7可跟进到函数MessageBoxA的实现代码中,这个API为一个间接调用,需再次按快捷键F7,程序运行到函数MessageBoxA的首地址处。MessageBoxA的实现代码较多,不适合初学者学习,使用快捷键Alt+F9返回到用户代码处,MessageBoxA运行结束,弹出运行结果对话框,查看是否修改成功,如图1-6所示。

图 1-4 数据编辑对话框

图 1-5 栈窗口信息

图 1-6 运行结果

如图1-6所示,标题已经修改成功。到此,OllyDBG的初识之旅就结束了。通过本节,大家初步认识了OllyDBG,在以后的章节中,还会进一步讲解OllyDBG的强大功能。