逆向调试

  • 逆向调试分为动态分析和静态分析

  • 动态分析类似编译器的debug过程,使用调试工具支持在程序运行过程中进行调试与随时“叫停”,以观察相关计算的结果和当前的设备情况。

  • 静态分析是相对于动态分析来说的。在实际的分析中,很多程序不便于动态分析(病毒,设备不兼容,或者仅对软件的单一模块进行分析等),这时候就可以使用静态分析来逆向调试文件。

动态分析

Ollydbg

1.基本快捷键及功能

2.CPU窗口

1.反汇编面板窗口

  • 共四列,从左到右分别是地址(Address),十六进制机器码(Hex dump),反汇编代码(Disassembly)和注释(Comment)。在最后一列注释中显示了相关API参数或运行简表。
  • 在反汇编面板窗口的列中,默认情况下双击可完成如下操作:
  • Address:显示双击行地址的相对地址,再次双击返回标准地址模式。
  • Hex dump:设置或者取消无条件断点,对应快捷键是F2。
  • Disassembly:调用汇编器,直接修改汇编代码,对应快捷键是space。
  • Comment:允许增加或编辑注释,对应快捷键是“;”。
  • 从键盘上选择多行,可按“Shift”和上下光标键或者“PgUp”/“PgDn”键实现,也可以利用右键快捷菜单命令实现。按“Ctrl”加上下光标,可逐行滚动汇编窗口

2.信息面板窗口

  • 在进行动态跟踪时,information window将显示与指令相关的各寄存器的值(比如标志寄存器),API函数调用提示和跳转提示等信息。

3.数据面板窗口

  • 数据面板窗口(Dump window)以十六进制和字符方式显示文件在内存中的数据。要显示指定内存地址的数据,可单击右键快捷菜单中的“Go to expression”命令或者快捷键“Ctrl+G”,打开地址窗口,输入地址。

4. 寄存器面板窗口

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

5.栈面板窗口

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

3.Ollydbg的配置

4. 基本操作

1.准备工作

  • 对一个程序先进行基本的分析,分析哪一个API函数被调用,可以作为突破口进行追踪(可以多写“CrackMe”小程序联系解密技术)。

2.加载目标文件进行调试

  • 值得注意的是,虽然双击右键可以修改寄存器的值,但EIP并不能如此修改,需要在反汇编窗口选择新的指令起始地址,在地址上单击右键,选择“New origin here”,即可修改EIP指向的地址。
  • 标志寄存器的值只有0或1,双击数字可以进行切换。

3.单步跟踪

  • F7:单步步入
  • F8:单步步过
  • 当想要重复单步进程可以“Ctrl+F7”/“Ctrl+F8”,这将会使程序重复执行单步指令,知道用户按下“ESC”或者遇到断点
  • Ctrl+F9:当位于某个call指令中时,想返回调用这个call指令的位置,可以“Ctrl+F9”来让Ollydbg停在第一个遇到的返回命令处。
  • 如果已经进入了系统DLL提供的API函数,可以按快捷键“Alt+F9”从系统领空返回用户领空1
  • 如果想让程序直接运行,可以使用“F9”快捷键,如果想重新调试,按“Ctrl+F2”。如果想暂停程序,按“F12”。

4.设置断点

  • 特别注意,B窗口(beak point)可以查看所有非硬件断点的断点,快捷键是“Alt+B”。
  • 其余的详见《加密与解密p20》。

5.调试分析

  • 详见《加密与解密p21》
  • 注意:关于API函数的定义,不需要记下,可以通过相关API手册或者网络查找。

6.爆破法

  • 通过屏蔽程序的某些功能或者改变程序使程序的保护方式失效的方法称为“爆破”。
  • 为了使修改一直有效,需要对磁盘文件进行修改,在Ollydbg中,选中修改后的代码,单击右键,执行“Copy to executable”—>“Selection”
  • 具体示例详见《加密与解密p24》

7.算法分析

  • 对一个程序进行爆破后,可以再对其代码进行算法分析,分析出程序的逆算法,写出注册机。

5.常用断点

​ 常用的断点有INT3断点,硬件断点,内存断点,消息断点等。在调试时,合理使用断点可以大大提高效率。

1.INT3断点

  • INT3断点利用x86架构下的INT3中断指令来实现,具体实现方式是将INT3指令插入需要打断点的地方,当程序运行到这条指令时,会触发一个软件中断,导致程序的执行流被转移到调试器中。
  • INT3断点可以设置无限多个,因为INT3中断指令只涉及单个字节的替换。但缺点是需要修改原程序的指令,容易被某些保护机制检测,从而触发反调试机制。
  • 为了防止API被下断,一些软件会检测API的首地址是否为0xCC(INT3指令的机器码)。用C来实现即取得API函数的地址,读取其第一个字节,判断是否等于”CC”。

2.硬件断点

硬件断点与DRx调试寄存器有关。

  • DR0~DR3:调试地址寄存器,用于保存需要监视的地址,列如设置硬件断点。

  • DR4~DR5:保留,未公开具体作用

  • DR6:调试寄存器组状态寄存器

  • DR7:调试寄存器组控制寄存器

硬件断点的原理是使用DR0~DR3设定地址,并用DR7设定状态,因此最多只能设置4个断点,但硬件断点不会将首字节修改为CC,因此更难检测。

  • 设断方式:“breakpoint”—>“Hardware,on execution”。
  • 删除方式:“Debug”—>“breakpoint”

3.内存断点

Footnotes

  1. 实际上指的是某一时刻CPU的CS:EIP指向的某段代码的所有者。