2.1OllyDbg调试器
OllyDbg界面
C窗口是最重要的窗口,绝大部分都要在这个窗口进行,有五个面板窗口,分别是反汇编面板,寄存器面板,信息面板,数据面板和栈面板。
1.反汇编面板窗口
从左到右分别是地址,十六进制的机器码,反汇编代码和注释。
2.信息面板窗口
在进行动态分析时,这个面板会显示各种寄存器的值,API函数调用提示和跳转信息。
3.数据面板窗口
以十六进制和字符方式显示文件存放内存中的数据。
4.寄存器面板窗口
显示各种寄存器的值。
5.栈面板窗口
显示栈的内容,即ESP指向的内容。
OllyDbg的配置
1.界面设置
可以设置UDD文件和插件的路径,并且设置外观。
UDD文件是OllyDbg的工程文件,用于保存当前调试的一些状态,以便于下次调试使用。插件用于扩充功能。
2.调试设置
可以使OllyDbg忽略或者不忽略某些异常,可以全部选择。
3.加载符号文件
它使用符号库让OllyDbg以函数名的形式显示DLL的函数。例如,MFC42.DLL以序号的形式输出函数,这时在OllyDbg中显示的序号,如果让其加载MFC42.DLL,将以函数名的形式输出它。
基本操作
1.准备工作
在Windows程序当中需要调用许多的API函数,只要了解哪些API函数被调用,就可以很容易找到一些线索。因此在逆向分析的时候选择以什么API函数为入口就十分重要。
2.加载目标文件进行调试
为了使ollydbg可以中断在程序的入口处,加载程序前要做相应的设置。比如在WinMain地方中断,模块的加载与卸载,线程的操作等等。
有些程序会使用特别的修改方式使调试的时候不停在入口,以达到反调试的目的。
3.单步追踪
调试器最基本的一个功能就是动态跟踪。
需要注意好单步步进和单步步过的区别:步进进入call,步过不进入call。
4.设置断点
这是调试器的一个相当重要的功能,可以让程序中断在指定的地方,从而进行分析。按F2将光标处设置一个断点,再次点击就可以取消断点。
设置断点后按Alt+B的快捷键,打开断点窗口,可以看到断点的明细。”Always“断点处于激活状态,”Disable“表示断点停用。
5.调试分析
可以通过不停地下一步“F8”,然后看数据和栈库里面的信息调试,进行分析。
6.爆破法
通过序列号的判断核心。例如如下的这个过程。
跳过这个判断的过程,通过以下的方式就可以跳过。
这个方法成为爆破法。
7.算法分析
这个方法是推荐我们在程序的过程当中把算法给分析明白。知道汇编代码调用了什么函数就可以进入它,通过观察栈的情况来一步一步监视数据的变化,可以找到需要的数据了。
常用断点
1.INT3断点
这是一个十分常用的断点,原理是通过将光标所指向的内容用调试器替换成INT3指令,使之可以中断在那个地方。(但在Ollydbg里面看的时候该是什么指令还是什么指令)
INT3指令因为他的机器码也是CC,所以也被称为CC代码。当调试到执行INT3指令的时候会跳出一个异常,这个异常是程序中断在断点处,之后将该处的指令从INT3变回原来的指令。
可以设置无数个INT3断点,缺点就是改变了机器码,很容易被程序检测到。例如有些程序会检测API的首地址是不是0xCC来防止API被下断。
躲过检测的方法就是将断点设置在函数内部或者末尾,例如将断点设置在函数入口的下一行。
2.硬件断点
硬件断点和DRx调试寄存器有关。
DRx调试寄存器共8个。
DR0~DR3调试地址寄存器来保存需要监视的地址。
DR4~DR5保留,未公开。
DR6调试寄存器组状态寄存器。
DR7调试寄存器组控制寄存器。
硬件断点原理就是使用DR0123设置地址并使用DR7设定状态,最多设置4个断点。硬件执行断点和CC断点一致,但不会改变机器码所以更难检测。设置方法是在指定的代码行右键,在Breakpoint中Hardware,on execution命令。假使我们在4013AAh位置设置一个硬件断点,那么Ollydbg就会让DR0~DR3中一个设置为004013AA,然后在DR7中设置相应的控制位。当调试进程到004013AAh的地方CPU就会向Ollydbg发出异常信息,中断。
硬件断点优点就是速度快,不容易被程序发现,缺点是只能设置4个断点。
3.内存断点
原理是对所设的地址赋予不可访问/不可写属性,这样当访问/写入的时候就会产生异常。OllyDbg会截获异常然后比较这个地址是不是断点地址,如果是就中断,让用户继续操作。因此每次异常都需要比较是否应该中断,这样就会导致运行速度变慢。OllyDbg也只能设定一个内存断点。
需要注意的是,硬件访问/写入断点是在出发硬件断点的下一条指令下断,内存断点是在触发断点的指令处下断。
这个方法也不用修改原始代码,不会像INT3那样被检测。
4.内存访问一次性断点
这个方法是对一个段进行设置一个一次性断点,当所在段被读取他就会中断。如果想捕捉调用或返回某个模块时候,这个断点就非常有用。进行一次中断后,断点就会被删除。
5.消息断点
Windows是由消息驱动的,如果调试没有合适的断点就可以使用消息断点。当某个特定窗口接收到某个特定消息后,消息断点就会使程序中断。INT3断点在程序启动前设置,消息断点只有在窗口被创建的时候才能设置并拦截消息。
当用户单击一个按钮,移动光标或者向文本框输入文字的时候,一条消息就会发送给当前窗体。所有发送的消息都有4个参数。分别涉及一个窗口句柄(hwnd),一个消息编号(msg)和2个32位长的参数。Windows通过句柄来识别它所代表的对象。例如,在单击某个按钮的时候,Windows通过句柄来判断单机了哪一个按钮,然后发送相应的消息来通知程序。
例如下面的TraceMe,运行后这个窗口列出了所有属于被调试程序窗口及窗口相关的重要参数,例如按钮,相应的ID以及句柄。我们现在要对Check按钮下断点,即单击该按钮的时候程序中断。在check条目上单击右键。
回到TraceMe界面,单击check按钮,松开鼠标时,程序就会中断在Windows系统代码中,代码如下。
消息已经捕捉到,但仍然处于系统底层代码当中,不属于TraceMe主程序的代码,这是企图用alt+f9来返回程序代码领空是不行的。
主程序在00401000h开头的.text区块里。从系统代码回到程序代码段的时候就是.text区块代码执行的时候,因此对.texr也下一个内存断点就可以返回应用程序的代码领空。
这段代码是一个消息循环,不停处理TraceMe主界面各种消息,此时可能不会直接处理按钮事件。如果单步追踪,就会进入系统代码。在系统代码里,按Alt+m快捷键打开内存窗口,对.text区块进行内存访问的点点,在按f9执行内存断点就可以返回代码段,重复这个过程就可以达到处理按钮的效果了。
6.条件断点
当我们希望满足一些条件才会中断时使用的断点就是条件断点。OllyDbg的条件断点可以按寄存器,存储器,消息等设断。本质上是一个带有条件表达式的普通INT3断点。
7.条件记录断点
条件记录断点除了具有条件断点的作用,还能记录断点处函数表达式或参数的值。也可以设置通过断点的次数,每次符合暂停条件的时候,计数器值就会减一。
插件
支持插件就意味着他的功能扩展性很好,可以按照自己的需要进行相关调试功能的拓展。
Run Trace
runtrace(run跟踪)相当于一个记录器,将调试程序执行过的指令保存下来,以便了解以前发生的事情。这个功能将地址,寄存器,消息的内容记录到runtrace的缓冲区当中去。
在运行使用runtrace之前,要将缓冲区设置得尽量大一些,要不然会导致缓冲区溢出。
Hit Trace
hittrace也是一个记录器,用来使调试者辨别哪一部分代码被执行了哪一部分没有。
调试符号
调试符号是被调试的程序的二进制信息与源程序信息之间的桥梁。简单来讲就是编译器将源文件那些晦涩难懂的代码编译为可执行程序过程中,为了能支持调试而摘录的调试信息,这些东西包括变量,类型,函数名,源代码等等。
1.符号格式
符号表的作用是将十六进制转化成为源文件代码行,函数名以及变量名。
2.创建调试文件
进行源代码级别的调试首要的条件就是生成的文件中包含调试信息。调试信息包括程序中每个变量的类型和可执行文件中的地址映射及源代码的行号。(进行调试过程中有一个将源代码映射出来的过程)。