脱壳破解之详解ESP定律原理及作用

爱必应

前言:相信只要是了解过脱壳的人就一定知道ESP定律,ESP定律是脱壳破解中常用的方法之一,因其简单,好用,而成为新手最喜欢的方法之一,可你知道它的原理么?今天我给大家说说这个ESP定律的原理及作用(本文只适用于有一点脱壳基础的人群)。

1.ESP定律原理:
所谓的ESP定律其实就是堆栈平衡原理。根据堆栈平衡原理,便可以通过内存断点,在入口点处,断在与入口点相对应的出口点处,而程序的出口点处一般就有个跳转指向OEP。简单地讲,就是根据ESP定律运用的堆栈平衡原理,在程序入口点处(一般是PUSHAD)下一行处下内存断点迅速定位到与入口点相对应的出口点(一般是POPAD),从而到达OEP。这个方法适用于绝大部分压缩壳及少部分加密壳。下面就通过实例来讲解。

2.示例部分:
本次用的是具有代表性,upx旳壳,我已经打包成了附件,就在文末。载入OD,可以很明显可看到一个PUSHAD,这就是程序的入口点。

脱壳破解之详解ESP定律原理及作用-图1

接下来我们F8单步,到了关键句的下一行,注意观察寄存器里的数据,此时显示为
EAX 757C33B8 kernel32.BaseThreadInitThunk
ECX 00000000
EDX 0040E8C0 UPX.<ModuleEntryPoint>
EBX 7EFDE000  
ESP 0018FF6C
EBP 0018FF94
ESI 00000000
EDI 00000000
注意观察寄存器数值的变化, 我们下内存访问断点,F9运行。

脱壳破解之详解ESP定律原理及作用-图2

此时od停在了0040EA0F – E9 B826FFFF  jmp UPX.004010CC,玩破解的人都知道这是要到OEP了。观察寄存器数值,可以看到
EAX 757C33B8 kernel32.BaseThreadInitThunk
ECX 00000000
EDX 0040E8C0 UPX.<ModuleEntryPoint>
EBX 7EFDE000
ESP 0018FF8C
EBP 0018FF94
ESI 00000000
EDI 00000000
是不是跟上面的数值一模一样,接下来我们再F8单步,到达了OEP,注意观察寄存器数值

脱壳破解之详解ESP定律原理及作用-图3

此时寄存器数值跟上面两处一模一样,仍是
EAX 757C33B8 kernel32.BaseThreadInitThunk
ECX 00000000
EDX 0040E8C0 UPX.<ModuleEntryPoint>
EBX 7EFDE000
ESP 0018FF8C
EBP 0018FF94
ESI 00000000
EDI 00000000
为什么会这样呢,让我们再次回到程序的入口点和出口点看看

入口点

0040E8C0 >  60          pushad // ESP=0018FF8C
0040E8C1    BE 15B04000    mov esi,UPX.0040B015 // ESP=0018FF6C

出口点

脱壳破解之详解ESP定律原理及作用-图4

0040EA0E    61         popad // ESP=0018FF6C
0040EA0F  – E9 B826FFFF     jmp UPX.004010CC // ESP=0018FF8C
从这得出一个结论,程序入口点将代码暂时储存到寄存器中器中,当程序运行到出口点时将寄存器中的代码取出运行,这就使得入口点处的的寄存器数据与出口点处的的寄存器数据相同,这就是堆栈平衡原理,也是ESP定律原理。

总结:ESP定律原理是堆栈平衡原理,适用于几乎全部的压缩壳,部分加密壳。但不同的壳下内存断点的地方也不一样,需要多多积累经验,并随机应变,切记不可死板

文件下载地址暂时未公布,需要的朋友请在下方留言,看到后会第一时间更新下载地址。

声明:本站所有资源均由网友分享,如有侵权内容,请在文章下方留言,本站会立即处理。

原文链接:,转发请注明来源!

发表评论