其实对于简单的壳来说,脱壳常用的方法也无非是那几种,但是每种有每种的好处,具体使用那种方法视情况而定,我今天学习的这个壳很简单,但是重点在于修复IAT。
一、查壳:
FSG 2.0的壳。
二、脱壳:
上篇随笔所说的3种方法都可以使用,单步法,内存2次镜像,ESP,这里内存2次镜像我们发现没有.rsrc区段,所以我们可以直接从地址为00401000的地方下断点,运行。
脱壳过程这里就不再赘述,最后来到OEP进行脱壳。
看这个特征可以看得出,我们最近脱壳的程序的OEP特征全是这样,典型的VC++程序,我们需要记住这个特征,以及其他的编程软件的特征,在第一篇随笔有写过。
这里我将介绍第三种脱壳方式LordPE,以及修复软件ImportREC。
首先打开LordPE,选择进程,右键修复一下镜像大小,养成这个好习惯,再右键完整转存即可,就完成了脱壳。
然后我们用ImportREC来修复一下软件。
首先用REC选择一下进程,然后在OEP填写A860,可以看到我们OEP起始地址就是0040A860,所以我们只需要填写一下A86D,然后点击获取输入表他就可以自动获取。
看一下有没有无效函数,如果有无效函数删除指针后转存,没有的话直接转存修复。
我们再来查一下壳。
壳已经脱掉,VC++写的软件,我们发现脱完壳修复完竟然打不开。
好,本文的重点来了,手动修复IAT。
首先我们在OEP下随意找一个类似的CALL。
我们发现425210地址减去基址400000,25210在REC查找的函数里是存在的,一模一样,所以我们利用这个来修复IAT,
我们在输入命令 d 425210 在数据窗口跟随
向上寻找,一直找到没有指针或者地址全为0的地方。再向下寻找,找到指针结束,记录一下结束前的指针地址。
然后我们用ImportREC修复
选择进程——OEP A86D 自动查找IAT——获取输入表
接下来我们在RVA的位置输入开始的指针地址,00425000 减去 基址00400000 得到 25000,就在RVA的位置输入25000。
在Size位置输入范围,即结束指针地址减去开始指针地址,00425280 减去 00425000 得到280,就在Size位置输入280。然后获取输入表。
显示一下无效函数,然后剪切指针,转存到文件即可。
查一下壳,可以打开。
其实REC修复的时候Size可以直接填1000,然后剪切无效指针,都一样都一样。