跳转至

最后一次异常法

最后一次异常法的原理是, 程序在自解压或自解密过程中, 可能会触发无数次的异常. 如果能定位到最后一次程序异常的位置, 可能就会很接近自动脱壳完成位置. 现在最后一次异常法脱壳可以利用Ollydbg的异常计数器插件, 先记录异常数目, 然后重新载入, 自动停在最后一次异常处.

要点

  1. 点击选项->调试选项—>异常, 把里面的√全部去掉! 按下CTRL+F2重载下程序
  2. 开始程序就是一个跳转, 在这里我们按SHIFT+F9, 直到程序运行, 记下从开始按SHIFT+F9到程序运行的次数m!
  3. CTRL+F2重载程序, 按SHIFT+F9(这次按的次数为程序运行的次数m-1次)
  4. 在OD的右下角我们看见有一个"SE 句柄", 这时我们按CTRL+G, 输入SE 句柄前的地址!
  5. 按F2下断点!然后按SHIFT+F9来到断点处, F8单步跟踪

示例

示例程序可以点击此处下载: 5_last_exception.zip

OD载入程序, 在菜单选项->调试设置->异常标签页中取消勾选所有的忽略异常, 然后重载程序.

exception_01.png

我们按下Shift+F9, 记录按了多少次, 程序正常运行. 我们要得到的是倒数第二次按下是按了多少次. 在本例中

  • shift+F9一次, 到了0040CCD2的位置
  • shift+F9两次, 程序正常运行

那么我们重载程序, 只需按下1次(2-1=1)Shift+F9, 来到0040CCD2的位置, 观察堆栈窗口, 这里有一个SE处理程序: 0040CCD7

exception_02.png

我们在CPU窗口(汇编指令), 按Ctrl+G, 输入0040CCD7, 然后在此处按下F2. 也就是在0040CCD7处设置断点, 然后按下Shift+F9运行, 触发断点.

exception_03.png

触发断点后, 来单步跟踪. 向下都是一些循环和跳转, 我们使用F4跳过循环. 最后到达如下位置

exception_04.png

显然在最后的mov ebp, 0041010CC; jmp ebp是在跳转向OEP, 我们跳转过去如下图所示:

exception_05.png

显然, 我们幸运地来到了OEP处.