杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2045|回复: 0

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

[复制链接]
发表于 2020-4-13 17:30:28 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

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


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


此时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,注意观察寄存器数值


此时寄存器数值跟上面两处一模一样,仍是
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
出口点


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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-4-28 04:29 , Processed in 0.106291 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表