欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

熟悉 OD 查看 OD 中的数据

最编程 2024-04-20 09:20:43
...

在逆向分析中,调试工具可以说是非常重要的。调试器能够跟踪一个进程的运行时状态,在逆向分析中称为动态分析工具。动态调试会用在很多方面,比如漏洞的挖掘、游戏外挂的 分析、软件加密解密等方面。本节介绍应用层下最流行的调试工具OllyDbg。 OllyDbg简称OD,是一款具有可视化界面的运行在应用层的32位的反汇编逆向调试分析工具。OD是所有进行逆向分析人员都离不开的工具。它的流行,主要原因是操作简单、 参考文档丰富、支持插件功能等。

熟悉OD

OD的操作非常简单,但是由于逆向是一门实战性和综合性非常强的技术,因此要真正熟练掌握OD的使用却并不是容易的事,单凭操作而言看似没有太多的技术含量,但是其真 正的精髓在于配合逆向的思路来达到逆向者的目的。

1.OD的选型

为什么先介绍OD的选型,而不直接开始介绍OD的使用呢?OD的主流版本是1.10和待崛起的2.0。虽然它的主流版本是1.10,但是它仍然存在很多修改版。所谓修改版,就是由用户自己对OD进行修改而产生的,类似于病毒的免杀。OD虽然是动态调试工具,但是由 于其强大的功能经常被很多人用在软件破解等方面,导致很多作者的心血付诸东流。软件的作者为了防止软件被OD调试,加入了很多专门针对OD进行调试的反调试功能来保护自己的软件不被调试,从而不被破解;而破解者为了能够继续使用OD来破解软件,则不得不对 OD进行修改,从而达到反反调试的效果。 调试、反调试、反反调试,对于新接触调试的爱好者来说容易混淆。简单来说,反调试是阻止使用OD进行调试,而反反调试是突破反调试继续进行调试。OD的修改版本之所以很多,目的就是为了能够更好地突破软件的反调试功能。 因此,如果从学习的角度来讲,建议选择原版的OD进行使用。在使用的过程中,除了会掌握很多调试技巧外,还会学到很多反调试的技巧,从而掌握反反调试的技巧。如果在实际的应用中,则可以直接使用修改版的OD,避免OD被软件反调试,从而提高逆向调试分析的速度。

2.熟悉OD主界面

OD的发行是一个压缩包,解压即可运行使用,运行OD解压目录总的ollydbg.exe程序,就会出现一个分布恰当、有菜单有面板和能输入命令的看着很强大的软件窗口,如图1-4所示。 在图1-4的OD调试主窗口中的工作区大致可以分为6个部分,按照从左往右、从上往下,这6部分分别是反汇编窗口、信息提示窗口、数据窗口、寄存器窗口、栈窗口和命令窗 口。下面分别介绍各个窗口的用法。 反汇编窗口:该窗口用于显示反汇编代码,调试分析程序主要在这个窗口中进行,这也是进行调试分析的主要工作窗口。 信息提示窗口:该窗口用于显示与反汇编窗口中上下文环境相关的内存、寄存器或跳转来源、调用来源等信息。 数据窗口:该窗口用于以多种格式显示内存中的内容,可使用的格式有Hex、文本、短型、长型、浮点、地址和反汇编等。 寄存器窗口:该窗口用于显示各个寄存器的内容,包括前面介绍的通用寄存器、段寄存器、标志寄存器、浮点寄存器。另外,还可以在寄存器窗口中的右键菜单选择显示MMX寄 存器、3DNow!寄存器和调试寄存器等。 栈窗口:该窗口用于显示栈内容、栈帧,即ESP或EBP寄存器指向的地址部分。 命令窗口:该窗口用于输入命令来简化调试分析的工作,该窗口并非基本窗口,而是由OD的插件提供的功能,由于几乎所有的OD使用者都会使用该插件,因此有必要把它也列入主窗口中。

QQ截图20221228211041.png3.在数据窗口中查看数据 前面已经介绍,OD是一款应用层下的调试工具,它除了可以进行软件的调试以外,还可以帮助我们学习前面介绍的数据宽度、进制转换等知识,而且能够帮助我们学习汇编语言。本节主要介绍通过OD的数据窗口来观察数据宽度。 为了能够直观地观察内存中的数据,我们通过RadAsm创建一个没有资源的汇编工程,然后编写一段自己的汇编代码,代码如下:

9999.png

991010.png这10个全局变量就是我们要考察的关键。在RadAsm中进行编译连接后,直接按下Ctrl + D这个快捷键,即可在RadAsm安装时自带的OD中打开。在OD调试器中打开该程序后,观察它的数据窗口(如图1-5所示)。

QQ截图20221228211723.png在图1-5中,数据窗口一共有3列,分别是地址列、HEX数据列和ASCII列。这3个列,可以通过单击鼠标右键来改变现实方式和显示的列数。在地址00403000处开始的4个字节12 00 00 00是十六进制的12,也就是在汇编代码中定义的var1;在地址00403004处的4个字节0C 00 00 00是十六进制0C,也就是在汇编代码中定义的var2,var2变量定义的值是十进制的12,也就是十六进制的0C;在地址00403008处的4个字节03 00 00 00是十六进制的03,也就是在汇编代码中定义的var3,var3变量定义的值是2进制的11,也就是十六进制的03。 这3个变量在我们定义的时候都是以dd进行的,都是dword类型的变量,分别各占用4字节,因此在内存中,前3个变量分别是12 00 00 00、0C 00 00 00和03 00 00 00。 在地址0040300C处的值是11 22 33 44,这4个值分别是我们定义b1、b2、b3和b4 4个字节型的变量,这4变量按照内存由低到高的顺序显示分别是11、22、33、44。 在地址00403010处显示的值是66 55 88 77,这4个值分别对应我们定义的w1和w2两个字型变量,但是我们定义的变量w1的值是5566h,w2的值是7788h,在内存中为何显示的是6655和8877呢?这就是我们提到过的字节顺序的问题。我们的主机采用的是小尾方式 存储的数据,也就是数据的低位存放在内存的低地址中,数据的高位存放在内存的高地址中,因此在地址00403020中存放的是5566H的低位数据66,在地址00403021中存放的是5566H的高位数据55,在内存看时,顺序是相反的。在地址00403014处存放的是78 56 34 12,这是我们定义的最后一个变量d,它也是按照小尾方式存储在内存中的。因此,在查看内存时顺序也是反的。 OD提供了多种查看内存数据的方式,通过在数据窗口中单击鼠标右键,会弹出如图1-6所示菜单。 当在数据窗口中选择数据时,右键的菜单提供编辑、赋值、查找、断点功能,如图1-7所示。

QQ截图20221228211817.png4.通过命令窗口改变数据窗口显示方式 在图1-4中的最下方可以看到有一个输入命令的编辑框,在此处可以输入OD的相关命令以提高调试的速度。本小节就介绍如果通过命令窗口来改变数据窗口的显示方式。 在上面代码中定义变量时,使用了db、dw和dd三种类型,在OD的命令窗口中也同样可以使用者3个命令,其格式分别如表1-7所列。

QQ截图20221228211902.png

QQ截图20221228211929.png从图中可以看出不同方式下数据窗口显示的样式,但是无论使用哪种方式显示数据,地址列总是会显示在最前面的,只要我们知道数据的地址,就可以直接在命令窗口中输入显示数据的格式来查看指定内存中的数据。

推荐阅读