吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 4492|回复: 26

[转载非技术] (新手疑惑)ESP定律的原理及其适用范围

  [复制链接]
薯仔Love 发表于 2015-8-17 00:30 来自手机端 | 显示全部楼层 |阅读模式

先说明哈,由于我也是小白目前正在学习中没什么技术可分享,同时,我我认为这篇帖子非常有意义,因此只能转转别人的技术来为论坛做贡献拉!!即是说,这篇非原创


本人也是一个小小小小菜鸟,本人看了Skark恒大的脱壳教程中,很多都用到ESP定律,嗯是的,“ESP定律”貌似很牛逼脱壳定律,因为是新手,什么牛毛汇编哇、堆栈哇,看着都想晕,就比葫芦画瓢学习ESP定律啦,越学越着急了,ESP定律到底是个啥毛玩意啊?什么时候该用?很难受哇,就度娘了一下其原理才豁然开朗! 提供给像我一样发毛着急的新手们!

某网站转载

一.准备知识
我们开始讨论ESP定律之前,我先给你讲解一下一些简单的汇编知识。
1.call
这个命令是访问子程序的一个汇编基本指令。也许你说,这个我早就知道了!别急请继续看完。call真正的意义是什么呢?我们可以这样来理解:


1.向堆栈中压入下一行程序的地址;
2.JMP到call的子程序地址处。
例如:
00401029.E8 DA240A00 call 004A3508
0040102E.5A           pop edx
在执行了00401029以后,程序会将0040102E压入堆栈,然后JMP到004A3508地址处!


2.RETN
与call对应的就是RETN了。对于RETN我们可以这样来理解:
1.将当前的ESP中指向的地址出栈;
2.JMP到这个地址。
这个就完成了一次调用子程序的过程。在这里关键的地方是:如果我们要返回父程序,则当我们在堆栈中进行堆栈的操作的时候,一定要保证在RETN这条指令之前,ESP指向的是我们压入栈中的地址。这也就是著名的“堆栈平衡”原理!


3.狭义ESP定律
ESP定律的原理就是“堆栈平衡”原理。
让我们来到程序的入口处看看吧!
1.这个是加了ASPACK壳的入口时各个寄存器的值!
EAX 00000000
ECX 0012FFB0
EDX 7FFE0304   //堆栈值
EBX 7FFDF000   //堆栈值
ESP 0012FFC4
EBP 0012FFF0
ESI 77F57D70 ntdll.77F57D70
EDI 77F944A8 ntdll.77F944A8
EIP 0040D000 ASPACK.<ModuleEntryPoint>
2.这个是ASPACK壳JMP到OEP后的寄存器的值!
EAX 004010CC ASPACK.004010CC
ECX 0012FFB0
EDX 7FFE0304   //堆栈值
EBX 7FFDF000   //堆栈值
ESP 0012FFC4
EBP 0012FFF0
ESI 77F57D70 ntdll.77F57D70
EDI 77F944A8 ntdll.77F944A8
EIP 004010CC ASPACK.004010CC
呵呵~是不是除了EIP不同以外,eax保存当前OEP值,其他都一模一样啊!
为什么会这样呢?我们来看看


0040D000 A>   60                pushad   //注意这里ESP=0012FFC4
0040D001      E8 00000000       call ASPACK.0040D006   //ESP=0012FFA4


PUSHAD就是把所有寄存器压栈!我们在到壳的最后看看:


0040D558      61                popad   //ESP=0012FFA4
0040D559      75 08             jnz short ASPACK.0040D563 //注意这里ESP=0012FFC4


也就是说当我们对ESP的0012FFA4下硬件访问断点之后。当程序要通过堆栈访问这些值
,从而恢复原来寄存器的值,准备跳向苦苦寻觅的OEP的时候,OD帮助我们中断下来。


小结:我们可以把壳假设为一个子程序,当壳把代码解压前和解压后,他必须要做的是遵循堆栈平衡的原理。


因为大家对ESP理解各有异同,但是,大同小异!一般理解可以为:
1、在命令行下断hr esp-4(此时的ESP就是OD载入后当前显示的值)
2、hr ESP(关键标志下一行代码所指示的ESP值(单步通过))


5.总结


现在我们可以轻松的回答一些问题了。


1.ESP定律的原理是什么?
堆栈平衡原理。


2.ESP定律的适用范围是什么?
几乎全部的压缩壳,部分加密壳。只要是在JMP到OEP后,ESP=0012FFC4的壳,理论上我们都可以使用。但是在何时下断点避开校验,何时下断OD才能断下来,这还需要多多总结和多多积累。


3.是不是只能下断12FFA4的访问断点?


当然不是,那只是ESP定律的一个体现,我们运用的是ESP定律的原理,而不应该是他的具体数值,不能说12FFA4,或者12FFC0就是ESP定律,他们只是ESP定律的一个应用罢了!


内存断点
    1、要解决的问题是:
    1.什么是内存断点?
    2.如何在寻找OEP时使用内存断点。
  
2、内存断点寻找OEP的原理


i.   首先,在OD中内存断点和普通断点(F2下断)是有本质区别的。


内存断点等效于命令bpm,他的中断要用到DR0-DR7的调试寄存器,也就是说OD通过这些DR0-DR7的调试寄存器来判断是否断下普通断点(F2下 断)等效于bpx,他是在所执行的代码的当前地址的一个字节修改为CC(int3)。当程序运行到int3的时候就会产生一个异常,而这个异常将交给OD 处理,把这个异常给EIP-1以后,就正好停在了需要的中断的地方(这个根据系统不同会不一样),同时OD在把上面的int3修改回原来的代码。
内存断点分为:内存访问断点,内存写入断点。
我们知道,在程序运行的时候会有3种基本的状态产生:读取-->写入-->执行。


004AE242    A1 00104000   mov eax,dword ptr ds:[004AE24C]   //004AE24C处的内存读取
004AE247    A3 00104000   mov dword ptr ds:[004AE24C],eax   //004AE24C处的内存写入
004AE24C    83C0 01       add eax,1                        //004AE24C处的内存执行


   1.当对004AE24C下内存访问断点的时候,可以中断在004AE242也可以中断在004AE247。
   2.当对004AE24C下内存写入断点的时候,只能中断在004AE247。
3.当执行004AE24C的时候,只能中断在004AE24C


到这里你可能不明白了,为什么内存访问断点能中断在004AE247这一句对004AE24C的写入,而且还能中断在004AE24C的执行呢?其实很简 单,我们只要仔细体会一下“内存访问”这四个字的含义遍可以知道,当我们对004AE24C进行读取的时候需要“访问”他吧,当我对004AE24C进行 写入的时候也需要“访问”他吧!!当然我们要执行内存地址004AE24C的代码的时候也是还是要“访问”他的!


   所以我们不难得出下面的结论:
   1.内存写入中断的地方,一定是也可以用内存访问中断。
   2.内存执行的地方,也可以用内存访问中断。


如果这时你认为,那么内存写入岂不是没用了。呵呵~那我要告诉你当然不是,如果你想快速的准确的定位到004AE247这一行的时候,那么他就大有作用了!


总结一下:内存断点不修改原代码,不会像普通断点那样因为修改代码被程序校验而导致中断失败;对于区段的访问只是区域大了一点,其原理和上面分析的三行代码是一样的。


   ii.如何使用内存断点来寻找OEP呢?
   要回答这个问题首先要回答这一个问题:壳是如何解压代码的?


正如我们知道的,壳如果要把原来加密或压缩的代码运行起来就必须要解压和解密原来的代码。而这一个过程我们难道不能将他看做是对代码段(code段)的写 入吗?好了,解压完毕了。我们要从壳代码的区段JMP到原来的代码段的时候,难道不正是对代码段(code段)的执行吗?


理清了上面的关系就好办了,那么如果载入OD后,我们直接对code段下内存访问断点的时候,一定会中断在壳对code段的写入的代码的上面,就像上面的 004AE247的这一行。而如果当他把code段的代码全部解压解密完毕了以后,JMP到OEP的时候,我们是不是还可以停在OEP的代码上面呢?而且 每按下F9都会中断,因为这时code段在执行中哦!


而如果你还要继续问我为什么一定要到那个地方才可以下断呢?我难道不可以一开始就下断吗?


正入我上面所说的,如果你在前面下断很可能壳对code段还没解压完毕呢,这时如果你不停的按F9,你将会看到OD的下方不断的在提示你,“对 401000写入中断”“对401002写入中断”“对401004写入中断”.......如果你不介意按F9到他把正个code段写完的话,我除了同 情你的“F9”以外,没什么其他的意见!


   那么我们就没有别更快一点的办法了吗?
   有的!那就是我们呼之欲出的两次内存断点办法。
   怎么理解两次内存断点呢?


让我来做一个假设吧,假设我是一个壳的作者。一个EXE文件的有code段,data段,rsrc段.....依次排列在你的内存空间中,那么我会怎么解 码呢?呵呵~我比较笨一点,我会先将code段解码,然后再将data段解压,接着是rsrc段......那么你不难发现,只要你在data断或者 rsrc段下内存访问断点,那么中断的时候code段就已经解压完毕了。这时我们再对code段下内存访问断点,不就可以到达OEP了吗?


   这里注意上面虽然下了两次内存访问断点,但是本质是不一样的,目的也是不一样的。


1.对data段下内存访问断点而中断是因为内存写入中断,目的是断在对对data段的解压时,这时壳要对data段写数据,但是code段已经解压 完毕。
2.对code段下内存访问断点而中断是因为内存执行中断,目的当然就是寻找OEP了。


总结一下:如果我们知道壳在什么地方对code段解压完毕我们就可以使用内存断点,找到OEP。如果不知道,那么我们就依靠2次内存断点去找,如果还不行就用多次内存断点。总之明白了原理在多次的内存断点其实都一样。从这个过程中我们了解的是壳在对区段解码的顺序!

评分

参与人数 32HB +37 THX +21 收起 理由
花盗睡鼠 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
虚心学习 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
24567 + 1
Soul1999 + 1
sjtkxy + 1
冷亦飞 + 1
l278785481 + 1
侠客行 + 1
别来无恙 + 1
小菜虫 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
xgbnapsua + 2
hackysh + 1
成丰羽 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
lies + 1
hnymsh + 1
king51999 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
消逝的过去 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
muker + 1
泡泡鱼 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
mzorn + 1 + 1 写的挺好的
胡一飞 + 3 + 1 +
a5586556 + 1 评分=感恩!简单却充满爱!感谢您的作品!
Aydos + 2 + 1 评分=感恩!简单却充满爱!感谢您的作品!
Honey丶Crack + 6 + 1 教程很详细 感谢楼主分享
lzt + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
Bu弃 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
tony2526 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
zhang5090332 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
jojaajj + 2 + 1 评分=感恩!简单却充满爱!感谢您的作品!
逍遥枷锁 + 4 + 1 评分=感恩!简单却充满爱!感谢您的作品!
577969310 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!
冷瞳 + 1 + 1 评分=感恩!简单却充满爱!感谢您的作品!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
zwbckmy 发表于 2015-8-17 06:13 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
白白_小荷 发表于 2015-8-17 07:45 | 显示全部楼层

感谢楼主转载教程
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
sgh2 发表于 2015-8-17 07:59 来自手机端 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
 楼主| 薯仔Love 发表于 2015-8-17 09:16 来自手机端 | 显示全部楼层

sgh2 发表于 2015-8-17 07:59
貌似简单其实不容易掌握

其实很简单,只要你有耐心慢慢琢磨,连我这种小小白都看的懂耶
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
tony2526 发表于 2015-8-17 10:40 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Bu弃 发表于 2015-8-17 10:41 | 显示全部楼层

同新手,学习了。
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
lzt 发表于 2015-8-17 11:28 | 显示全部楼层

新人,一起学习进步哈。
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
向往神鹰 发表于 2015-8-17 12:40 | 显示全部楼层

学习了 感谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
毛哥哥夸我酷 发表于 2015-8-17 20:05 | 显示全部楼层

同新手,学习了。
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

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