【技术分享】如何手脱Locky自定义壳

http://p3.qhimg.com/t014357cba9d9d8c67a.png

译者:我来学英语

预估稿费:130RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿

前言

Locky是一款勒索软件,因其加密后的文件后缀为.locky而得名。不同于一般的软件,Locky使用了自定义壳对代码进行保护,增加了对其进行静态分析的难度。这篇文章将教你一些小技巧并向你演示如何对Locky进行脱壳。


手脱Locky自定义壳

我将向你演示如何使用Ollydbg来给Locky脱壳。这个壳其实是比较简单的一种,但是需要你去分析。你可以去Hybrid-Analysis下载样本。

通常我会先使用PE静态分析工具,比如PortexAnalyzer对脱壳样本进行静态检测。如果分析结果如下图,那么这就告诉我们这个样本是加了壳的。样本的多个节都是高熵值的,包括.rdata段

http://p8.qhimg.com/t017c4e6979954bd81b.png

像die(detect it easy)这样的查壳工具是不知道如何对这个样本进行脱壳的,因为这个壳是自定义壳。自定义壳经常会在恶意样本中出现

http://p7.qhimg.com/t0140b3d441116666a5.png

Locky的加壳器有一个比较奇怪的特征,它总是在文件版本信息中添加“32-bit Edition”字样,其他信息每次都会变化。

StringFileInfo
---------------
language ID: 0x0409
code page: 0x04b0
CompanyName: Doubtsoftware.com 
FileDescription: Advanced Task Scheduler 32-bit Edition 
FileVersion: 4.1.0.612 
InternalName: #dvenced Task Scheduler 32-bit Edition 
LegalCopyright: Copyright © Southsoftware.com, 2002-2015 
OriginalFilename: Bifscheduler_edmin.exe 
ProductName: Advanced Task Scheduler 32-bit Edition 
ProductVersion: 4.1.0.612

Debug Information也是未知类型,因此Portex也无法给出进一步分析信息。

Debug Information
*****************

Time Date Stamp: Thu Dec 09 05:07:00 CET 2083
Type: 4102553603 no description available

如果你研究过这个样本(你可以使用hex editor搜索“RSDS”),就会知道样本中包含一个调试路径,这个路径看起来是随机的,当然也可能是被故意修改成看起来随机的:

Z:as28cxkoaoazoozykzl0tjxw9y4cnijyc6mq3mvnt.pdb

尽管这个信息没法帮助我们脱壳,但是它可以作为这种加壳器的特征。以后再碰到这条信息,我们就可以知道是使用这种加壳器加壳的了。对样本进行字符串和导入表检查似乎也没什么用。

如果你拿到这个样本时还比较早,通过动态调试你可以很轻松的认出他就是Locky。但是如果你拿到的样本比较新,或者他的C&C服务器不再使用,那么它就不会进行加密动作。

现在使用Ollydbg来调试它,别忘了给你的虚拟机做快照。程序加载后可以一直按F8步过,按得时候看着点别跑飞了。如果你不小心在下面这个call上步过了,你就会看到样本执行了一大堆动作,这时你只能重新载入这个样本了。你要做的是按F7步进这个call。

http://p6.qhimg.com/t015b43af204186f0b9.png

下面这个call也是一样的,按F7步进

http://p0.qhimg.com/t01643b11934664541b.png

后面的操作类似,仔细盯着屏幕,只要没执行一堆作就一直按F8步过。

在地址0x402364处你会注意到代码正在写.rdata段(地址0X417EE)。如果你在这下一个断点,一直按F9并且在数据窗口中看着.rdata所在的内存位置,你就可以看到.rdata段是怎样被解密成那个代码的。

http://p4.qhimg.com/t014dcc8adc9d4180d1.png

跳转到.rdata段的jump命令在地址0x4020F0出现。

http://p7.qhimg.com/t01116bce96cbfc4c62.png

http://p8.qhimg.com/t0100d76efae02d84be.png

这个地方需要注意,push命令后紧跟ret相当于一个jump操作。ret命令会使你跳转到0x41577A。与上面PortexAnalyzer生成的报告进行对比,或者从Ollydbg的内存窗口你可以确认,这就是.rdata段的虚拟地址。

但是我们的工作并没有结束,rdata段处被解密的代码仍然是加壳stub(用于将加壳后的代码解密的代码)。所以我们还需要按F8跟踪这段代码一会。在跟踪的过程中你会看到代码开始使用GetProcAddress集常见DLL方法的地址,其中一个方法是RtlDecompressBuffer,这个方法经常被加壳器用来执行脱壳操作。

t01f0596923c2ddba8c.png

t014bb5b7f49fd908fb.png

调试到地址0x415B37时停下

http://p5.qhimg.com/t017fbe82ca8d7ea76c.png

在eax寄存器上右击,选择反汇编器中跟进

http://p9.qhimg.com/t01b3702fd82f6951bc.png

现在就可以看到RtlDecompressBuffer方法的代码了。在PUSH DWORD PTR [EBP + C]命令处下断点

http://p0.qhimg.com/t0196df2c2e4e7f8331.png

在EDI寄存器上右击选择数据窗口中跟进

http://p9.qhimg.com/t012fcf57347f52b02b.png

可以看到现在数据窗口是空的

http://p3.qhimg.com/t0181081c3e2b8a0ee2.png

按F8之后,解密后的代码就会出现在这部分内存中

http://p5.qhimg.com/t01a0ab38b1b61f1735.png

最后一件事,打开内存窗口,选择这部分内存,右击选择保存到可执行文件

http://p4.qhimg.com/t01d95b38dc25f9bf18.png

选择要保存的位置就完成了。得到的二进制文件就是脱壳后的lockey你可以把它加载到hex editor中来查看他的字符串,这样就可以确定这是一个Locky了

http://p3.qhimg.com/t015428591611c8d8e0.png

(完)