脱壳——修复加密IAT

2021年5月5日 1点热度 0条评论

脱壳——修复加密IAT

对两个练手程序进行脱壳修复加密IAT(其实是一个程序,只是用了几种不同的加壳方式)

第一个程序

Aspack.exe

下载链接:https://download.csdn.net/download/weixin_43916597/18372920

分析程序信息

首先先查看这个程序的信息,使用PEiD查看该exe程序

 

 

这里可以看出:编译器版本:vc6.0,壳的名称:ASPack

调用OD调试程序

 

 

很清晰的看得到程序最开始的OEP是pushad

自然而然就想到了对esp打断点然后找到popad,再找到jmp或者ret之类的指令来得到真正的OEP,然后dump出来所有的字段,再修复导入表和PE文件,这种类型的原理具体可以查看我的上一篇博客:

https://www.cnblogs.com/Sna1lGo/p/14727846.html

这里直接使用工具了

在od里使用OllyDump来Dump出来exe,然后用ImportREC修复导入表就可以脱壳使用了

 

 

得到OEP,然后把OEP输入给OllyDump,得到初步的脱壳.exe

 

 

1修正入口的地址,2去掉重建输入表(因为这个重建输入表不好用)3 脱壳

再用Import REC重构就好了,最后就得到了一个完整的脱壳程序

 

 

这种方法上一个博客有仔细讲解,感兴趣的可以去看看:https://www.cnblogs.com/Sna1lGo/p/14727846.html

 

 

第二个程序

FateMouse.exe

下载链接:https://download.csdn.net/download/weixin_43916597/18372920

分析程序信息

 

 

这个壳名字取得花里胡巧的,但是没关系嗷

调用OD调试程序

 

 

一开始又是一个很经典的Pushad,果断对esp打上断点(这种办法也就前面用用玩了),然后运行程序跑到断点处

 

 

但是这里有明显的区别,这次这里的jmp是跳转到了一个别的地方(因为这个程序我们前面已经剖析很多次了),但是没关系先跳转过去看看

 

 

跳转过来是这样的一个东西,再运行看看

先不用管前面的这些,因为这个程序我们之前是操作过的,知道OEP是多少,而且目的是修复加密的IAT,所以前面的可以先不用管

直接跳转到0x00402680

 

 

这里是一些不清楚的指令,是因为od帮忙分析了,右键->分析->从模块中删除分析来恢复原来的模样

 

 

这样就很清晰明了

平时在采用FF15硬编码的call函数后面会有api的名称显示,但是这里没有,所以这里很有可能是对导入表加密了,才看call函数对应的地址的内容(注call的硬编码有两种,FF15的硬编码表示是根据函数名称)

 

 

在命令行中输入指令查看,可以看到很明显不是正常的调用API,这里表明要跳转到对应的地址来执行,那么就再进入对应的地址来查看一下看看内容是什么,这里就查看0042B240对应的0051C275

 

 

这里可以看到,其实相当于是一个中转,也就是先进入一个函数地址,然后函数的地址里面才是保存了真正的API地址

这样的话就给我们将程序dump出来之后,再通过一些程序修复IAT表进行了问题,如果这里我们还是直接用ImportREC来修复的话ImportREC找不到函数地址,它只能识别真正的地址,不能识别中转的地址,所以这里我们只需要 想办法让ImportREC能够认识这个IAT就行了,这里采用对中转地址打断点,分析中转函数的代码逻辑来修复IAT

分析关键程序的代码段逻辑

它这里的IAT表是从0042B1DC开始的,所以针对这里开始分析

 

 

给这里打一个内存写入断点,然后运行

 

 

这里是一个批处理指令,暂时不知道有什么用,继续运行程序看看,再往后运行了3次后变换到了新的位置:、

 

 

这里就好像有点东西了,首先是旁边的注释有函数的名称

 

 

其次这里的寄存器也是有内容的 ,可以很清楚的看到,这里的指令就是把0042B1DC对应的内容的值改为了一个正常的函数地址的值,相当于这里就是在修复导入函数表了

然后单步调试程序,并且关注0042B1DC这个值在哪里发生了改变

 

 

一直往下走的时候,发现经过了这条指令后0042B1DC所存储的值发生了改变 004305EA这条指令,又改变成了一个莫名其妙不认识的值,所以这里我猜测是某段指令实现获取导入表然后对导入表进行加密处理,这里我先将该使得导入表加密的指令使用nop填充,填充完之后再跳转到一条向下的指令

 

 

跳转到0043060C,为什么跳转到这里,因为前面都是循环而且是往上的循环,很大概率就是对导入表的每个函数加密,然后到第二个指令的时候就可以很清晰得看到函数的地址了

 

 

就是一个很正常的地址了,但是这样操作后直接运行运行不了了,所以这里我猜测,很有可能是加了什么验证在这个壳代码里面,那么可以加一个跳转,直接跳转到真正的OEP的地址里面,来让验证代码跑不了不就好了

但是我也不知道在哪里加比较好,就只有先试一下,先来对第一天循环执行后的语句实施Jmp oep

 

 

看看能不能行

 

 

可以很明显得看到运行成功了,算是运气比较好把,这个时候再用之前的办法来处理,dump出来,然后修复导入表就好了

总结

针对加密的导入表,可以采用对导入表加断点,跑到具体的加密指令段,然后进行特殊的分析,有时候并不需要把一个程序完整的破解,只需要达到自己的目的就了

总结中的总结:找到核心代码段分析