逆向工程实战手册 第 74 章

第 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/密钥/特征)
□ 家族归因与报告

动手练习

  1. 拿一个加壳/混淆样本,用 FLOSS 提取去混淆字符串,对比 strings 的差异。
  2. 分析一个 XOR 加密配置的样本,还原算法并批量解密所有配置字段。
  3. 用 mwcp 跑一个样本,体验"自动家族识别+配置提取"。
  4. 对一个样本做"动态配置提取":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 恶意样本)