Amadey恶意软件逆向工程:剖析其加密算法与执行流程

3 阅读5分钟

Amadey — 随时间演变的恶意软件 — 逆向工程

有些读者可能听说过 Amadey。这是一种恶意软件变种,归类为第一阶段加载器——被多个威胁行为者用于传递恶意负载。

Amadey 是一个模块化的僵尸网络,最早于 2018 年被发现,主要针对 Windows 机器。

有趣的事实——Amadey 的作者,化名 InCrease,将其作品标榜为:

“…就像一个加载器,它只是一个工具。在某种意义上它可以是武器,但其本身无害,并且被许多系统管理员完全合法且自愿地使用。”

作为一个模块化僵尸网络,Amadey 使用了多种机制:

  • 通过自定义算法进行编码
  • 用于与 C2 通信的网络执行流程
  • 下载额外的负载等

高级概览

Amadey 的执行流程相当直接:

分析 _main 入口点,即使不深入挖掘,也能揭示样本的高级功能:

  • 绕过 UAC
  • 定位执行目录(用于多种目的)
  • 释放到系统 & 自启动设置(即持久化)
  • 以及其他一些功能

真正引人注目的是每个函数名前添加的 __Z 前缀。分析之前的 Amadey 版本可以发现,这其实是一个典型的特征模式。

__Z13aDropToSystemPc

分析该函数可以发现几个有趣的函数调用:

  • __Z14aCreateProcessPc
  • __Z8aCheckAVv

以及各种用于确定当前目录、临时目录等的函数。

__Z14aCreateProcessPc 基本上是围绕 Windows API CreateProcessA 构建的一个自定义封装——我们将在动态分析样本时进一步探索它。

__Z8aCheckAVv 包含对某个解密函数的有趣连续调用。

深入解密函数(__Z8aDecryptPc)会发现一个有趣的加密机制。

解密-加密算法

结合威胁情报分析样本时,可以观察到以下操作:

该算法看起来是一种自定义加密方法,依赖于:

  • 所提供字符串的长度
  • 一个十六进制的键值
  • 基于字符串长度执行的取模运算

我们可以编写以下 Python 脚本:

def decrypt_string(hex_bytes: str, key: str) -> bytes:
    encoded_string = binascii.unhexlify(hex_bytes)
    bytes_array = bytes()
    for i, j in enumerate(encoded_string):
        bytes_array += (j - key[i % len(key)]).to_bytes(1, byteorder='little')
    return bytes_array.decode('ascii')

或者,当我们执行恶意软件时动态解码这些值。

处处解密与加密

继续分析以下两个函数:

  • __Z11aAutoRunSetPc
  • __Z6aBasici

检查内部调用时,我们发现执行期间发送或使用的所有数据都通过对 __Z8aDecryptPc 的连续调用进行加密:

我们可以使用之前创建的脚本来解码十六进制值,即使不执行,只需提供十六进制字节和加密密钥作为参数即可。

例如,对于以下十六进制字符串:

调用我们编写的函数并传入参数:

decrypt_string(A4CAD7AD9FC896A4AD93ADD6A365A3A29A, 1ee76e11929a07445c5abd744aa407db29a07445c5abd744aa407db)

返回:

servicestatus[.]one

动态分析

现在,我们将恶意软件加载到 xdbg32 中并在运行时分析其执行过程。

这样做是为了消除静态分析期间可能遗漏或无法恢复的任何潜在盲点。

使用 xdbg32 将样本加载到内存中,并在 00401290(即内存中 __Z8aDecryptPc 的地址)设置断点,我们看到编码后的字符串:

继续分析,我们发现了有关将要创建的进程的信息:

进一步分析,我们发现其他有趣的行为指标,例如:

  1. 持久化:通过注册多个已知的注册表键来建立持久化机制。
  2. C2 服务器的网络通信,包含多个参数,每个参数指示不同的信息。
  3. 从 C2 服务器下载的 恶意负载
  4. 以同样方式继续分析,将揭示恶意软件采用的所有机制(侦察、持久化、提权、逃逸等),全部以明文形式呈现!

小提示

需要大量修补才能使恶意软件按照我们期望的流程执行。这需要:

  • NOP 掉指令
  • 清除 EAX 寄存器(xor eax, eax)
  • 将条件跳转(je, jne 等)更改为条件跳转(到目标地址)或在执行期间修改 ZF 标志

总结

Amadey 在其生命周期中不断演变,链式使用密码和编码机制。

Amadey 作为一个模块化僵尸网络,曾被用于多种目的,例如:

  • 信息窃取
  • 第一阶段释放器(用于额外负载)
  • 以及其他更多用途

它曾被观察到被俄罗斯国家关联的威胁行为者(如 Turla 组织)用于定向攻击活动中。它还与 SmokeLoader 加载器、钓鱼邮件和漏洞利用相关联。

本文相当简短,涵盖了主要功能和解码机制。希望文中提到的技术和所提供的脚本能让您了解如何研究采用各种编码技术的恶意软件样本。

参考与最后说明

  • 分析所用的二进制文件来源于 InvokeRE 训练数据集,并与公开恶意软件仓库(Malpedia、MalwareBazaar)进行了交叉验证。
  • 本分析中使用的 Python 工具是从 InvokeRE 材料中引入的概念重新实现并扩展而来,旨在自动化去混淆、字符串提取和 IOC 生成。

如有任何关于本文或其他问题,欢迎联系:
www.linkedin.com/in/dan-dorf…

快乐逆向 ;) CSD0tFqvECLokhw9aBeRqi89dgHeoUTYc5O6GveI1pzGcqcJw3K6DZxENqtYAgc/IJopJiyJm/uKDXFu8Mb/nSZ/q5ssuH7u9ndSG4CV8+JfbWiumVHz89mSBilXkS87LwWBFvJCT/nEGZ1qsMZ0Bw==