Esp定律脱壳

ESP定律脱壳

原理

ESP定律又称堆栈平衡定律,是应用频率最高的脱壳方法之一

实践

首先对原程序查壳,为ASPack32位加壳

下面为其脱壳,首先使用od打开其软件,发现pushad指令,则判断出程序已经加壳

接着运行程序,进入调用函数指令。这里可以看到esp为0012FFC4

右键点击在数据窗口跟随

在数据窗口中右键点击选择硬件断点

对程序下硬件断点后,点击f9运行程序。运行之后来到了跳转处

随后一步一步的运行程序,直到retn汇编指令,加壳程序结束出栈,下面就是进入程序入口了,如下

这里选中该地址单击右键选中用OllyDump脱壳调试进程,然后进行脱壳

重建输入表,脱壳保存文件

接着对脱壳保存的文件进行检查,这里显示未脱壳

运行脱壳程序成功

分析

首先,壳实质上是一个子程序,它在程序运行时首先取得控制权并对程序进行压缩。 同时隐藏程序真正的OEP。大多数病毒就是基于此原理,从而防止被杀毒软件扫描。

我们来看看这个小程序寄存器的情况,下面是刚运行程序的时候

1
2
3
4
5
6
7
8
9
EAX 00000000
ECX 0012FFB0
EDX 7C92E4F4 ntdll.KiFastSystemCallRet
EBX 7FFDF000
ESP 0012FFA4 ASCII "P<i"
EBP 0012FFF0
ESI 0012B880
EDI 00693C50
EIP 00417002 00_aspac.00417002

下面是进入OEP时候的寄存器

1
2
3
4
5
6
7
8
9
EAX BB40E64E
ECX 0012FFB0
EDX 7C92E4F4 ntdll.KiFastSystemCallRet
EBX 7FFDF000
ESP 0012FFA4
EBP 0012FFBC
ESI 0012B880
EDI 00693C50
EIP 004021FB 00_aspac.004021FB

可以看到只有EIP和EAX寄存器的数值发生了变化,并且EAX保存的是OEP的地址。

由于在程序自解密或者自解压过程中, 多数壳会先将当前寄存器状态压栈, 如使用pushad, 而在解压结束后, 会将之前的寄存器值出栈, 如使用popad. 因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发(这就是我们要下硬件断点的原因),然后在程序当前位置, 只需要一些单步操作, 就会到达正确的OEP位置.

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2024 John Doe
  • 访问人数: | 浏览次数:

让我给大家分享喜悦吧!

微信