[TOP]shell
ASpack是一种高效的win32可执行程序压缩工具,能对可执行文件进行压缩,使最终文件见效达到70%!
常见的压缩壳还有Upx,nspack工具
首先使用Exeinfo 查看到这个壳是:
spa
脱压缩壳最经常使用的方法是:ESP定律(堆栈平衡定律),其次是单步跟踪法;插件
ESP定律:
程序在加壳以后,程序运行起来,先执行的是壳的代码(称为shell部分或是stub部分),这部分的代码的功能是对原始PE文件进行还原,包括解压缩源程序的代码以及重定位代码等。
通常在执行shell部分代码的时候,回先保存上下文环境,使用汇编指令pushed/pishfd,等执行完shell部分以后,会使用汇编指令popfd/popad进行恢复环境,先后呼应,堆栈平衡,在这个原理的前提下,通常使用esp定律进行脱壳。3d
1,加载到调试器x63dbg或者OD中,发现pushad/pushfd指令时,判断程序已经加壳(这里我使用的是OD):
调试
2,看到pushad后,就去找到对应的popad,通常OEP就在popad附近:
这里使用一个简单的方法,在走过pushad
,call xxxxxx
,以后,在esp寄存器下写入断点或者是访问断点,而后run 起程序便可断在popad的地方:
code
3,下了断点后,跑起程序:
blog
4,找到OEP:
图片
在原始OEP处,右键使用OD插件OllyDump :
it
进入dump 界面,注意图片上的三点,而后脱壳便可:
而后转存文件:
转存文件后,使用导入表修复程序,(ImportREC)对导入表进行修复
选择dump出的文件进行修复:
修复后可查,程序已经无壳,并且能够正常运行,并且如今能够看到是使用的VC++程序写的
RVA:
在修复导入表的时候,若是映像基址不是当前模块的基址的话,那么就没法找到IAT,须要手工指定RVA,在进一步尝试。
随机基址:
通常程序若是没有随机基址的话,那么修复后是能够直接运行的,能够在开始使用010editor查看程序是否开启了随机基址,并能够关闭它
那么怎么把程序在脱壳后仍然支持随机基址呢,这个有空单独开博。