在分析病毒时,我经常会遇到一种非常奇怪的现象。我使用shell工具查看明显解压缩的样本,但是当我反编译或调试时,我无法直观地看到样本的恶意操作。为什么?很简单,这是因为攻击者使用自定义加密方法在示例运行时实现自解密并执行真正的恶意操作,所以你看到的是样本尚未被解密,恶意代码的逻辑不能自然分析。
以下是探索恶意代码自解密技术的一个例子。以下是Ammyy病毒下载器(MD5:28EAE907EA38B050CBDCC82BB623C00A)。使用DIE查找shell,样本不添加任何shell。
但是,在寻找一个字符串时,却找不到一些可疑的字符串(比如在下载器中经常发现的恶意网址),只有一堆乱码,似乎样本很可能会使用自解密技术。
反编译样本,也很难看到它的代码逻辑,很多动态地址调用。
对于这种样本,反编译器很难看到一些重要的操作,因为它们大多数都是解密操作,所以它们只能由调试器调整。逐步调试没有技巧,在运行调用下遇到断点并重新调试。在调试时,要注意VirtualAlloc,GlobalAlloc,HeapCreate等功能,因为恶意代码通常使用这些函数来申请一块内存空间来存储解密的恶意代码。如下图所示,该示例调用HeapCreate创建此内存的0×230000。
然后恶意代码使用je + retn以0×230000循环解密数据。
解密后,恶意代码调用esi将执行流从0x40XXXX传输到0x230000。
但是,0x230000处的代码不会执行核心恶意操作,以便修改0x40XXXX处的原始代码。如下所示,它将调用VirtualProtect将0×40000000的内存属性更改为RW(读写),然后修改原始代码。
修改的0×400000存储段的属性如下。
修改代码后,调用jmp esi跳回0x40XXXX执行。此时,此内存的代码已被修改,最后启动了核心恶意操作。转储内存并发现当前代码已经是解密的恶意代码,程序逻辑清晰可见,可以通过字符串搜索找到要下载的病毒的URL。
此时,已经分析了下载器的功能。主要功能是从http://thespecsupportservice.com/load.png下载Ammyy病毒并运行它。
因此,可以得出结论,恶意代码的自解密步骤一般有以下五个步骤:申请内存 - >
复制数据 - >
解密数据 - >
跳转到堆执行恶意代码 - >
修改原始代码并跳回执行。但是,我们可能有一个疑问,为什么病毒不直接在堆中执行核心恶意操作,而且还修改原始代码来解密0×400000空间中的核心恶意代码。这是因为一些更高级的沙箱和查杀软件会监视病毒以创建大量内存空间。一旦解密代码被释放,它就会立即被沙盒检测并查杀软件,因此堆中的代码通常不会直接执行核心恶意操作。
在了解了恶意代码自解密技术之后,先来看看最近流行的GandCrab勒索软件(MD5:48A673157DA3940244CE0DFB3ECB58E9),并利用这种自解密技术实现无杀戮。使用DIE测试样品并且未显示填料。
自解密方法类似于上面提到的方法,并且存储空间应用于0×1280000。
堆中的代码负责修改原始代码并跳回执行。
跳回后,0×403016的代码是解密后的核心恶意代码,然后你可以调试GandCrab的恶意代码。
通过转储内存,您还可以分析加密文件的代码逻辑。
在VT中,报告了病毒。只有大约一半的引擎报告有毒,并且大多数报告的病毒类型都不能位于Ransom中。似乎GandCrab使用这种自我解密方法来发挥一定的无杀伤效果。