win脱壳_压缩壳_aspack

[TOP]shell

0,压缩壳介绍:

ASpack是一种高效的win32可执行程序压缩工具,能对可执行文件进行压缩,使最终文件见效达到70%!
常见的压缩壳还有Upx,nspack工具

1,分析压缩壳:

首先使用Exeinfo 查看到这个壳是:
spa

2,ESP定律脱壳:

脱压缩壳最经常使用的方法是:ESP定律(堆栈平衡定律),其次是单步跟踪法;插件

ESP定律:
程序在加壳以后,程序运行起来,先执行的是壳的代码(称为shell部分或是stub部分),这部分的代码的功能是对原始PE文件进行还原,包括解压缩源程序的代码以及重定位代码等。
通常在执行shell部分代码的时候,回先保存上下文环境,使用汇编指令pushed/pishfd,等执行完shell部分以后,会使用汇编指令popfd/popad进行恢复环境,先后呼应,堆栈平衡,在这个原理的前提下,通常使用esp定律进行脱壳。3d

2.1 ESP定律的步骤:

1,加载到调试器x63dbg或者OD中,发现pushad/pushfd指令时,判断程序已经加壳(这里我使用的是OD):
调试

2,看到pushad后,就去找到对应的popad,通常OEP就在popad附近:
这里使用一个简单的方法,在走过pushad,call xxxxxx,以后,在esp寄存器下写入断点或者是访问断点,而后run 起程序便可断在popad的地方:
code

3,下了断点后,跑起程序:
blog

4,找到OEP:
图片

2.2 dump 程序:

在原始OEP处,右键使用OD插件OllyDump :
it

进入dump 界面,注意图片上的三点,而后脱壳便可:

而后转存文件:

转存文件后,使用导入表修复程序,(ImportREC)对导入表进行修复

选择dump出的文件进行修复:

修复后可查,程序已经无壳,并且能够正常运行,并且如今能够看到是使用的VC++程序写的

2.3 须要注意的地方:

RVA:
在修复导入表的时候,若是映像基址不是当前模块的基址的话,那么就没法找到IAT,须要手工指定RVA,在进一步尝试。
随机基址:
通常程序若是没有随机基址的话,那么修复后是能够直接运行的,能够在开始使用010editor查看程序是否开启了随机基址,并能够关闭它

那么怎么把程序在脱壳后仍然支持随机基址呢,这个有空单独开博。

相关文章
相关标签/搜索