论坛广告
MassLogger 是一种信息窃取工具,首次在黑客论坛上出售是在 2020 年 4 月。恶意软件作者声称它是“最强大的记录器和恢复工具”,终身许可证售价为
99 美元的比特币。MassLogger 可高度配置,并为其恶意用户提供多种交付、反检测和反分析选项,以及关键记录和从各种浏览器与应用程序中窃取密码的功能。
Avast 研究人员发现,该恶意软件在土耳其、西班牙、乌克兰、智利、美国、巴西、英国、德国和波兰等国最为常见。Avast AV将该恶意软件识别为“MSIL:MassLogger- *”。此外,MassLogger 最新版本在检测到系统中存在 Avast 或 AVG AV时将不会运行。
地图显示了 MassLogger 从 2020 年 10 月到 2021 年 2 月的目标国家
广告功能
恶意软件作者在 Github 上有一个活跃的目录,他们出于教育目的共享多种恶意软件功能和打包工具的源代码。我们能够在该恶意软件和他们的 Github项目之间发现许多相似之处。
在 2020 年 8 月, 撰写了一篇文章,解释如何绕过 MassLogger 1.3 版本的反分析技巧。近期,Talos在关于 MassLogger 3版本。在他们的帖子中,他们专注于该恶意软件的攻击活动和交付方式。在这篇博客中,我们将提供最后缺失的一部分,即对最终有效载荷混淆的详细分析,包括操作码和解释器,以及间接调用未分配字段的功能。
分析
我们的分析以样本为例:
SHA256: 2487B12F52B803F5D38B3BB9388B039BF4F58C4B5D192D50DA5FA047E9DB828B
在运行时填充字段
浏览反编译的代码,可以发现大部分函数调用都是间接进行的,它试图调用未初始化的字段值。因此,这个恶意软件的控制流程完全隐藏在静态分析中。
PE入口点
间接调用定义
Mo() 是一个包装函数,其目的是调用第四个参数,在这个案例中是 vZ.kj 。有趣的是,vZ.kj
是字段类型而非方法类型,并且没有被赋值的痕迹。重新审视 vZ 的声明,我们发现它只是众多内部密封类之一,这些类的结构由未赋值的字段值、一个类似于
Mo() 的调用函数以及一个外部 “Invoke” 函数组成。此外,它们都会在模块初始化阶段调用一个标记为 0x060004D8 的函数。
0x060004D8 负责解密 2KB嵌入资源以,映射字段标记与方法标记。上面提到的字段
vZ.kj 的标记为 0x040001E2,它映射到方法标记 0x060001E0。
字段-方法字典
一旦字典构建完成,函数就会在模块中查找所有带有 Static、NonPublic 或 GetField标志的字段,以找到相应的方法标记。如果标记属于静态方法,则会通过 fieldInfo.SetValue() 直接将其赋值给字段。
如果指定的方法不是静态声明,则会为所需的方法构建一个包装器,然后将其赋值给字段。这个动态创建的方法有一个额外的
System.Drawing.Imaging.ImageCodecInfo 类型参数。通过 OpCodes.Callvirt 或
OpCodes.Call 来调用所需函数,这取决于标记的第一个字节是否被修改。例如,如果字典中的标记是 0x46000361,它将被转换回标准标记
0x06000361,且会使用 OpCodes.Callvirt 而非 OpCodes.Call 。
这些动态包装方法在调试时可能造成额外的开销,因为在达到目标函数之前,会转移到 DynamicResolver.GetCodeInfo() 方法。
字符串解密
恶意软件中使用的所有字符串都已加密,并存储在 23KB 的嵌入资源中。方法标记 0x060004DB充当字符串提供者,首次运行时它会并存储字符串表。该方法接收所需字符串的偏移量,首先读取第一个DWORD以确定字符串的长度,然后返回对应的字符串。
MassLogger解密字符串的示例
从资源中检索操作码
在字符串解密后,恶意软件引导我们进入函数 0x060001DF,在这里,恶意软件以操作码的形式揭示其秘密的流程控制。首先,从第三个 3KB的嵌入资源反序列化一个对象数组。这些对象包含操作码和附加数据的列表,这些数据将被输入到一个解释器中执行诸如调用函数、创建新对象或修改列表等任务。
嵌入资源包含读取指令和操作码
为了让对象数组被反序列化,恶意软件首先初始化以下结构:
- 一个 255 字节的数组。资源中的第一个字节指示用于为此数组分配值的单词数量。每个单词的第一个字节,如 0x23 或 0x1B,代表索引;第二个字节,比如 0x1,代表要使用的读取操作:
- 0x1 =
- 0x2 = ReadInt64
- 0x3 = ReadSingle
- 0x4 = ReadDouble
- 0x5 = 读取数据数组。
- 字符串列表。下一个字节,0x0,确定列表的大小。在这种情况下,不需要字符串。
- 待反序列化的对象数组。下一个字节,0x9,指示数组的大小。数组中的每一项将初始化为 null,并在后续步骤中重构。
- 偏移量数组。该数组的大小与对象数组相同,表示每个对象在资源中数据的位置。该数组的每个条目将使用从 0x9 字节后的现有位置填充。
当上述结构准备好后,居于 0x060001DF的冗长例程将开始逐一读取资源数据,从数组中重构指定对象。这个对象的主要目的是形成操作码列表和执行它们所需的参数。
反序列化对象内部存储的操作码
第一部分是操作码,范围从 1 到 173,而第二部分则表示操作数。这些操作的解释器位于方法 0x06000499 中,包含 157个独特的处理器。这种大规模的实现表明它是一种商业代码保护工具,但我们目前无法找到更多信息。
操作码解释器
上面示例中重要操作码的含义:
- 154 : <方法标记>:在重构所需参数和返回值接收者之后调用指定的方法。
- 127 : <构造方法标记>:在重构构造函数所需参数后创建一个新对象,并将新对象分配给相应位置。
- 21 : <字段标记>:获取指定字段的值,通常加密的配置,它用于操作 “166 : 0x60001C3” 的解密。
配置解密
在解密的字符串表中间,可以找到一块 Base64 编码的字符串:
解密的字符串表
这些是 MassLogger 的加密配置。首先,将每个加密的配置项分配给模块 0x02000044 中相应的字段。请注意,该模块的标记在我们查看的所有
MassLogger v3 样本中是一致的。
接下来,config.Key 被 base64 解码并用作 PBKDF2 密码,以衍生出一个 32 字节的 _key (解密)和一个 64字节的 _authKey (加密)。当恶意软件准备读取配置以供使用时,函数 0x060001C4 从模块 0x02000045依照以下步骤解密每个配置字段:
- Base64 解码
- 前 32 字节为 SHA256 校验和,用于验证字符串的完整性。
- 接下来的 16 字节作为 IV。
- 使用前一阶段的 _key 和 IV 通过 AES 解密该配置。
该样本的完整配置: https://github.com/avast/ioc/blob/master/MassLogger/config.txt
功能
尽管每个版本的混淆技术各不相同,MassLogger 仍在其功能上变化不大。与 2020 年 6月的相比,执行开始时增加了对
Avast 和 AVG AV(查找 AvastGUI 和 AVGUI进程)的检查。此外,该恶意软件减少了留在系统上的指纹。日志数据不再写入磁盘,并且“MassLogger”关键字已被删除。
版本 1.3 与版本
3.0 的日志数据对比
结论
MassLogger 是一种功能强大的 .NET信息窃取工具,具有完整的功能列表。该恶意软件采用了严密的混淆技术,我们意在本文中对此进行描述。目前我们无法确认该恶意软件是否使用商业加密工具进行打包,但其复杂性可能表明是的。我们还展示了如何提取配置,这可以帮助识别特定样本的
IOCs。
关键安全指标
完整的 IoCs 列表可在以下链接找到:
https://github.com/avast/ioc/tree/master/MassLogger
标签为 ,
,
,
,
,
分享:XFacebook