Emotet银行木马恶意软件已经存在相当一段时间了。因此,信息安全研究人员已经多次尝试开发工具,以消除混淆,甚至解密属于这种恶意软件的aes加密代码。

这些工具的问题是,它们针对的是恶意软件的活动版本。当恶意软件的作者更改代码时,它们就会遇到问题。这些变化可以是代码结构的细微变化,也可以是剧烈的变化,比如从VBA项目转移到PowerShell脚本。通常,即使是很小的代码变化也会破坏工具。

本文的主要目的是帮助读者详细了解Emotet的结构和流程,这样代码变化就不会对将来试图解码它的分析师构成挑战。我们还将深入研究代码本身的一些重要部分,以了解详细的、逐步的过程中的执行情况。

在这个分两部分的分析的第一部分中,我们将查看VBA代码,在这里您将学习如何识别和丢弃使分析过程复杂化的“死”代码。我们还将介绍可用于提取模糊命令的技术,以及代码如何执行。

Emotet概述

为了便于分析,我们来看看这个示例:

文件:PAYMENT 225EWF.doc

MD5: e8e468710c0a4f0906305c435a761902

fedfeadbfa4248cfc6711b5a0b98e1684cd37a6e0544e9b7bde4b86096963 sha - 256: 707

当前版本的Emotet downloader使用PowerShell执行最终命令。感染媒介是一种传统的电子邮件钓鱼活动。网络钓鱼会包含一个受害者应该点击的链接,这反过来会启动恶意软件的下载。恶意软件通常是Word文档,提示受害者启用宏。启用宏后,VBA将在后台执行,有效负载将下载并在受害者的计算机上执行。

VBA代码

让我们快速看看如何从受感染的Microsoft Word文档访问VBA代码。为了在Word中启用Developer视图,转到File并选择“Options”。在“选项”中,点击“自定义Ribbon”。启用“Developer”选项并点击OK。

这将在顶部菜单栏中为您提供一个“开发者”项。单击“开发人员”后,您将看到“Visual Basic”选项

单击Visual Basic,您将在一个单独的窗口中看到整个项目。现在我们可以开始分析代码了。

或者,我们可以使用一种自动提取Powershell脚本的方法,即在VM中运行文档并检查部署Powershell时使用的参数,即在ProcessExplorer的帮助下。同样,沙盒,比如混合分析自动提取。

代码执行

一旦“内容”已启用(宏),执行开始。

VBA代码是恶意MS Office文档的一部分。只要启用了宏,代码就会在后台执行。

为了混淆代码,开发人员包含了大量未使用的文本。整个代码只有一部分是可用的,而且隐藏得很好。

直接进入代码的一种更快的方法是从执行初始命令时调用的宏代码开始。在这里分析的示例中,它是Sub AutoOpen()。我们从下面这个子过程开始。

我们现在将抛弃所有无用的代码,已经包括在潜艇复杂的分析。

我们可以看到在子过程的末尾,Application.run方法被调用:

要执行上面所示的方法,我们可以看到该方法调用了一个sub和一个函数。

首先,我们来看看subndUzTzJ.

此子文件中还有一些无用的文本,只是为了增加分析的复杂性。我们将只关注可用代码。

这是我们丢弃无用代码后的sub应该看起来的样子:

vbHide将被指定一个值0,这意味着窗口是隐藏的,焦点将传递给隐藏的窗口。

DsPBkKtzcIwF–生成命令。

ndUzTzJ–调用WScript.Shell来执行命令。

让我们看一下函数DsPBkKtzcIwF()的一部分:

在上面的代码片段中,我们可以看到一些值得注意的事情:

变量用于存储指定的值。然后,这些值将被传递到另一个函数yy222y()进行处理。处理后,这些值将再次分配给不同的变量,这些变量将用于构造加密代码,该代码将通过PowerShell传递到系统进行解密。

深潜水

让我们在此进行深入研究,并仔细分析代码:

JMArl=“Zahajuzomiajvadeama4admdpokrtz”

变量JMArl被赋值为“zahajuzomiajvadeama4admdpokrtz”

szFqp = sRWNiPRldXLv = 21790 + 2115454 * PhcMjZjwl - CLng(8712932) / (zunftxk - Sqr(1328634 * Oct(7463260) - 1977628 - 4976151) * (294265 / XiFEWH))

vLkhkiRclJ = GcDcX = 3122978 + 1398811 * JTkURPW - CLng(9593915) / (krXPEiFIa - Sqr(1266549 * Oct(1775652) - 8314095 - 5625841) * (8872696 / mNsSkdPD)))

此代码不可用,我们将放弃它。

seqo = IjKrpJC + yy22222222222y (jmar, 14, 11)

这是大部分活动发生的地方。变量sEVQo被赋给“IjKrpJC + yy22222222222y (JMArl, 14,11)”的输出值。

“IjKrpJC”没有任何作用,我们将丢弃它。

Yy222222222222222y()是被调用的函数。让我们看看函数本身:

现在,让我们去掉函数中所有的垃圾代码,然后再看看它:

该函数调用Mid函数,Mid函数处理数据以供进一步使用。

中期功能

hPoMiTjfoDT是TEXT;twOYMDvfbGk是START_POSITION;VSTcawBYGW是NUMBER_OF_CHARACTERS

现在我们已经了解了代码流是如何构造的,让我们看看程序是如何执行的。

以下是变量sEVQo在赋值前的值:

sEVQo现在调用yy222y()。我们可以看到值“14”已传递给函数变量“twOYMDvfbGk”:

seqo = IjKrpJC + yy22222222222y (jmar, 14, 11)

接下来,我们可以看到值“11”已经传递给函数变量“VSTcawBYGW”:

seqo = IjKrpJC + yy22222222222y (jmar, 14, 11)

最后,文本字符串将传递给变量mbPRLWAjZ,该变量最初为空:

现在,将使用Mid函数处理该数据,如上所述。

让我们来看看它是如何展开的:

mbPRLWAjZ = zahajUZomiAjVADEAMAA4ADMdpokrTZ

twOYMDvfbGk = 14

VSTcawBYGW = 11

中期(hPoMiTjfoDT twOYMDvfbGk VSTcawBYGW):

Mid(“Zahajuzomiajvadeama4admdpokrtz”,14,11)

它应转化为:

ADEAMAA4AD

现在,让我们再次看看正在执行的函数:

它会被传递回调用变量:

现在变量sEVQo的值已经被赋值ADEAMAA4AD。这是这个函数中用到的众多变量之一。

要查看它如何流入该值的最终结果,我们可以查看变量的最终赋值:

在上述代码行执行后,分配给DsPBkKtzcIwF的值就是sub ndUzTzJ将执行的命令:

现在,我们可以将输出打印到屏幕(使用MsgBox)以进行快速查看,或者打印到即时窗口(使用Debug.print)以获得完整的结果。

下面是上面调用PowerShell的命令部分:

应将(查看突出显示的文本)转换为:

刚才介绍了如何从VBA代码中获得带有加密数据的最终命令。在本系列的第2部分中,我们将对该数据进行解密,从中提取阶段2的有效负载url。