在逆向分析中,调试工具可以说是非常重要的。调试器可以跟踪进程的运行时状态,在逆向工程中被称为动态分析工具。动态调试可以用在很多方面,比如漏洞挖掘、游戏外挂分析、软件加解密等。本文介绍应用层下最流行的调试工具OllyDbg。OllyDbg,简称OD,是一款运行在应用层(或R3)的可视化界面的32位反汇编和逆向调试分析工具。OD是所有逆向分析师离不开的工具。它的流行是由于操作简单、参考文档丰富、支持插件功能。1.OD版本OD的主流版本是1.10,但也有很多修改版本。OD虽然是一个动态调试工具,但是由于其强大的功能,在软件破解中经常被很多人使用,很多软件作者的心血都白费了。为了防止软件被OD调试,软件的作者加入了很多反调试功能来防止OD调试,以保护他的软件不被破解;而破解者为了继续使用OD破解软件,不得不修改OD,从而达到反反调试的效果。调试、反调试、反反调试对于刚接触调试的爱好者来说很容易混淆。简单来说,反调试就是防止使用OD进行调试,反反调试就是突破反调试继续调试。OD之所以有很多修改版本,是为了更好的突破软件的反调试。从OD众多修改版本的存在可以看出,软件保护和软件破解一直在“攻”和“防”上有所突破。所以从学习的角度来说,还是建议选择原版的OD来使用。在使用的过程中,除了掌握大量的调试技巧外,还会学习到很多反调试的技巧,从而掌握反反调试的技巧。但是在实际应用中,可以直接使用修改后的OD版本来防止OD被软件反调试,从而提高逆向调试分析的速度。2.OD主界面OD发布版为压缩包,解压后即可运行。运行OD解压目录下的ollydbg.exe程序,会出现一个看似功能强大的软件窗口,分布合理,菜单布局合理,可以输入命令,如图1所示。图1OD调试主界面图1,工作区可以分为6个部分,从左到右,从上到下,这6个部分分别是反汇编窗口、信息窗口、数据窗口、寄存器窗口、堆栈窗口和命令窗口。下面分别介绍各个窗口的用法。反汇编窗口:该窗口用于显示反汇编代码。调试分析程序主要在该窗口中进行,也是调试分析的主要工作窗口。信息窗口:该窗口用于显示与反汇编窗口上下文相关的内存或寄存器信息。数据窗口:该窗口用于以各种格式显示内存中的内容,可以使用的格式包括十六进制、文本、短格式、长格式、浮点数和反汇编等。寄存器窗口:该窗口用于显示各个寄存器的内容,包括前面介绍的通用寄存器、段寄存器、标志寄存器、浮点寄存器。另外,还可以选择显示MMX寄存器,3DNow!寄存器和调试寄存器。堆栈窗口:该窗口用于显示堆栈的内容,即ESP寄存器和EBP寄存器指向的地址部分。命令窗口:该窗口用于输入命令,以简化调试和分析工作。该窗口不是基本窗口,而是OD插件提供的功能。几乎所有的OD用户都会用到这个控件,所以一定要掌握这个窗口的使用。3.OD功能窗口OD中的主窗口是OD中众多窗口之一。主要用于显示CPU相关的内容。主窗口也称为CPU窗口。除了CPU窗口外,OD还有其他窗口,功能非常多。您可以使用菜单栏中的“查看(V)”项来打开这些窗口,也可以使用工具栏中的“窗口切换”工具来选择使用不同的功能窗口。工具栏的“窗口切换”如图2所示。图2“窗口切换”选项工具栏(1)“内存”窗口“内存”窗口显示程序各模块段在内存中的地址,如图如图3所示。图3“Memory”窗口在内存窗口中,可以用鼠标选择一段模块,然后按F2键设置断点。一旦代码访问到这个段,OD就会打断相应的断点。(2)“CallStack”窗口“CallStack”用于显示当前代码所属函数的调用关系。“CallStack”窗口如图4所示。图4“CallStack”窗口从图4第一行可以看出,当前代码所在函数的首地址是010040BA地址在NOTEPAD模块,调用函数的位置来自NOTEPAD.010045CA,和NOTEPAD.010045CA函数所在函数的首地址需要从第3行查,这个函数的首地址是NOTEPAD.01004565.调用关系模拟如下:Func01004565(){...010045CA:call010040BA}Func010040BA(){}每个调用关系之间的arg1和Arg2是调用方传递给被调用方的函数参数。调用栈的结构类似于栈的结构,从高位向低位延伸。调用栈窗口中的函数越靠下,栈地址越高,函数之间的调用关系也是从下到上。(3)“Breakpoint”窗口“Breakpoint”窗口显示了所有设置的软断点,如图5所示。图5“Breakpoint”窗口从图5可以看出已经设置了3个软断点,地址为设置的断点可以从图5第一列看,如果断点设置在API函数的首地址,地址后面会给出API函数的名称。如果不想使用设置的断点,可以删除;如果暂时不想使用,可以使用空格键切换是否激活。4、常用的断点设置方法在OD中,常用的断点设置方法有命令法、菜单法和快捷键法。无论采用哪种方式设置断点,实际上都存在三种断点,分别是INT3断点、内存断点和硬件断点。(1)通过命令设置断点可以通过命令设置硬件断点和INT3断点。设置INT3断点的方法比较简单,直接在命令窗口中输入“bp断点地址”或“bpAPI函数名”即可。设置完成后,可以通过断点窗口查看设置的断点。关于硬件断点,这里有4条命令,如下。①hr:硬件读断点,如hr断点地址。②hw:硬件写断点,如hw断点地址。③he:硬件执行断点,如he断点地址。④hd:删除硬件断点,如hd断点地址。硬件断点最多只能设置4个,跟CPU有关。只有4个调试寄存器可以用来设置断点,分别是DR0、DR1、DR2和DR3。通过命令设置硬件断点后,可以在菜单的“调试(D)”项中打开“硬件断点(H)”,查看设置的硬件断点,如图6所示。6硬件断点示意图(2)通过快捷键设置断点通过快捷键设置断点的方法非常简单。在需要设置断点的代码行按F2键设置INT3断点。在INT3断点处再次按F2键取消设置的断点。除了在代码处通过F2键设置断点外,还可以在内存窗口的指定段按F2键设置断点。这里设置的断点是一次性断点,即断点触发后自动删除设置的断点。(3)通过菜单设置断点通过菜单设置断点的方法比较简单,如图7所示。图7通过菜单设置断点在菜单中可以看到设置内存断点的选项,分别是“内存访问”和“内存写入”。内存断点通常在数据部分设置断点。如果想找出哪段代码处理了某段内存中的数据,可以通过设置内存断点轻松找到。对于动态调试分析,合理设置断点非常重要。在OD中,有很多设置断点的方法和技巧,请大家在使用和学习的过程中慢慢学习和摸索。5、OD调试快捷键①F8键:一步一步,依次执行每段代码,遇到CALL不输入,遇到REP不重复。②F7键:逐步进入,依次执行各个代码,遇到CALL就进入,遇到REP就重复。③F4键:执行到函数的代码(前提是选中的代码必须在程序运行的过程中执行)。④F9键:运行程序,直到遇到断点。⑤Ctrl+F9组合键:返回调用处(Win7及以上操作系统下,该快捷键失效)。⑥Alt+F9组合键:执行到函数结束。
