APT 恶意 DLL 分析及 C2 配置提取(子 DLL 篇)
字数 2310 2025-08-06 20:12:39

Emotet 恶意 DLL 分析及 C2 配置提取技术详解

0x00 样本概述

样本基本信息

  • MD5: 4e22717b48f2f75fcfd47531c780b218
  • SHA1: 60b637e95b1f2d14faaa71085b7e26321bfeeb6d
  • SHA256: 7f94107c9becbcc6ca42070fca7e1e63f29cdd85cbbd8953bbca32a1b4f91219

样本背景

该样本属于 Emotet 恶意软件家族的内层 DLL,主要用于 C2 通信和数据窃取。分析重点在于其 C2 配置提取和加密通信机制。

0x01 反分析技术

1. 动态 API 获取技术

  • 所有 API 函数都通过包装器动态获取
  • 核心函数 get_dll_and_funbase 负责加载所有 API
  • 分析方法:在 get_dll_and_funbase 下断点可提取所有 API 包装器

示例 - ExitProcess 包装器分析

mov     eax, offset ExitProcess_ptr
call    get_dll_and_funbase
jmp     eax

2. 字符串加密技术

  • 所有敏感字符串都加密存储在 .text 段
  • 解密函数 data_decrypt_to_string 负责运行时解密
  • IDA 的 string window 无法直接查看加密字符串

解密流程

  1. 申请内存空间
  2. 解密加密字符串
  3. 返回解密后的字符串指针

3. 代码混淆技术

控制流平坦化

  • 打乱正常控制流
  • 增加分析难度
  • 干扰静态分析工具

大数运算混淆

  • 插入大量无用数学运算
  • 部分运算结果用于控制流跳转
  • 使相同代码编译后产生不同二进制特征

0x02 C2 配置提取与分析

1. 配置定位方法

  • 动态调试时注意 ECK1、ECS1 等关键字
  • 观察加密/解密和网络通信相关 API 调用
  • 跟踪密钥和 IP 的导入操作

2. 加密数据结构

+----------------+----------------+-------------------------------+
| 解密密钥 (DWORD) | 数据长度 (DWORD) | 加密数据 (变长)                |
+----------------+----------------+-------------------------------+

3. 手动解密方法

  1. 取第一个 DWORD 作为 XOR 密钥
  2. 取第二个 DWORD 作为数据长度
  3. 从第三个 DWORD 开始,用密钥 XOR 解密数据

示例解密

  • ECK1 (Base64): RUNLMSAAAADzozW1Di4r9DVWzQpMKT588RDdy7BPILP6AiDOTLYMHkSWvrQO5slbmr1OvZ2Pz+AQWzRMggQmAtO6rPH7nyx2
  • ECS1 (Base64): RUNTMSAAAABAX3S2xNjcDD0fBno33Ln5t71eii+mofIPoXkNFOX1MeiwCh48iz97kB0mJjGGZXwardnDXKxI8GCHGNl0PFj5

0x03 行为分析

1. 调试设置

使用 rundll32.exe 调试子 DLL:

"C:\Windows\SysWOW64\rundll32.exe" C:\Users\***\AppData\Local\Kfsdwbgbdwjo\tlcdjloq.dfv,DllRegisterServer

2. 主要执行流程

初始化阶段

  1. 检查命令行参数
  2. 生成随机数
  3. 获取路径信息
  4. 尝试连接服务控制管理器(推测用于持久化)
  5. 获取当前文件信息

信息收集阶段

  1. 获取计算机名
  2. 获取磁盘序列号
  3. 获取系统版本信息
  4. 检索远程桌面服务会话

加密通信阶段

  1. 解密 ECK1 公钥
  2. 动态生成 AES 密钥
  3. 解密 ECS1 公钥
  4. 加密收集的系统信息
  5. Base64 格式化加密数据
  6. 通过 Cookie 发送加密数据

持久化尝试

  1. 在临时目录创建唯一文件名
  2. 复制自身到临时文件
  3. 尝试修改注册表 Run 键值

0x04 关键函数调用链

  1. 参数验证

    • GetCommandLineAlstrcmpiw_dataSHGetFolderPathA
  2. 内存操作

    • processheapRtlAllocateHeap
  3. 随机数生成

    • BCryptOpenAlgorithmProviderBCryptGenRandomBCryptCloseAlgorithmProvider
  4. 服务管理

    • OpenSCManagerW
  5. 系统信息收集

    • GetComputerNameAGetWindowsDirectoryWGetVolumeInformationWsprintfW
  6. 线程监控

    • CreateEventWCreateThreadReadDirectoryChangesW
  7. 加密操作

    • ECDH 密钥交换:
      BCryptOpenAlgorithmProvider("ECDH_P256") 
      → BCryptGenerateKeyPair 
      → BCryptFinalizeKeyPair 
      → BCryptExportKey
      
    • AES 加密:
      BCryptOpenAlgorithmProvider("AES") 
      → BCryptGetProperty 
      → BCryptImportKey
      
  8. 网络通信

    • InternetOpenWInternetConnectWHttpOpenRequestWHttpSendRequestW
  9. 持久化操作

    • RegCreateKeyExWRegDeleteValueWRegCloseKey
    • GetTempFileNameWSHFILEOPSTRUCTA(移动文件)

0x05 技术总结

  1. 多层加密

    • 使用 ECDH 进行密钥交换
    • 使用 AES 加密数据
    • 多层 Base64 编码
  2. 反分析技术

    • 动态 API 加载
    • 字符串加密
    • 控制流平坦化
    • 大数运算混淆
  3. 持久化技术

    • 服务注册尝试
    • 注册表修改
    • 临时文件复制
  4. 数据收集

    • 全面系统信息收集
    • 远程桌面会话监控
    • 文件系统监控

0x06 分析建议

  1. 动态分析优先

    • 使用 API 监控工具跟踪关键函数调用
    • 重点关注加密相关 API 调用链
  2. 字符串解密

    • 定位解密函数
    • 提取加密字符串进行批量解密
  3. 配置提取

    • 关注 ECK1/ECS1 等关键字
    • 跟踪加密数据的内存操作
  4. 行为监控

    • 监控注册表修改
    • 跟踪临时文件创建
    • 捕获网络通信数据

通过以上分析方法,可以全面掌握该恶意 DLL 的运行机制和通信方式,为检测和防御提供有效依据。

Emotet 恶意 DLL 分析及 C2 配置提取技术详解 0x00 样本概述 样本基本信息 MD5 : 4e22717b48f2f75fcfd47531c780b218 SHA1 : 60b637e95b1f2d14faaa71085b7e26321bfeeb6d SHA256 : 7f94107c9becbcc6ca42070fca7e1e63f29cdd85cbbd8953bbca32a1b4f91219 样本背景 该样本属于 Emotet 恶意软件家族的内层 DLL,主要用于 C2 通信和数据窃取。分析重点在于其 C2 配置提取和加密通信机制。 0x01 反分析技术 1. 动态 API 获取技术 所有 API 函数都通过包装器动态获取 核心函数 get_dll_and_funbase 负责加载所有 API 分析方法:在 get_dll_and_funbase 下断点可提取所有 API 包装器 示例 - ExitProcess 包装器分析 : 2. 字符串加密技术 所有敏感字符串都加密存储在 .text 段 解密函数 data_decrypt_to_string 负责运行时解密 IDA 的 string window 无法直接查看加密字符串 解密流程 : 申请内存空间 解密加密字符串 返回解密后的字符串指针 3. 代码混淆技术 控制流平坦化 : 打乱正常控制流 增加分析难度 干扰静态分析工具 大数运算混淆 : 插入大量无用数学运算 部分运算结果用于控制流跳转 使相同代码编译后产生不同二进制特征 0x02 C2 配置提取与分析 1. 配置定位方法 动态调试时注意 ECK1、ECS1 等关键字 观察加密/解密和网络通信相关 API 调用 跟踪密钥和 IP 的导入操作 2. 加密数据结构 3. 手动解密方法 取第一个 DWORD 作为 XOR 密钥 取第二个 DWORD 作为数据长度 从第三个 DWORD 开始,用密钥 XOR 解密数据 示例解密 : ECK1 (Base64): RUNLMSAAAADzozW1Di4r9DVWzQpMKT588RDdy7BPILP6AiDOTLYMHkSWvrQO5slbmr1OvZ2Pz+AQWzRMggQmAtO6rPH7nyx2 ECS1 (Base64): RUNTMSAAAABAX3S2xNjcDD0fBno33Ln5t71eii+mofIPoXkNFOX1MeiwCh48iz97kB0mJjGGZXwardnDXKxI8GCHGNl0PFj5 0x03 行为分析 1. 调试设置 使用 rundll32.exe 调试子 DLL: 2. 主要执行流程 初始化阶段 : 检查命令行参数 生成随机数 获取路径信息 尝试连接服务控制管理器(推测用于持久化) 获取当前文件信息 信息收集阶段 : 获取计算机名 获取磁盘序列号 获取系统版本信息 检索远程桌面服务会话 加密通信阶段 : 解密 ECK1 公钥 动态生成 AES 密钥 解密 ECS1 公钥 加密收集的系统信息 Base64 格式化加密数据 通过 Cookie 发送加密数据 持久化尝试 : 在临时目录创建唯一文件名 复制自身到临时文件 尝试修改注册表 Run 键值 0x04 关键函数调用链 参数验证 : GetCommandLineA → lstrcmpiw_data → SHGetFolderPathA 内存操作 : processheap → RtlAllocateHeap 随机数生成 : BCryptOpenAlgorithmProvider → BCryptGenRandom → BCryptCloseAlgorithmProvider 服务管理 : OpenSCManagerW 系统信息收集 : GetComputerNameA → GetWindowsDirectoryW → GetVolumeInformationW → sprintfW 线程监控 : CreateEventW → CreateThread → ReadDirectoryChangesW 加密操作 : ECDH 密钥交换: AES 加密: 网络通信 : InternetOpenW → InternetConnectW → HttpOpenRequestW → HttpSendRequestW 持久化操作 : RegCreateKeyExW → RegDeleteValueW → RegCloseKey GetTempFileNameW → SHFILEOPSTRUCTA (移动文件) 0x05 技术总结 多层加密 : 使用 ECDH 进行密钥交换 使用 AES 加密数据 多层 Base64 编码 反分析技术 : 动态 API 加载 字符串加密 控制流平坦化 大数运算混淆 持久化技术 : 服务注册尝试 注册表修改 临时文件复制 数据收集 : 全面系统信息收集 远程桌面会话监控 文件系统监控 0x06 分析建议 动态分析优先 : 使用 API 监控工具跟踪关键函数调用 重点关注加密相关 API 调用链 字符串解密 : 定位解密函数 提取加密字符串进行批量解密 配置提取 : 关注 ECK1/ECS1 等关键字 跟踪加密数据的内存操作 行为监控 : 监控注册表修改 跟踪临时文件创建 捕获网络通信数据 通过以上分析方法,可以全面掌握该恶意 DLL 的运行机制和通信方式,为检测和防御提供有效依据。