最近,两名嫌疑人被捕出售Cryptex Reborn.和其他FUD工具(帮助以完全无法检测到的方式安装恶意软件)。今天,我们将研究一些示例,以确保每个人都知道这种类型的工具是什么以及他们为什么是危险的。我们还将介绍一些识别和解包恶意软件迅速的示例。
加密者 - 他们是什么?
除内置防御技术外,大多数现代恶意软件样本受到一些包装器或抑制作用的保护。一个抑制的角色基本上是恶意核心的第一层和最复杂的防守。他们试图欺骗基于模式的或甚至基于行为的检测引擎 - 通常通过伪装成无害的程序来减慢分析过程,然后解压缩/解密他们的恶意有效载荷。
他们还可以添加一些图标和元数据,使样本看起来像合法产品。
在典型的网络犯罪分子环聊中销售以防御防病毒/防恶意软件产品的地下加密器。下面,您可以看到在黑市上广告宣传的加密器的示例以及他们使用的技巧:
这些产品旨在迎合简单的罪犯,那些不需要(或想要)深层技术知识的人。这就是作者提供GUI以非常简单的方式配置所有选项的原因。例如,它允许配置加密方法和密钥以及应注入有效载荷的位置。
如您所见,次数是一个完全独立的模块。网络犯罪分子可以用它来保护任何他们想要提供的恶意软件。这就是为什么知道使用的次数没有帮助识别恶意软件系列的原因。作为一个例子,我想向您展示由相同/相似的Crypter包装的几个不同的恶意软件样本。
分析样品
- 27B138E6Bed7ACFE72DAA943762C9443- 通过交付的DLL幅度漏洞套件(将被称为:幅度.dll.)
- BBCFB9DB21299E9F3B248AAEC0A702A5- 可执行文件捕获的名称:makta.exe.
- 1AFB93D482FD46B44A64C9E987C02A27- 由此提供的可执行文件黑洞利用套件(将被称为:Blackhole.exe.)
识别相似之处
在我们开始打开包装之前,让我们看一下代码中的相似之处让我相信上述三个样本(在不同的分发广告系列中捕获)都是由同一工具包装的。
跟踪执行流程,我们注意到相似之处。在执行开始时,所有样本都制作一些毫无意义的API调用(即尝试从注册表中读取一些随机键)。然后,他们调用一个函数来分配内存(VirtualAlloc或VirtualAllocex)。他们解开了一些内存并重定向在那里重定向。一段时间后,执行返回原始图像的内存空间。但是,它现在执行之前未存在的代码(代码映像已被覆盖)。
我们可以猜测所有样本都使用RUNPE技术覆盖原始文件的图像与有效载荷。它一切都发生在shellcode中,它首先未包装到分配的内存中。让我们在VirtualAlloc / VirtualAllocex上设置一个断点,然后按照执行,看看将其写入此新分配的内存。打开包装通常包括两个阶段:从原始图像复制一些加密内容,然后应用阶段1解密。在此之后,揭示了一些shellcode。同一shellcode负责解密实际有效负载 - 现在是第2阶段2解密 - 并将其加载到内存中。
这就是未包装到分配的内存的内容如何查找每个相应的样本(阶段1解密后):
震级:
Makta:
黑洞:
以上内容以相同的顺序由相同的元素组成。在开始时,我们可以看到要加载的函数列表。接下来,我们看到加密的有效载荷(独立PE文件)。最后,我们看到要执行的shellcode(通过runpe技术加载有效载荷)。
下面是左侧的加密有效载荷及其解密版本:
视觉分析
解密过程严重混淆,但通过在解密的每个阶段之前和之后进行内存转储,我们可以尝试通过比较更改来获得一些正在进行的内容。
视觉分析可以有助于发现数据包装的算法。我已经决定在解密的每个阶段转储分配的内存+显示的有效载荷(新PE文件)。您可以在行中的第一个和第二张照片上看到此阶段。在第三个位置,您可以看到倾倒有效载荷的可视化。
所有三个文件中存在类似的模式:
幅度.dll.(加密,第一阶段解密,有效载荷)
makta.exe.(加密,第一阶段解密,有效载荷)
Blackhole.exe.(加密,第一阶段解密,有效载荷)
我们可以从这样的视觉转储中获取哪些信息?看这个最后一个案例:
有效载荷是小的,这就是为什么我们可以在加密的有效载荷(即分配内存的开头)和shellcode之间看到大量填充(即结束)。填充允许我们发现加密模式。
看着该规律,我们可以猜到:第一阶段以及第二阶段都是由XOR加密的带有一些键(键长> 1)。关键在第一阶段似乎更长,第二阶段更短。让我们看看内存转储。
在第一阶段,关键由一些重复模式组成:
要验证是否真的XOR,我们可以使用输出进行反向XOR输入 - 并查看结果是否是常规模式。实验给出了以下结果:
黑洞:
震级:
Makta:
查看可视化,我们可以猜测加密不仅仅是平淡的XOR,并且在执行期间可能修改键。
在第二阶段,视觉模式是更密集的,所以它表明键可能更短。
打开包装
在3个文件中的每一个中,解码功能大量混淆,垃圾代码和冗余API在有价值的指令之间调用。此外,使用已知的技巧(即,推送到RET)以隐藏真实流量。
在使用它后,我们可以看到,在每种情况下,算法与每个三个文件和两个阶段完全相同(仅参数不同)。
BOOL解码(DWORD * INBUF,//加密输入DWORD * OUTBUF,//缓冲区存储输出size_t bufsize,const dword键,const size_t max_size = size_max){if(inbuf == null || outbuf == null)返回错误的;for(size_t i = 0; i= max_size){outbuf [i] = val;继续;outbuf [i] =(val +步骤)^(键+步骤);} return true;}
正如我们猜到的视觉分析一样,它基于XOR操作,并且密钥被修改为解码进度。
使用参数:
阶段1
- makta.exe.:key = 0x57FC
- Blackhole.exe.:key = 0x82a3,max_size = 0x19400
- 幅度.dll.:key = 0x0a42
第2阶段
- 所有3个文件:key = 0x03e9
写自动解压件
此封隔器的特征允许我们编写自动解压缩器。它可以在以下步骤完成:
- 找到加密的块(按模式)并将它们粘在一起
- 找到XOR键(通过XOR具有预期输出)
- 使用它来解密内存片段(阶段#1)
- 解密阶段#2
- 保存解密的PE文件(有效载荷)
静态unpacker的完整代码:DECRYPTER1.cpp.
unpacker行动:
结论
如今,恶意软件是模块化的:有克里曼护理套件有助于设置自己的C&C(命令和控制器)并准备有效载荷如小马要么Neutrino Botnet Builder.。然后使用加密器将有效载荷包装,即e.e.exoit套件用于提供它。Chippers是这个难题的重要组成部分,但他们仍然没有得到利用套件和有效载荷等研究人员的同样的关注。部分地,它是因为他们的短暂性质 - 为了有效,他们必须经常改变。
所描述的次数似乎现在很受欢迎。但是,它不是任何高级工具。例如,没有防御调试器或虚拟环境。作者在混淆代码中施加了很多努力,以隐藏加密方法,但是要查看可视化,我们可以认识到它是一种基于XOR的加密,甚至没有实现良好的加密(加密DWORD大小单元,带有字大小键导致可见文物)。这就是为什么我们可以轻松地编写一个静态解包器以供将来使用。
评论