一个病毒的脱壳及修复

    这是一个最近比较流行的使用.net加壳的病毒脱去.net壳后的一个中间体。脱壳和修复 过程不是很复杂,但还是需要一些小技巧。

    未脱壳的代码如下图所示:


wKioL1RcKGKRutCoAAF1CM64txo111.jpg

401535前面都是壳代码,从call eax进入到实际代码运行,从7ff8165c开始,但是实际代码运行后下api断点都断不来

wKiom1RcJ_2hbFNFAAHEoWib67Y787.jpg

7ff8166b这个调用跟进去,发现它指向了一个mov edi,edi,然后跟转到kernel32中去

wKioL1RcKGLDNPaYAACI8M0HVMs336.jpg

 

wKiom1RcJ_7h5ExoAAFUTGOpt_o966.jpg

问题就在这里,它是先跳到一个跳板内存里,跳板内存直接跳到api入口往后偏移两个字节的指令,因为前面两个字节指令是无实际意义的mov edi,edi,但是api断点是自动设到这里的,它这样跳转后,api断点就被它绕过去了。

 

wKioL1RcKGOSEVB1AAFYbCuw6mg905.jpg

7ff80000本来是iat指向的内存,这里被它偷梁换柱,先转到一块跳板内存,再跳转到api函数地址+2

 

先来修复一下这个iat表吧

通过patch前面的壳代码,让这里的iat表直接指向api函数地址

wKiom1RcJ_-CQoaqAAC3-2GnRS4444.jpg

正常的导入表内存:

wKioL1RcKGTgM2FYAAFtnynkVLw844.jpg

再次运行到call eax后,已经可以直接看到调用的api函数名字了

wKiom1RcKADwER1OAAFC3--ILhA969.jpg

 

到这里如果创建一个虚拟机快照,纯OD来分析已经比较方便了。但是如果要用IDA来分析话,就必须把这个进程DUMP出来并修复好。但是问题来了,这块7ff80000内存是后来申请的内存,它本身并不是一个PE结构,原始PE也没有这个节,直接dump full出来的文件,是没法修复的。

 

wKiom1RcKACw5rPEAAF0fhtUBG4593.jpg

danteng了一下,方法还是来了。没有这个节,就给它加个节吧

先还是dump full

wKioL1RcKGXxAtbvAAFGUIVZj0Y778.jpg

然后把7ff80000这个内存也dump出来

wKiom1RcKAGw-06NAAFX4EzdDtA563.jpg

通过ffi给这个PE加个section

wKioL1RcKGXQDWB8AADogsQ1lbk520.jpg

修改virtual Offset,这里要用7ff80000减去400000

wKiom1RcKAHzlLywAAFm5VwjopY631.jpg

好了,现在可以用import rec fix dump了,这里把rva手动指向到7ff80000的相对偏移

wKioL1RcKGaSLgdBAAJ3whbfYVs021.jpg

再把dumped_exe的入口改一下,前面import rec上直接改也可以

 

wKiom1RcKAGwDb1HAAAwwM2G9N4013.jpg

OK,搞定了,用IDA打开看一下,很爽吧

wKioL1RcKGbiK0xSAADGVHix0Lw242.jpg

 

    这个病毒的原体还是挺强悍的,.net加壳方式可以过掉360主防,而且免杀比较方便。

你可能感兴趣的:(病毒,修复,脱壳,免杀)