加密器是一类手机软件,能够加密、搞混和控制恶意程序,使其更无法被安全性程序流程检验到。Zscaler ThreatLabZ科学研究工作组发觉,Emotet、Qbot和Dridex在最近主题活动上都应用了一种普遍的加密器,该加密器也一样能在一些Ursnif和BitPaymer的主题活动中检验到。Emotet和Dridex可以生存这般时间的缘故之一,便是他们会根据应用各种各样的加密器来躲避检验,加密器会将初始二进制文件封裝在內部,使对其的检验和剖析越来越更加繁杂。
Emotet是一种模块化设计恶意程序,关键作用是做为金融机构木马病毒的下载工具或dropper。过去的四年里Emotet一直很活跃性,它也是上年最时兴的恶意程序系列产品之一。Dridex是一种源于Zeus Trojan大家族的金融机构木马病毒,即便 在2015年被FBI捣毁以后也迄今能见到它在野外活跃性的足迹。Qbot则能远程登录受害人的系统软件,盗取信息内容,并将以上传入网络攻击的虚拟服务器。近期检验数据显示,Emotet的合理负荷url偏向了Qbot恶意程序,Emotet最近应用的加密器大家将在下文论述。
此加密器为恶意程序的关键二进制文件出示了双层维护。在文中中,大家将详细描述这种加密二进制文件的属性是如何使其适用各种各样转变的。这种属性能够不在实行二进制文件的状况下被静态数据认证,并用以撰写解密器。下面的图中展现了Emotet的关键二进制文件在加密器的搞混和加密包裝层中的封裝全过程。
0.关键二进制文件
1.编码根据转换命令和更换自动跳转命令的方法开展搞混
2.搞混的二进制文件被加密,并额外在加载器二进制文件的结尾
3.加载器二进制文件的文档两端对齐方法打乱
4.加密加载器的二进制文件
5.最终对加密后的加载器二进制文件的散列块开展二进制封裝
图1.加密的每个阶段
大家的总体目标是根据反向所述的各阶段进而得到 恶意程序的关键二进制文件。除此之外,关键二进制文件应以单独可载入/可实行的,而且IOC应便于获取。大家将从阶段5逐渐,叙述二进制文件的一些研讨式属性,根据这种属性破译该阶段,并不断追溯到阶段0。在大家的剖析中,大家发觉这种研讨式属性适用全部二进制文件的转变状况。
阶段5
阶段5的二进制文件是Emotet可执行程序,它根据MalSpams中的故意连接或MS Office文本文档中的故意宏开展免费下载。我们在阶段5的总体目标是进到阶段4以得到 加密的自定加载器的二进制文件。如同图1中常展现的那般,此阶段的二进制文件是加密的加载器二进制文件的散列块,大家必须发觉这种块并按恰当的次序拼装他们。在探讨怎样保证这一点以前,大家先看一下好多个实例——这种块是怎样遍布在二进制文件中的。鲜红色标明一部分为文档块。
图2.文档块方式实例
在上面的事例中,我们可以见到这种文档块并不一直在固定不动的部位,由于他们的尺寸不一致,并且块的次序也不一样。因而,第一个挑戰是寻找这种块并按恰当的排列顺序他们。喜讯是,我们知道加密器还必须对数据信息块开展排列,并将数据信息块详细地址和尺寸储存在一个表格中,这一表称之为“块描述符表”。噩耗是,这一表不可以在二进制文件中可预测分析的部位寻找,并且表的构造在二进制文件的转变中也并不是稳定的。下边是这一表结构的一些组合。块描述符表大部分是块描述符条目地组成。
struct ChunkDescriptorEntry[n]ChunkDescriptorTable; // n==number of chunks
图3.数据信息块描述符表结构实例
在所述构造中,“chunkAddressDword”包括块的虚拟注册地址。块的尺寸能够根据“firstDword”和“secondDword”上的下述实际操作之一得到 ,该实际操作在全部块描述符内容上都是不会改变的。
1. unsigned int chunkSize=firstDword secondDword
2. unsigned int chunkSize=firstDword ^ secondDword
3. unsigned int chunkSize=secondDword - firstDword
块描述符表的研讨式属性:
1. 0 5 out of 8.
6. 块不包含持续的4个0。
下边是搜索块方式的伪代码。涵数“FindChunkEntry”回到块的偏移和从块偏移逐渐的firstDword、chunkAddressDword的间距。假如对涵数的三个持续启用的返回值和三个回到偏移中间的长短相同,那麼能够分析全部数组来形成块详细地址和块尺寸的关系数组。
(offset1, m1, n1)=FindChunkEntry(filedata, fileSize)
(offset2, m2, n2)=FindChunkEntry(filedata offset1, fileSize)
(offset3, m3, n3)=FindChunkEntry(filedata offset2, fileSize)
If (offset2 - offset1)==(offset3 – offset2)
// found the FindChunkEntry array
FindChunkEntry(filedata, fileSize)
p=0
while p > fileSize
firstDword=filedata[p]
q=p
while q
如今拥有块详细地址和块尺寸的关系数组,我们可以组成这种块来得到 加密的加载器二进制文件,因此我们可以进到第四阶段。
阶段4
在大家的剖析中,大家观查到该加载器二进制文件(PE exe)的加密方法,是根据在循环系统中应用密匙数组开展最简单的字节到字节数(byte-to-byte)的加上开展的。在这里加密数据信息中,二进制文件不用以零偏移出現。在第四阶段,大家的总体目标是寻找PE文档在加密数据信息和破译密匙中的偏移。最先,大家将寻找破译密匙,它能够强制性根据加密数据信息来搜索PE文档的起止偏移。破译全过程出現在第5阶段二进制文件中,但并不是在可预测分析的部位。大家将从加密的数据信息自身计算出破译密匙。