作者:Fly2015
对于FSG壳,之前没有接触过是第一次接触,这次拿来脱壳的程序仍然是吾爱破解论坛破解培训的作业3的程序。对于这个壳折腾了一会儿,后来还是被搞定了。
1.查壳
首先对该程序(吾爱破解培训第一课作业三.exe)进行查壳:
很遗憾,这次DIE也不行了,不过没事。
2.脱壳
OD载入该加壳的程序进行分析,下面是入口点的汇编代码:
起初对于该种加壳程序也是比较陌生,但是由于OD使用的还算熟悉,以及结合该加壳程序获取函数的API调用地址的特点,很快发现了该程序的关键点汇编:
于是在地址004001D1处F2下断点,然后F9运行到该地址004001D1处,地址0041DDAC就是被加壳程序真实的OEP的地址。
F7单步跟进到地址0041DDAC处,遗憾的是没有看到我们熟悉的入口点的汇编代码,但是不要急,OD没有将汇编代码正确的显示出来,需要我们自己手动的进行数据的反汇编解析:
选中地址0041DDAC处没有正确显示的数据,然后 右键 如图,选择 分析-->分析代码 即可正确显示了。
手动选择分析代码以后,地址0041DDAC处的数据的显示,是不是很有亲切感啊,令人熟悉的入口点汇编代码出现了,但是不要急,这才是第一步。
很自然的下一步就是使用OD的插件OllyDump进行程序的脱壳操作,但是这里对于这种壳这样直白的脱壳方式并不管用,需要使用Load PE结合RECImport工具进行完美脱壳。因为被FSG加壳的程序的IAT表不是连续的,脱壳工具不能智能的识别那些内存数据是函数的地址,因此需要我们自己手动的识别那些是函数的地址那些不是函数的地址,然后使用工具脱壳。
需要脱壳程序暂停在地址0041DDAC处,使用Load PE工具将其此时的内存PE镜像手动Dump出来(完全脱壳方式),如图。
注意,此时Dump出来的程序还不能运行,需要为该Dump程序正确的修复IAT表,它才能运行起来。
通过上面的调试,了解到程序的真实OEP的RVA地址为001DDAC,使用RECImport工具进行该Dump程序的IAT表的修复。
1.常规的修复IAT表的方式:
在RECImport工具的OEP处手动填写001DDAC,然后点击 IAT 自动搜索-->获取导入表-->修正转储。
IAT表修复后的脱壳程序的运行,如图。
很显然,刚才的IAT表的修复没有修复成功,如果IAT表修复成功的话,运行脱壳后的程序就不会出现下面这个不友好的界面提示。
2.手动修复IAT表的方式:
遗憾啦,RECImport工具没用使用好,通过OD查看内存数据发现,RECImport工具对Dump后的程序的IAT的修复不完全。
在RECImport工具中,IAT自动搜索到的程序的导入表的函数不完全。如图,函数导入表的起始RVA地址是000320BC,函数导入表的结束RVA地址是000320BC+200=000322BC也就导入表函数的个数是0x200,但是经过OD的观察发现,这两个参数有误。
回到OD调试程序中,在HEX数据区,Ctrl+G定位到地址00410000地址处,然后如图,设置数据的显示方式:长整型-->地址 显示方式。
OD数据视窗-地址显示方式视图:
经过手动拖动查找的方式,发现该被加壳程序的导入表的入口RVA地址应该是00032000 不是地址000320BC处,并且导入表的结束RVA地址是00032554,因此导入表函数的大小应该是32554 - 32000 = 554 个(十六进制)。
导入表的起始RVA地址:00032000.
导入表的结束RVA地址:00032554 ,因此导入表函数的大小应该是32554 - 32000 = 554 。
经过上面的分析和观察以后,如下图填写RECImport工具中需要的参数,然后直接点击 获取导入表 千万不要点 IAT自动获取 否则前功尽弃。
点击 显示无效的 函数发现,在获取到的导入表中的函数存在无效的函数地址,确实通过OD也发现了函数的地址不是连续的,有些函数之间是0x7FFFFFFF不是有效的函数地址。
由于0x7FFFFFFF不是有效的函数地址,因此需要去掉这些无效的函数地址。右键选择中这些无效的函数地址,然后如图选择 剪切指针 即可删除这些无效的函数地址。
Ok,现在就可以使用这些剩下的有效的IAT表的导出函数地址进行Dump程序的修正转储了,如图。
运行经过有效的IAT修复的程序的视图。
FSG脱壳分析文档的和脱壳后的程序的下载地址:http://download.csdn.net/detail/qq1084283172/8883891