admin 发表于 2020-4-13 17:30:28

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

前言:相信只要是了解过脱壳的人就一定知道ESP定律,ESP定律是脱壳破解中常用的方法之一,因其简单,好用,而成为新手最喜欢的方法之一,可你知道它的原理么?今天我给大家说说这个ESP定律的原理及作用(本文只适用于有一点脱壳基础的人群)。1.ESP定律原理:
所谓的ESP定律其实就是堆栈平衡原理。根据堆栈平衡原理,便可以通过内存断点,在入口点处,断在与入口点相对应的出口点处,而程序的出口点处一般就有个跳转指向OEP。简单地讲,就是根据ESP定律运用的堆栈平衡原理,在程序入口点处(一般是PUSHAD)下一行处下内存断点迅速定位到与入口点相对应的出口点(一般是POPAD),从而到达OEP。这个方法适用于绝大部分压缩壳及少部分加密壳。下面就通过实例来讲解。2.示例部分:
本次用的是具有代表性,upx旳壳,我已经打包成了附件,就在文末。载入OD,可以很明显可看到一个PUSHAD,这就是程序的入口点。https://i1.wp.com/attach.52pojie.cn/forum/201908/16/210700btour55pth2u2ewr.png

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

此时od停在了0040EA0F – E9 B826FFFFjmp 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,注意观察寄存器数值https://i1.wp.com/attach.52pojie.cn/forum/201908/16/213018m6647snjhj211cs3.png

此时寄存器数值跟上面两处一模一样,仍是
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出口点https://i1.wp.com/attach.52pojie.cn/forum/201908/16/214407ip7vpzb1e5cqennp.png

0040EA0E    61         popad // ESP=0018FF6C
0040EA0F– E9 B826FFFF   jmp UPX.004010CC // ESP=0018FF8C
从这得出一个结论,程序入口点将代码暂时储存到寄存器中器中,当程序运行到出口点时将寄存器中的代码取出运行,这就使得入口点处的的寄存器数据与出口点处的的寄存器数据相同,这就是堆栈平衡原理,也是ESP定律原理。总结:ESP定律原理是堆栈平衡原理,适用于几乎全部的压缩壳,部分加密壳。但不同的壳下内存断点的地方也不一样,需要多多积累经验,并随机应变,切记不可死板
页: [1]
查看完整版本: 脱壳破解之详解ESP定律原理及作用