uky007/LummaStealer
GitHub: uky007/LummaStealer
针对 Lumma Stealer 恶意软件的 IDA Pro 逆向分析工具集,自动化修复控制流平坦化并解密字符串数据。
Stars: 0 | Forks: 0
# Lumma Stealer 反混淆工具
用于反混淆 [Lumma Stealer](https://malpedia.caad.fkie.fraunhofer.de/details/win.lumma)(又名 LummaC2)的 IDA Pro Python 脚本,这是一种信息窃取恶意软件。
## 目标样本
我们从基于 Go 的加载器中解压了 Lumma Stealer 样本,然后对解压后的 Lumma Stealer Payload 进行了反混淆。
| 属性 | 值 |
|----------|-------|
| SHA-256 | `de67d471f63e0d2667fb1bd6381ad60465f79a1b8a7ba77f05d8532400178874` |
| 恶意软件 | Go-based Loader |
| 构建日期 | 未知 (时间戳已剥离) |
| 架构 | x86_64 |
| 属性 | 值 |
|----------|-------|
| SHA-256 | `37fc0dc17d6168506a7584654495b5a77d915981e9a0fda2e17f8b219c4415eb`|
| 恶意软件 | Lumma Stealer (LummaC2) |
| 构建日期 | Jan 14 2026 |
| 架构 | x86 |
该加载器样本可在 [MalwareBazaar](https://bazaar.abuse.ch/sample/de67d471f63e0d2667fb1bd6381ad60465f79a1b8a7ba77f05d8532400178874/) 上找到。Payload PE 可以在 RunPE 注入 (WriteProcessMemory) 期间通过内存转储从加载器中提取。
## 反混淆结果
### 字符串与数据反混淆
处理了 **460 个独特的解密函数**中的 **610 个调用点**,**成功率为 100%**(0 次提取失败,0 次解密失败)。
| 类型 | 数量 | 描述 |
|------|------:|-------------|
| UTF-16LE 字符串 | 128 | 宽字符串 (Windows API 参数, URL, 路径, 命令) |
| UTF-8 字符串 | 73 | 窄字符串 (HTML 解析模式, HTTP 头, 关键字) |
| GUID | 8 | COM 接口 / CLSID 标识符 |
| Shellcode | 3 | 可执行代码块 (x64 syscall stubs, Heaven's Gate) |
| DWORD | 271 | 4 字节常量 (端口号, 状态码, API 哈希, 超时) |
| 其他二进制 | 125 | 原始二进制数据 (加密密钥, 小代码片段) |
| Layer 2 编码 | 1 | 需要二次解码的双重加密字符串 |
| UTF-16BE | 1 | 罕见的大端序字符串变体 |
| **总计** | **610** | |
识别并实现了 11 种不同的解密算法(经过 MBA 混淆的 XOR/ADD 运算)。
### 代码反混淆
| 技术 | 数量 | 工具 |
|-----------|------:|------|
| 间接跳转 (FF 25 → E9) | 288 | `lumma_fix_code_obfuscation.py` |
| CFF 调度器 (连续) | 399 | `lumma_fix_cff_v2.py` (也位于 `obfuscation_scan_results.json`) |
| CFF 调度器 (分离) | 68 | `lumma_fix_cff_v2.py` (仅 IDA 检测) |
| 清零的 Switch 表 | 7 | `fix_zeroed_switches.py` |
| jmp/call reg 代码恢复 | 12 | `lumma_code_deobfuscator.py` (阶段 A) |
| 死代码消除 | 1170 | `lumma_code_deobfuscator.py` (阶段 D) |
| 垃圾指令对 | 16 | `lumma_code_deobfuscator.py` (阶段 C, 可选) |
### 代表性解密样本
#### 字符串 (UTF-16LE / UTF-8)
```
0x0280FC35: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ..."
0x0281090C: "https://steamcommunity.com/profiles/76561199880317058"
0x028122CB: "cmd.exe \"start /min cmd.exe \"/c timeout /t 3 /nobreak & del \""
0x0281808A: "powershell -exec bypass"
0x0281CE27: "\REGISTRY\MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
0x0280ECDB: "
\n "
0x0280CCC7: "Content-Disposition: form-data; name=\""
```
#### GUID
```
0x0282A448: {00021401-0000-0000-C000-000000000046} (CLSID_ShellLink)
0x0282A48C: {000214F9-0000-0000-C000-000000000046} (IShellLinkA)
0x0282A4D0: {0000010B-0000-0000-C000-000000000046} (IPersistFile)
0x02844341: {4590F811-1D3A-11D0-891F-00AA004B2E24} (IWbemObjectSink)
0x02844391: {DC12A687-737F-11CF-884D-00AA004B2E24} (IClassFactory2)
```
## 脚本
### IDA Pro 脚本(按顺序运行)
| # | 脚本 | 描述 |
|---|--------|-------------|
| 1 | `lumma_fix_code_obfuscation.py` | 修补 `jmp [dword_XXXXXXXX]` 间接跳转 (FF 25 → E9 直接跳转)。恢复 IDA 代码流分析,覆盖约 288 个位置。 |
| 2 | `lumma_fix_cff_v2.py` | 修补 CFF (控制流平坦化) 调度器。处理连续 (`mov reg,[reg+reg*4]; jmp reg`) 和分离模式。4 个簇中约 467 个调度器。 |
| 3 | `fix_zeroed_switches.py` | 修复 7 个导致 Hex-Rays 中“switch 分析失败”的清零 switch 表。将每个表修补为跳转到默认 case。 |
| 4 | `lumma_code_deobfuscator.py` | 多阶段清理:(A) jmp/call reg 代码恢复,(B) CFF 区域的数据转代码,(C) 垃圾指令移除,(D) 死代码消除。 |
| 5 | `lumma_deobfuscator.py` | 主字符串/数据反混淆器。识别 460 个解密函数,提取加密的栈数据,使用 11 种 MBA 算法类型解密,添加 IDA 注释。 |
| 6 | `lumma_apply_layer2.py` | 将 Layer 2 解码结果写回 IDA 注释。 |
### 独立脚本
| 脚本 | 描述 |
|--------|-------------|
| `lumma_layer2_decoder.py` | 对双重加密条目应用第二层解码。 |
| `capstone_scan_obfuscation.py` | 基于 Capstone 的离线扫描器,无需 IDA 即可检测混淆模式。 |
## 用法
### IDA Pro 中的推荐执行顺序
```
1. lumma_fix_code_obfuscation.py # Fix indirect jumps (FF 25 → E9)
2. lumma_fix_cff_v2.py # Fix CFF dispatchers (NOP sequences)
3. fix_zeroed_switches.py # Fix zeroed switch tables
4. lumma_code_deobfuscator.py # Cleanup: jmp reg, dead code (default phases="ABD"; Phase C is opt-in)
5. lumma_deobfuscator.py # Decrypt strings and data
6. lumma_layer2_decoder.py # (standalone) Decode Layer 2 entries
7. lumma_apply_layer2.py # Apply Layer 2 to IDA comments
```
每个脚本均通过 IDA Pro 中的 **File > Script file** 运行(独立脚本除外,使用 Python 3 运行)。
所有脚本都提供 `revert_*()` 函数以撤销修补。请注意,脚本 4 中的 `revert_all_patches()` 会撤销所有脚本的所有字节修补。
## CFF 混淆分析
该二进制文件使用一种 CFF 变体,其中每个条件分支都被基于表的调度所取代:
```
[setcc reg] ; compute branch condition (0/1)
mov [esp+INDEX_OFF], reg ; store as index
mov REG_A, [esp+TABLE_OFF] ; load jump table pointer
mov REG_B, [esp+INDEX_OFF] ; load index
mov REG_A, [REG_A+REG_B*4] ; dereference table[index]
jmp REG_A ; dispatch
```
每个调度器在栈上都有自己的表/索引对(而不是共享的状态变量)。85 个调度器使用常量索引(总是跳转到相同的目标),126 个使用基于 `setcc` 的索引(混淆的条件分支),约 250 个使用计算索引。
修复策略将整个设置+调度序列 NOP 掉(平均每个调度器 21.4 字节),允许代码直接穿过。这是可行的,因为 98% 的调度器后面紧跟有效代码。
## 结果
`results/` 目录包含 JSON 格式的分析输出:
| 文件 | 描述 |
|------|-------------|
| `deobf_results.json` | 所有 610 个解密的字符串、二进制数据、GUID、DWORD 和 Shellcode,包含地址、算法类型和解密值。 |
| `obfuscation_scan_results.json` | Capstone 离线扫描结果:399 个连续 CFF 调度器,288 个间接跳转,16 个垃圾指令对,1198 个 MBA 簇以及反汇编模式。分离的调度器 (68) 仅由 IDA 脚本检测。 |
| `cff_cluster3_resolved.json` | 簇 3 的已解析 CFF 调度器目标(181/228 个调度器,包含跳转表条目和 setcc 类型)。 |
| `cff_cluster2_resolved.json` | 簇 2 的已解析 CFF 调度器目标(63/94 个调度器)。 |
## 已知局限性
这些脚本是仅针对目标样本 (SHA256 `de67d471...`) 验证的研究工具。
- **特定于样本的字节扫描**:`lumma_fix_cff_v2.py` 和 `lumma_fix_code_obfuscation.py` 使用原始字节模式扫描(非指令边界感知)来定位调度器设置序列。在其他二进制文件上的错误匹配可能导致错误的修补。这两个脚本都包含一个目标样本保护,用于检查原始 .text 哈希并在二进制文件不匹配时发出警告。
- **阶段 C EFLAGS 副作用**:`lumma_code_deobfuscator.py` 阶段 C 移除在数值上相互抵消的指令对 (add/sub, xor/xor, inc/dec),但这些指令会修改 EFLAGS。依赖这些标志位的后续 `jcc`、`setcc` 或 `cmov` 可能会改变语义。阶段 C 不包含在默认执行中 (`phases="ABD"`),必须通过 `phases="ABCD"` 显式选择加入。
- **Switch 寄存器匹配**:`fix_zeroed_switches.py` 在 `jmp reg` switch 之前的 5 条指令内搜索 `mov reg, [mem]`,而未验证寄存器一致性。实际上,此样本中的所有 7 个清零 switch 已经由 IDA 自动分析解析,因此该代码路径从未被执行。
## 未来工作
- **MBA 表达式简化**:Capstone 扫描器检测到 1198 个 MBA 表达式簇(其中 346 个是非循环的,可能是混淆而非合法的加密/哈希)。这些在 Hex-Rays 中会生成正确但复杂的伪代码。简化过程可以将 `((x & m) | (~x & ~m)) + k` 简化回 `x ^ m + k`。
- **推广到 Lumma 变体**:自动检测其他构建的算法参数、节布局和特定版本模式。
- **Layer 2 低置信度条目**:8 个置信度 < 0.60 的解码条目需要 IDA 运行时验证。
- **跨簇 CFF 流追踪**:枚举所有簇间跳转并追踪寄存器值以解析剩余的 Cluster 0/1 调度器。详见 `CFF_CROSS_CLUSTER_ANALYSIS.md`。
标签:DAST, DNS 反向解析, Go 语言加载器, Heaven's Gate, HTTP工具, IDA Pro 插件, LummaC2, Lumma Stealer, Python, RunPE 注入, Win32, x86_64, 云安全监控, 云资产清单, 信息窃取器, 去混淆工具, 威胁情报, 字符串解密, 开发者工具, 恶意样本分析, 恶意软件分析, 无后门, 网络安全, 网络安全审计, 脱壳, 逆向工具, 逆向工程, 隐私保护, 静态分析