第 74 章 恶意软件配置提取(Config Extraction)
恶意软件的"配置"是它的身份与指令:C2 地址、加密密钥、受害 ID、策略参数。配置提取 = 拿到恶意软件"听谁的、怎么说话"——直接决定检测规则和 C2 模拟(第 42.2)。本章覆盖配置形态、提取方法论与工具链。
📍 知识点地图 | 主题:配置提取 | 前置:第17章 | 后续:— | 核心概念:配置形态、提取流程、FLOSS、动态dump
74.1 配置是什么(恶意软件的"身份证")
典型配置字段:
□ C2 地址/域名/IP/端口(听谁的)
□ 加密密钥/密码(怎么说话)
□ 受害 ID/分组/标记(我是谁)
□ 心跳间隔(多久说一次话)
□ 通信路径/URI(走哪条路)
□ 策略参数(加密后缀/勒索金额/功能开关)
□ 持久化设置(怎么活着)
价值:
□ 检测规则(IOC: C2/IP/特征)
□ C2 模拟(第 42.2 的 inetsim/模拟器)
□ 家族归因(同类配置 = 同家族/同作者)
□ 受害者统计(受害 ID 分布)
□ 解密(勒索软件密钥有时在配置里)
74.2 配置形态分类(先认形态再提取)
| 形态 | 特征 | 提取难度 |
|---|---|---|
| 明文存储 | 字符串直读(C2 域名等) | ★ |
| XOR/简单加密 | 字符串解密函数 | ★★ |
| 结构化的(JSON/二进制) | 固定布局 | ★★ |
| 加密+压缩 | 多层包装 | ★★★ |
| 动态生成(API/内存) | 运行时才组装 | ★★★ |
| 网络下发 | 配置在 C2(下载执行) | ★★★★ |
第一原则:先 strings 看明文,再逆解密函数,最后才动态提取。
74.3 提取方法论(五步流程)
Step 1: 静态侦察
strings / FLOSS / rabin2 -z → 明文线索(URL/域名/密钥头)
FLOSS 特别有用: 自动解密常见混淆字符串
Step 2: 定位配置存储
.rodata 常量区 / 资源段 / 附加文件(README/配置表)
→ 找"处理配置的函数"(xref 到配置地址)
Step 3: 还原解密逻辑
找到解密函数 → 理解算法(XOR/RC4/自定义)
→ 用脚本批量解(第 9 章方法)
Step 4: 动态验证(静态不足时)
Frida/GDB 断在配置使用点 → dump 解密后的配置
Qiling/Unicorn 模拟执行解密函数
Step 5: 结构化输出
字段提取 → JSON → 家族规则/IOC 产出
74.4 工具链
# FLOSS(自动化字符串去混淆,首选第一步)
floss sample.exe
floss -n 8 sample.exe # 最小长度过滤
# 家族配置提取器(capemonitor 等汇总)
# 常用开源配置提取器(按家族):
# dc3-mwcp(多家族配置提取框架):
pip install mwcp
mwcp sample.exe # 自动识别家族并提取
# 静态分析配合:
# IDA/Ghidra 逆解密函数(第 4/35/36 章)
# CyberChef: 快速试编码链(第 9 章)
# 自写脚本: Python 复现解密逻辑
74.5 动态提取(运行时拿真相)
// Frida: 断在配置解析函数,dump 结果
// 场景: 配置内存中才解密/组装
// 例: Hook 字符串函数观察 C2
Interceptor.attach(Module.findExportByName(null, "sendto"), {
onEnter(args) {
console.log("sendto to: " + args[1].readByteArray(16));
}
});
// 例: Hook 网络 API 提取 C2
// 或直接内存扫描(解密完成后 dump 内存)
Qiling 模拟(免真机运行):
ql.set_syscall("connect", hook) → 记录 C2 连接目标
→ 配置解密逻辑在模拟环境中自然执行 → 观察输出
74.6 常见家族配置示例(建立模式感)
□ 银行木马(Emotet/Dridex 类):
C2 列表(多域名+端口)+ 加密 key(硬编码/派生)
□ 勒索软件(Ryuk/Conti 类):
加密后缀 + 公钥(RSA)+ 排除路径 + 勒索信模板
□ C2 框架(Cobalt Strike 类):
C2 地址 + 时间戳(加密的 beacon 配置)+ 密钥对
□ 挖矿:
矿池地址 + worker 名 + 钱包地址
□ 窃密器:
目标浏览器列表 + 外带 URL + 加密 key
74.7 检查清单
□ strings/FLOSS 明文扫描
□ 配置存储定位(常量/资源/附加文件)
□ 解密函数还原(算法+key)
□ 脚本批量解密
□ 动态验证(Frida/Qiling dump)
□ 字段结构化(JSON)
□ IOC 产出(C2/密钥/特征)
□ 家族归因与报告
动手练习
- 拿一个加壳/混淆样本,用 FLOSS 提取去混淆字符串,对比
strings的差异。 - 分析一个 XOR 加密配置的样本,还原算法并批量解密所有配置字段。
- 用 mwcp 跑一个样本,体验"自动家族识别+配置提取"。
- 对一个样本做"动态配置提取":Frida 断在解密点 dump 配置(隔离环境)。
深入阅读
- 仓库:
CTF-Sandbox-Orchestrator/competition-malware-config/(配置提取 CTF 子技能) - 仓库:
skills/malware-analysis/SKILL.md(六阶段框架) - 仓库:
skills/malware-analysis/references/anti-analysis-techniques.md(对抗配置提取) - 仓库:
skills/reverse-engineering/crypto-decode-tools.md(解密工具) - 仓库:
skills/field-journal/seed-002_go-malware-stripped.md(Go 恶意样本)