新闻动态

MassLogger v3:具备高级混淆技术的 NET 偷窃工具


论坛广告

MassLogger 是一种信息窃取工具,首次在黑客论坛上出售是在 2020 年 4 月。恶意软件作者声称它是“最强大的记录器和恢复工具”,终身许可证售价为 99 美元的比特币。MassLogger 可高度配置,并为其恶意用户提供多种交付、反检测和反分析选项,以及关键记录和从各种浏览器与应用程序中窃取密码的功能。

Avast 研究人员发现,该恶意软件在土耳其、西班牙、乌克兰、智利、美国、巴西、英国、德国和波兰等国最为常见。Avast AV 将该恶意软件识别为“MSILMassLogger”。此外,MassLogger 最新版本在检测到系统中存在 Avast 或 AVG AV 时将不会运行。

地图显示了 MassLogger 从 2020 年 10 月到 2021 年 2 月的目标国家

广告功能

恶意软件作者在 Github 上有一个活跃的目录,他们出于教育目的共享多种恶意软件功能和打包工具的源代码。我们能够在该恶意软件和他们的 Github 项目之间发现许多相似之处。

在 2020 年 8 月,FireEye 撰写了一篇文章,解释如何绕过 MassLogger 13 版本的反分析技巧。近期,Talos 在文章中写道关于 MassLogger 3 版本。在他们的帖子中,他们专注于该恶意软件的攻击活动和交付方式。在这篇博客中,我们将提供最后缺失的一部分,即对最终有效载荷混淆的详细分析,包括操作码和解释器,以及间接调用未分配字段的功能。

分析

我们的分析以样本为例:

SHA256 2487B12F52B803F5D38B3BB9388B039BF4F58C4B5D192D50DA5FA047E9DB828B

在运行时填充字段

浏览反编译的代码,可以发现大部分函数调用都是间接进行的,它试图调用未初始化的字段值。因此,这个恶意软件的控制流程完全隐藏在静态分析中。

PE入口点

间接调用定义

Mo() 是一个包装函数,其目的是调用第四个参数,在这个案例中是 vZkj。有趣的是,vZkj 是字段类型而非方法类型,并且没有被赋值的痕迹。重新审视 vZ 的声明,我们发现它只是众多内部密封类之一,这些类的结构由未赋值的字段值、一个类似于 Mo() 的调用函数以及一个外部 “Invoke” 函数组成。此外,它们都会在模块初始化阶段调用一个标记为 0x060004D8 的函数。

0x060004D8 负责解密 2KB 嵌入资源以构建一个字典,映射字段标记与方法标记。上面提到的字段 vZkj 的标记为 0x040001E2,它映射到方法标记 0x060001E0。

字段方法字典

一旦字典构建完成,函数就会在模块中查找所有带有 Static、NonPublic 或 GetField 标志的字段,以找到相应的方法标记。如果标记属于静态方法,则会通过 fieldInfoSetValue() 直接将其赋值给字段。

如果指定的方法不是静态声明,则会为所需的方法构建一个包装器,然后将其赋值给字段。这个动态创建的方法有一个额外的 SystemDrawingImagingImageCodecInfo 类型参数。通过 OpCodesCallvirt 或 OpCodesCall 来调用所需函数,这取决于标记的第一个字节是否被修改。例如,如果字典中的标记是 0x46000361,它将被转换回标准标记 0x06000361,且会使用 OpCodesCallvirt 而非 OpCodesCall。

将动态方法分配给字段

这些动态包装方法在调试时可能造成额外的开销,因为在达到目标函数之前,会转移到 DynamicResolverGetCodeInfo() 方法。

字符串解密

恶意软件中使用的所有字符串都已加密,并存储在 23KB 的嵌入资源中。方法标记 0x060004DB 充当字符串提供者,首次运行时它会解密并存储字符串表。该方法接收所需字符串的偏移量,首先读取第一个DWORD以确定字符串的长度,然后返回对应的字符串。

MassLogger 解密字符串的示例

从资源中检索操作码

在字符串解密后,恶意软件引导我们进入函数 0x060001DF,在这里,恶意软件以操作码的形式揭示其秘密的流程控制。首先,从第三个 3KB 的嵌入资源反序列化一个对象数组。这些对象包含操作码和附加数据的列表,这些数据将被输入到一个解释器中执行诸如调用函数、创建新对象或修改列表等任务。

嵌入资源包含读取指令和操作码

为了让对象数组被反序列化,恶意软件首先初始化以下结构:

一个 255 字节的数组。资源中的第一个字节指示用于为此数组分配值的单词数量。每个单词的第一个字节,如 0x23 或 0x1B,代表索引;第二个字节,比如 0x1,代表要使用的读取操作:0x1 = 自定义二进制读取器0x2 = ReadInt640x3 = ReadSingle0x4 = ReadDouble0x5 = 读取数据数组。字符串列表。下一个字节,0x0,确定列表的大小。在这种情况下,不需要字符串。待反序列化的对象数组。下一个字节,0x9,指示数组的大小。数组中的每一项将初始化为 null,并在后续步骤中重构。偏移量数组。该数组的大小与对象数组相同,表示每个对象在资源中数据的位置。该数组的每个条目将使用自定义二进制读取器从 0x9 字节后的现有位置填充。

当上述结构准备好后,居于 0x060001DF 的冗长例程将开始逐一读取资源数据,从数组中重构指定对象。这个对象的主要目的是形成操作码列表和执行它们所需的参数。

海外npv加速器下载

反序列化对象内部存储的操作码

第一部分是操作码,范围从 1 到 173,而第二部分则表示操作数。这些操作的解释器位于方法 0x06000499 中,包含 157 个独特的处理器。这种大规模的实现表明它是一种商业代码保护工具,但我们目前无法找到更多信息。

操作码解释器

上面示例中重要操作码的含义:

MassLogger v3:具备高级混淆技术的 NET 偷窃工具 154 lt方法标记gt:在重构所需参数和返回值接收者之后调用指定的方法。127 lt构造方法标记gt:在重构构造函数所需参数后创建一个新对象,并将新对象分配给相应位置。21 lt字段标记gt:获取指定字段的值,通常加密的配置,它用于操作 “166 0x60001C3” 的解密。

配置解密

在解密的字符串表中间,可以找到一块 Base64 编码的字符串:

解密的字符串表

这些是 MassLogger 的加密配置。首先,将每个加密的配置项分配给模块 0x02000044 中相应的字段。请注意,该模块的标记在我们查看的所有 MassLogger v3 样本中是一致的。

接下来,configKey 被 base64 解码并用作 PBKDF2 密码,以衍生出一个 32 字节的 key解密和一个 64 字节的 authKey加密。当恶意软件准备读取配置以供使用时,函数 0x060001C4 从模块 0x02000045 依照以下步骤解密每个配置字段:

Base64 解码前 32 字节为 SHA256 校验和,用于验证字符串的完整性。接下来的 16 字节作为 IV。使用前一阶段的 key 和 IV 通过 AES 解密该配置。

该样本的完整配置:https//githubcom/avast/ioc/blob/master/MassLogger/configtxt

功能

尽管每个版本的混淆技术各不相同,MassLogger 仍在其功能上变化不大。与 2020 年 6 月的分析相比,执行开始时增加了对 Avast 和 AVG AV查找 AvastGUI 和 AVGUI 进程的检查。此外,该恶意软件减少了留在系统上的指纹。日志数据不再写入磁盘,并且“MassLogger”关键字已被删除。

版本 13 与版本 30 的日志数据对比

结论

MassLogger 是一种功能强大的 NET 信息窃取工具,具有完整的功能列表。该恶意软件采用了严密的混淆技术,我们意在本文中对此进行描述。目前我们无法确认该恶意软件是否使用商业加密工具进行打包,但其复杂性可能表明是的。我们还展示了如何提取配置,这可以帮助识别特定样本的 IOCs。

关键安全指标

完整的 IoCs 列表可在以下链接找到:

https//githubcom/avast/ioc/tree/master/MassLogger

标签为 分析 恶意软件 混淆 PC 逆向工程 信息窃取器

分享:XFacebook