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