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, 云安全监控, 云资产清单, 信息窃取器, 去混淆工具, 威胁情报, 字符串解密, 开发者工具, 恶意样本分析, 恶意软件分析, 无后门, 网络安全, 网络安全审计, 脱壳, 逆向工具, 逆向工程, 隐私保护, 静态分析