吉沃运营专员 发表于 2024-6-19 11:19:16

分析受 TMD 和 VMP 保护的恶意软件 - 真的很难吗?

注:本篇报告来自于 any.run - https://any.run/cybersecurity-blog/vmprotect-themida-malware-analysis/
恶意软件作者使用 Themida (以下简称 TMD) 和 VMProtect (以下简称 VMP) 等保护程序来保护恶意软件,加大分析人员对其进行逆向分析难度。

这些保护程序使用复杂的技术来隐藏恶意功能,比如代码虚拟化、混淆、反调试,压缩和加密。

那么 TMD 和 VMP 真的总能够阻止分析人员从中提取一些有趣的内容 (例如 C2 服务器地址、字符串或可分析代码) 吗?

为了回答这个问题,我们将分析使用 TMD 和 VMP 的不同种类的恶意软件样本,并比较它们使用的具体保护机制。

研究成果
我们的分析非常详细,从分析结果开始,下表显示了对 6 个恶意软件家族的一些发现,所有这些恶意软件家族都使用了保护程序,此表按照由易到最难分析的维度进行排序。



你可能已经注意到所有示例都没有使用代码虚拟化,这样就使得分析变得更加容易!只有一个示例启用了反调试。除了压缩和解密的初始阶段外,恶意软件代码本身基本上不受保护。而且,虽然几乎所有样本都加密混淆了字符串,但只有两个样本对其 C2 进行了混淆。

RisePro
RisePro 是一种自 2022 年以来已知的窃取程序,并以 SaaS 的形式分发,它使用了各种保护器,TMD 和 VMP 都有。



TMD 样本

VMP 样本

受 TMD 保护的 RisePro
在 TMD 提供的所有保护技术中,此示例仅使用压缩和加密部分、垃圾代码和 API Wrapping。更重要的是,垃圾代码和 API Wrapping 仅在解包例程中使用。

没有遇到任何反调试和代码虚拟化,首要目标是确定恶意软件是否易于分析,为此,还需要 x64dbg 和几分钟时间。

在调试器加载示例到达入口点后,需要在加载任何 DLL 时设置断点



现在已经有了转储,那么就可以评估它是否适合分析,正如我们所看到的,代码非常可读,例如,以下代码将加密的字符串加载到堆栈上并调用函数对其进行解密。



这段代码最终生成这个字符串



然而,仍然存在一些混淆,加密的字符串没有存储在任何地方,而是 PUSH 堆栈上。这就提出一个问题:这种混淆是由 TMD 完成的,还是在加壳之前就存在于样本中?

我们稍后回答这个问题。

尝试在转储中搜索任何有有趣的东西,在下面的示例中,使用 ImHex 十六进制编辑器和正则表达式,设法找到 C2 服务器。



受 VMP 保护的 RisePro
VMP 示例的解压过程类似,第一个系统 DLL 加载后,转储它并看到了相同的东西,C2 就在转储中,以及可读的代码



将相同字符串 "CreateDirect3dd11DeviceFromDXGIDevice" PUSH 到堆栈的代码看起来与在 TMD 示例中看到的代码片段非常相似。由此,得出结论,字符串保护功能属于 RisePro 本身,而不是保护器



VMP 示例也不使用任何代码虚拟化。

你可能会注意到,尽管两个样本之间的 C2 服务器有所不同,但它们距段开头的偏移量是相同的,尽管保护器不同,被 PUSH 和解密字符串的代码也是如此,偏移量匹配。

其它家族
除了 RisePro 外,PrivateLoader、Amadey、Arkei 和 Lumma 等系列也使用类似的保护器,虚拟化功能被忽略,保护器被用作简单的加壳器,几乎不妨碍分析。

PrivateLoader
看一个受 VMP 保护的示例,PrivateLoader 以类似的方式解压,但与 RisePro 不同的是,它不会将 C2 服务器存储在转储中,相反,它使用简单的 XOR 算法 (与保护器无关) 来解密,要获得 C2,只需模拟下面的代码或使用调试器单步执行即可。



Arkei
受 VMP 保护的 Arkei 解压后得到可读代码,从库中加载所需的函数



我们还可以在转储中的其它字符串中找到 C2 服务器地址的 DDR (Dead Drop Resolver) 配置文件。



Lumma
受 VMP 保护的 Lumma 示例与其它示例不同,这里启用了混淆机制。

解压后的代码循环执行



这似乎是控制流扁平化技术,该函数被分成多个块,每个块分配一个编号,循环选择每次迭代中接下来执行的块



同时,C2 服务器与其它字符串一起出现在转储中



Amady
此为一个受 TMD 保护的示例,在此示例中,字符串仅在加载 kernel.appcore.dll 后才出现在内存中,与之前的示例不同,此处使用了反调试机制,要到达 kernel.appcore.dll 加载阶段,需要使用类似 TitanHide 工具。之后就能像之前的所有情况一样来转储它。

Amadey 以加密形式存储 Base64 编码的字符串,使用字符串实用程序,可以从转储中提取它们



为了获得原始字符串,需要对其进行解密 (Amadey 使用自己的改组算法) 并从 Base64 进行编码。

那么,要点是什么?
我们查看了许多家族中受 TMD 和 VMP 保护的样本,你注意到一个趋势吗?几乎所有这些都跳过了虚拟化等关键功能,这就使得逆向工程变得更容易,他们使用像基本加壳器这样的保护器,这几乎无法隐藏分析。

可以这样说,造成分析困难的主要挑战不是保护器本身,而是恶意软件本身实现的字符串混淆和 C2 隐藏技术。

恶意软件反混淆是我们之前在博客中介绍过的另一个复杂领域,此处将带你深入了解常见的混淆技术、绕过它们的方法以及基于 GuLoader 的示例。

页: [1]
查看完整版本: 分析受 TMD 和 VMP 保护的恶意软件 - 真的很难吗?