照虎画猫 - FSG脱壳学习手记

作者:xlx

原文地址:https://secvul.com/topics/1316.html


本人一小菜鸡,由于应急工作需要,看大佬的文章学习病毒分析

https://blog.csdn.net/ioio_jy/article/details/41207265,于是到网上随便找了一个相同的病毒学习,大佬打开病毒是这样的,可见大佬的病毒是没有加壳的。

《照虎画猫 - FSG脱壳学习手记》

我找的病毒用IDA打开,却是这样的………..

《照虎画猫 - FSG脱壳学习手记》

只有2个API,很明显是加壳了,Exeinfo PE查壳可知是FSG壳,而IDA中的两个API也是FSG壳运行时所需要使用到的两个API。 FSG壳通过LoadLibrayA加载原始程序所需要使用的动态链接库,然后通过GetProcAddress获取原始程序所需要调用的API的地址,将原始的输入表还原到程序。

《照虎画猫 - FSG脱壳学习手记》

下面记录手工脱FSG壳过程的学习过程,首先OD载入GameSetup.exe程序。

《照虎画猫 - FSG脱壳学习手记》

F8单步执行在00400162处向上跳转,因此到00400164处F4,继续F8

《照虎画猫 - FSG脱壳学习手记》

F8单步执行在00400179处向上跳转,在0040017D处F4,继续F8

《照虎画猫 - FSG脱壳学习手记》

F8单步执行在0040017E处向上跳转,在00400180处F4,继续F8单步运行,如果遇到call直接往下运行,如果遇到往前面运行的jmp语句,直接点击jmp的下一条语句,按F4(运行到指定位置)往下运行。

《照虎画猫 - FSG脱壳学习手记》

跳过004001DA,发现程序跑飞。

《照虎画猫 - FSG脱壳学习手记》

《照虎画猫 - FSG脱壳学习手记》

在下面的汇编指令处停下,jnz语句用于最终判断FSG壳是否解压完成。如果没有解压完成,就跳转到004001D4的指令继续循环解压,如果解压完成,继续往下执行0040001D1的jmp指令,使得程序跳转到原始程序真正的入口点运行。

《照虎画猫 - FSG脱壳学习手记》

在jmp处F2下断点,F9运行到jmp处停下来,F7单步步入,进入原程序的OEP。

《照虎画猫 - FSG脱壳学习手记》

F7单步跟进到地址0040D278处,这里没有看到我们熟悉的入口点的汇编代码,不要急,OD没有将汇编代码正确的显示出来,需要我们自己手动的进行数据的反汇编解析。

《照虎画猫 - FSG脱壳学习手记》

我们右键->分析->分析代码,此时就能显示汇编代码了。

《照虎画猫 - FSG脱壳学习手记》

《照虎画猫 - FSG脱壳学习手记》

使用LoadPE进行dump解压后的内存中的程序,打开LoadPE右键选择我们需要dump的文件gamesetuo.exe,选择完整转存。

《照虎画猫 - FSG脱壳学习手记》

转存后的文件如下:

《照虎画猫 - FSG脱壳学习手记》

双击UnPack.exe,此时文件并不能正常运行!

《照虎画猫 - FSG脱壳学习手记》

查询得知这是正常情况,因为壳通常都会修改IAT,程序虽然经过FSG的解压,进入到了程序的入口点,但是FSG壳在还原的时候,并没有完全的还原IAT(导入函数地址表)。 甚至有一些壳不会还原IAT,它仅仅是实现了一个自己能够识别的IAT,然后再程序运行的过程中,它自身进行动态的还原。

接下来通过ImpREC FINAL 1.7修复ITA,使用ImpREC选择脱壳的程序查看输入表函数信息,首先选取我们的脱壳进程gamesetup.exe。

《照虎画猫 - FSG脱壳学习手记》

此时我们可以看到,没有一个dll还原成功。。。。。。。。。。。。。。

《照虎画猫 - FSG脱壳学习手记》

这里需要我们重新填写OEP(程序入口点)的RVA值,这里我们通过OEP指令右键->用OllyDump脱壳调试进程->获取EIP作为OEP

《照虎画猫 - FSG脱壳学习手记》

这里我们获取到OEP的RVA值为0000D278。

《照虎画猫 - FSG脱壳学习手记》

选择“自动查找IAT”,再点击“获取输入表”,此时就能获取到输入表的函数信息了

《照虎画猫 - FSG脱壳学习手记》

选择“转储到文件”转储到先前的UnPack.exe文件,会新生成一个UnPack_.exe文件 ,点击运行,发现还是不能成功运行,查询得知此时ImpREC仅仅是帮我们修复了IAT中的一个dll,并没有完全的还原IAT。

《照虎画猫 - FSG脱壳学习手记》

此时需要我们手工修复导入表。

此时取第一个函数的RVA值:000101E8
前面我们知道程序加载到内存中的基址为:00400000
所以函数在内存中地址为:00400000+000101E8=004101e8

《照虎画猫 - FSG脱壳学习手记》

OD选择数据窗口中跟随。

《照虎画猫 - FSG脱壳学习手记》

在HEX数据区”Ctrl+G”跳转到004101e8地址处,再”右键->长型->地址”,就可显示出调用的API名字

《照虎画猫 - FSG脱壳学习手记》

《照虎画猫 - FSG脱壳学习手记》

经过手动拖动查找的方式,发现该被加壳程序的导入表的入口RVA地址应该是0041012C不是地址000101E8处,并且导入表的结束RVA地址是00410354,因此导入表函数的大小应该是00410354 – 0041012C =228 个(十六进制)。

《照虎画猫 - FSG脱壳学习手记》

《照虎画猫 - FSG脱壳学习手记》

所有最终的RVA地址为0041012C-00400000=0001012C,将ImpREC FINAL 1.7的RVA修改为0001012C,size修改为00000228,然后直接选择获取导入表。

《照虎画猫 - FSG脱壳学习手记》

这时成功获取相关导入表。

《照虎画猫 - FSG脱壳学习手记》

选择显示无效的  函数发现,在获取到的导入表中的函数存在无效的函数地址,确实通过OD也发现了函数的地址不是连续的,有些函数之间是0x7FFFFFFF不是有效的函数地址。

《照虎画猫 - FSG脱壳学习手记》

由于有些函数之间是0x7FFFFFFF不是有效的函数地址,因此我们需要去掉这些无效的函数地址。

《照虎画猫 - FSG脱壳学习手记》

右键选择无效函数,选中这些无效的函数地址,然后选择剪切指针即可删除这些无效的函数地址。

《照虎画猫 - FSG脱壳学习手记》

剪切完成之后选择“转储到文件”转储到先前的UnPack.exe文件,会新生成一个UnPack_.exe文件 。

《照虎画猫 - FSG脱壳学习手记》

点击运行UnPack_.exe,发现病毒文件成功运行,目测脱壳成功。

《照虎画猫 - FSG脱壳学习手记》

《照虎画猫 - FSG脱壳学习手记》

参考链接:

https://www.52pojie.cn/thread-434505-1-1.html

https://www.52pojie.cn/thread-338937-1-1.html

https://blog.csdn.net/qq_30145355/article/details/78877931

https://blog.csdn.net/qq1084283172/article/details/46817103

点赞

发表评论