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 无法直接查看加密字符串
解密流程:
- 申请内存空间
- 解密加密字符串
- 返回解密后的字符串指针
3. 代码混淆技术
控制流平坦化:
- 打乱正常控制流
- 增加分析难度
- 干扰静态分析工具
大数运算混淆:
- 插入大量无用数学运算
- 部分运算结果用于控制流跳转
- 使相同代码编译后产生不同二进制特征
0x02 C2 配置提取与分析
1. 配置定位方法
- 动态调试时注意 ECK1、ECS1 等关键字
- 观察加密/解密和网络通信相关 API 调用
- 跟踪密钥和 IP 的导入操作
2. 加密数据结构
+----------------+----------------+-------------------------------+
| 解密密钥 (DWORD) | 数据长度 (DWORD) | 加密数据 (变长) |
+----------------+----------------+-------------------------------+
3. 手动解密方法
- 取第一个 DWORD 作为 XOR 密钥
- 取第二个 DWORD 作为数据长度
- 从第三个 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. 主要执行流程
初始化阶段:
- 检查命令行参数
- 生成随机数
- 获取路径信息
- 尝试连接服务控制管理器(推测用于持久化)
- 获取当前文件信息
信息收集阶段:
- 获取计算机名
- 获取磁盘序列号
- 获取系统版本信息
- 检索远程桌面服务会话
加密通信阶段:
- 解密 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 密钥交换:
BCryptOpenAlgorithmProvider("ECDH_P256") → BCryptGenerateKeyPair → BCryptFinalizeKeyPair → BCryptExportKey - AES 加密:
BCryptOpenAlgorithmProvider("AES") → BCryptGetProperty → BCryptImportKey
- ECDH 密钥交换:
-
网络通信:
InternetOpenW→InternetConnectW→HttpOpenRequestW→HttpSendRequestW
-
持久化操作:
RegCreateKeyExW→RegDeleteValueW→RegCloseKeyGetTempFileNameW→SHFILEOPSTRUCTA(移动文件)
0x05 技术总结
-
多层加密:
- 使用 ECDH 进行密钥交换
- 使用 AES 加密数据
- 多层 Base64 编码
-
反分析技术:
- 动态 API 加载
- 字符串加密
- 控制流平坦化
- 大数运算混淆
-
持久化技术:
- 服务注册尝试
- 注册表修改
- 临时文件复制
-
数据收集:
- 全面系统信息收集
- 远程桌面会话监控
- 文件系统监控
0x06 分析建议
-
动态分析优先:
- 使用 API 监控工具跟踪关键函数调用
- 重点关注加密相关 API 调用链
-
字符串解密:
- 定位解密函数
- 提取加密字符串进行批量解密
-
配置提取:
- 关注 ECK1/ECS1 等关键字
- 跟踪加密数据的内存操作
-
行为监控:
- 监控注册表修改
- 跟踪临时文件创建
- 捕获网络通信数据
通过以上分析方法,可以全面掌握该恶意 DLL 的运行机制和通信方式,为检测和防御提供有效依据。