欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

加密与解密02--OllyDbg调试器

程序员文章站 2024-03-02 11:43:40
...

这是阅读《加密与解密》(第四版)的第二天,昨天把第一章的一些理论看了一下(我真的太笨了,理解甚微),今天进入调试篇,首先进入第二章:动态技术分析,这个章节主要讲述的是调试软件,主要分为用户模式和内核模式。(关于这两个模式的解释如下,来自《加密与解密》一书中)

用户模式调试器:指用来调试用户模式应用程序的调试器,工作在Ring3级,例如:Olly、x64dbg、Visual C++等等编译器自带的调试器。
内核模式调试器:指能调试操作系统内核的调试器,例如:WinDbg。

前言:
这篇文章主要讲解的是 OllyDbg,由于这个调试器我也是第一次接触,所以每次写关于调试器的内容时,总觉得原著真的是精妙绝伦,所以文章中很多内容都是《加密与解密》原书中的内容,从【 2.1.3、基本操作–> 2、单步跟踪】开始后面我写的就很简洁了,这部分如果想更深入了解的话,可以观看原著(被书中的详细感动到了)。这篇文章只是我对于自己第一次了解到 OllyDbg 调试器的一个小节(我知道内容不仅小,还简 >_< ),后面慢慢接触这个调试器后再慢慢进行扩充。加油!

2.1、OllyDbg调试器

在windows7以上的平台中,需要在 OllyDbg.exe的右键–> ”属性“选项 --> “兼容性”标签页 --> 勾选 “以管理员身份运行此程序” 的选项。

2.1.1、OllyDbg的界面

如图,我们刚打开OllyDbg时,会发现五个面板窗口:反汇编面板、寄存器面板、信息面板、数据面板和栈(stack)面板。

加密与解密02--OllyDbg调试器

1、反汇编面板窗口:

反汇编面板窗口(Disassembler window)显示被调试程序的汇编代码,分为四列:地址(address)、十六进制机器码(Hex dump)、反汇编代码(Disassembly)和注释(Comment)。在注释中会显示相关API参数或运行简表。

在反汇编面板窗口的列( 注意:不是列标题)中,默认情况下,双击可以完成如下操作。

  • Address列:显示被双击行地址的相对地址,再次双击返回标准地址模式。
  • Hex dump列:设置或取消无条件断点,对应的快捷键是“F2” 键。
  • Disassembly 列:调用汇编器,可直接修改汇编代码,对应的快捷键是空格键。
  • Comment 列:允许增加或编辑注释,对应的快捷键是“;”键。

从键盘上选择多行,可按“Shift” 键和上下光标键(或者“PgUp” / “PgDn"键)实现,也可利用右键快捷菜单命令实现。按“Ctrl” 键并按上下光标键,可逐行滚动汇编窗口(当数据与代码混合时,此功能非常有用)。

2、信息面板窗口

在进行动态跟踪时,信息面板窗口(information window )将显示与指令相关的各寄存器的值、API函数调用提示和跳转提示信息。

3、数据面板窗口

数据面板窗口(Dump window)以十六进制和字符方式显示文件在内存中的数据,要显示指定内存地址的数据,可单击右键 ” 转到“ ( Go to expression)–> 表达式 或按 ”Ctrl + G“ 快捷键,弹出地址窗口,输入想要查看的地址。具体如下图:

加密与解密02--OllyDbg调试器
加密与解密02--OllyDbg调试器

4、寄存器面板窗口

寄存器面板窗口(Registers window)显示CPU各寄存器的值,支持浮点、MMX和3DNow!寄存器。可以单击右键或窗口标题切换显示寄存器的方式。

5、栈(Stack)面板窗口

栈面板窗口(stack window)显示栈的内容,即ESP指向地址的内容。栈窗口非常重要,各API函数和子程序都利用它传递参数和变量等。

2.1.2 OllyDbg的配置

OllyDbg的设置项在 ”options“ 菜单里,有界面选项(Appearance)和调试选项(Debugging options)等,这些选项配置都保存在 ollydbg.ini 文件里。
加密与解密02--OllyDbg调试器

1.界面设置

单击“Options" -→“Appearance"选项,打开界面选项对话框,单击“Directories” (目录)标 签,设置UDD文件和插件的路径(为了避免出现问题,请设置成绝对路径)。如下图(UDD文件及插件路径设置)所示:
加密与解密02--OllyDbg调试器

  • UDD 文件是OllyDbg的工程文件,用于保存当前调试的一些状态,例如断点、注释等,以便下次调试时继续使用。
  • 插件用于扩充功能。路径设置正确后,将插件复制到“plugin" 目录里,相应的选项就会在OllyDbg的主菜单“Plugin” (插件)里显示出来。

OllyDbg界面的外观由“Appearance”对话框里的“Fonts” “Colours” “Code highlighting”标签页 控制,完全可以定制。

2.调试设置

单击“Options" - →“Debugging options”选项,打开调试设置选项对话框,一般保持默认设置即 可。其中,“Exceptions" (异常)选项用于设置让OllyDbg忽略或不忽略某些异常,建议全部选择。

3.加载符号文件

这个功能类似于IDA的FLIRT,使用符号库(Lib)可以让0llyDbg以函数名的形式显示DLL 中的函数。例如,MFC42.DLL是以序号的形式输出函数的,这时在OllyDbg中显示的是序号,如果 让其加载MFC42.DLL调试符号,将以函数名的形式显示相关的输出函数。单击“Debug” →“Select import libraries"选项,打开导人库窗口进行加载,如下图(加载调试符号库)所示:

加密与解密02--OllyDbg调试器

4、关联到右键快捷菜单

可以将OllyDbg关联到Windows资源管理器的右键快捷菜单里。关联后,当调试程序时,只需要在EXE或DLL文件上单击右键,就会出现“Open with 0llydbg”菜单项。要想实现关联,只需要先单击“Options” -→“Add to Explorer”选项,再单击“Add 0llyDbg to menu in W indows Explorer”按钮。

加密与解密02--OllyDbg调试器

2.1.3、基本操作

1、加载目标文件进行调试

为了让OllyDbg中断在程序的入口点,在加载程序前必须进行相应的设置。
运行OllyDbg,单 击“Options” →“Debugging options” 选项,打开调试选项配置对话框。单击"Event” 标签,设置 OllyDbg对中断入口点、模块加载/卸载、线程创建/结束等事件的处理方式,- -般只需要将断点设置 在“WinMain”处。

加密与解密02--OllyDbg调试器

设置完成后,单击"File" →“Open”选项,打开TraceMe.exe,此时0llyDbg会中断在TraceMe 的第1条指令处,调试器分析代码并等待用户的下一步操作。如下图 所示,光标停在004011E0h 处,004011E0h 就是程序的人口点( EntryPoint )。大部分程序在启动时都会停在入口点。通过一-些 特殊的修改方式,有些程序可以在启动时不停在人口点,以达到反调试的目的。下图中各部分代 码的含义如下。

  • ●虚拟地址:在一般情况下,同一程序的同一条指令在不同系统环境下此值相同。
  • ●机器码:就是CPU执行的机器代码。
  • ●汇编指令:与机器码对应的程序代码。
  • ●寄存器面板上显示了这各个寄存器当前的值,寄存器有EAX、ECX、EDX、EBX、ESP、ESI、EDI和EIP等,他们统称为32位寄存器。
    加密与解密02--OllyDbg调试器

ESP为栈指针,指向栈顶,在OllyDbg界 面右下角的栈面板上显示了栈的值。另一个重要的寄存器 是EIP,它指向当前将要执行的指令,按一下 “F7” 键将执 行一条指令,然后EIP将指向下一条将要执行的指令。
在调试时,可以双击这些寄存器,修改寄存器里的值。但是, 对EIP 寄存器,不能直接修改,需要在反汇编窗口选择新的指令起始地址,例如004013AAh, 在其上单击右键,在 弹出的快捷菜单中选择“New origin here"(此处为新的EIP ) 选项,EIP的值将变成4013AAh,程序将从这条指令开始执行。
寄存器下方显示的是标志寄存器,分别是C、P、A、Z、 S、T、D、0,它们的值只能是两个数字值一 -0和1,双 击数字可以在0和1之间切换。

2、单步跟踪

OllyDbg在 ”Debug“ 菜单里控制运行的命令,各菜单都有相应的快捷键。OllyDbg 的单步跟踪快捷键如下所示:

加密与解密02--OllyDbg调试器
”F7“ 和 ”F8“ 键的主要区别在于:若遇到 call、loop等指令,按 ”F8“ 键会路过,按 ”F7“ 键会跟进。

3、调试分析、**法、算法分析

**法:通过屏蔽程序的某些功能或改变程序流程使程序的保护方式失效的方法称为”**“。

2.1.3、常用断点

常用的断点有 INT 3 断点、硬件断点、内存断点、消息断点等。在调试时,合理使用断点能大大提高效率。

1. INT 3 指令

INT 3 指令:机器码为 0xCC,也常称为 ”CC指令“。当被调试进程执行 INT 3 指令导致一个异常时,调试器就会捕捉这个异常,从而停在断点处,然后将断点处的指令恢复成原来的指令。
使用INT 3 优点:可以设置无数个断点;缺点是:改变了原程序机器码,容易被软件检测到。
例如,为了防范API被下断,一些软件会检测API的首地址是否为0xCC (以此判断是否被下 断)。用C语言来实现这个检测,方法是取得检测函数的地址,然后读取它的第1个字节,判断它 是否等于“CC"。 下面这段代码就是对MessageBoxA函数进行的断点检测。

加密与解密02--OllyDbg调试器

2. 硬件断点
硬件断点和 DRx 调试寄存器有关。(Intel公司自80386以来,在CPU内部引入了Dr0-Dr7八个调试寄存器专门用于程序的调试工作。)

优点:速度快,在 INT 3 断点容易被发现的地方使用硬件断点会有很好的效果。
缺点:最多只能设置4个断点。

3. 内存断点
OllyDbg可以设置内存访问断点或内存写人断点,原理是对所设的地址赋予不可访问/不可写属 性,这样当访问/写人的时候就会产生异常。0llyDbg 截获异常后,比较异常地址是不是断点地址, 如果是就中断,让用户继续操作。

因为每次出现异常时都要通过比较来确定是否应该中断,所以内存断点会降低OllyDbg的执行 速度一也许 OllyDbg是考虑到执行速度才规定只能下1个内存断点吧。

程序运行时有3种状态,分别是读取、写人和执行。写人和读取的示例代码如下
加密与解密02--OllyDbg调试器
将光标移动到需要设置断点的位置,单击右键–>断点(Breakpoint)–>内存写入(Memory, on write);要清除断电也类似于这样。
加密与解密02--OllyDbg调试器

4. 内存访问一次性断点

windows 对内存使用段页式的管理方式。在 OllyDbg 里按 "Alt + M " 快捷键显示内存,可以看到许多个段,每个段都有不可访问、读、写、执行属性。如下图所示,在需要设置断断点的段上,单机右键 --> 在访问上设置断点(Set break-on-access),快捷键也是 ”F2“。

加密与解密02--OllyDbg调试器

5. 消息断点

Windows本身是由消息驱动的,如果调试时没有合适的断电,可以尝试使用消息断电,当某个特定窗口函数接受到某个特定消时,消息断点将使程序中断。
消息断点和INT 3断点区别:INT 3 断点可以在程序之前设置;消息断点只有在窗口被创建之后才能设置并拦截消息。

6. 条件断点

在调试过程中,我们经常希望断点在满足一定条件时才会中断,这类断点称为条件断点。OllyDbg 的条件断点可以按寄存器、存储器、消息等设断。条件断点是一个带有条件表达式的普通INT 3断 点。当调试器遇到这类断点时,断点将计算表达式的值,如果结果非零或者表达式有效,则断点生 效(暂停被调试程序)。条件表达式的规则描述请参考0llyDbg的帮助文档。

(1)、按寄存器条件中断
右键 --> 设置断点 -->条件。其快捷键是 “Shift + F2”, 例如:eax == 00401252

(2)、按存储器条件中断

7. 条件记录断点

条件记录断点除了具有条件断点的作用,还能记录断点处函数表达式或参数的值。也可以设置通过断点的次数,每次符合暂停条件时,计数器的值都将减1。

2.1.5、插件

我们可以设置插件所在的目录,将相应的插件复制到这个目录下,重新运行OllyDbg,就可以加载插件了。
由于OllyDbg默认只能加载32个插件,而且插件之间有可能存在冲突,建议在插件目录下仅放置常用的插件,以减少各类问题的出现。

常用插件:
(1)、命令行插件 CmdBar
单机插件(Plugins) --> 命令行(Command line) --> 命令行(Command line)
加密与解密02--OllyDbg调试器
加密与解密02--OllyDbg调试器

(2)、OllyScript插件
OllyDbg的脚本插件可以通过OllyScript脚本完成一些复杂的或重复性的操作。

2.1.6、Run trace(Run 跟踪)、Hit trace 、调试符号、加载程序、OllyDBG的常见问题

Run trace ( Run跟踪)可以把被调试程序执行过的指令保存下来,以便了解以前发生的事件。该Run trace ( Run跟踪)可以把被调试程序执行过的指令保存下来,以便了解以前发生的事件。
该功能将地址、寄存器的内容、消息等记录到Run trace 缓冲区中。在运行Run trace之前,要将缓冲.区设置得大-些,否则在执行的指令太多时会造成缓冲区溢出( 这时OllyDbg会自动丟弃旧记录)。可以在“Debugging options”窗口的“Trace" (跟踪)标签页中进行设置,

Hit trace 能够让调试者辨别哪一部分代码被执行了,哪一部分没有。OllyDbg 的实现方法相当简单:
在选中区域的每一条命令处设置-一个 INT 3 断点,当中断发生时,OllyDbg便把它去除。在使用 Hit trace时,不能在数据中设置断点,否则程序可能会崩溃。
当遇到一段跳转分支比较多的代码,需要了解程序的执行线路时,可以使用Hit trace。
选中这段代码,单击右键快捷菜单中的 “ Hit trace " → “ Add selection " 命令,将需要监视的代码选中,然后按 “ F9 ” 键让程序运行,OllyDbg就会在已被执行的指令前用不同的颜色添加标记。

相关标签: 读后感