espertar/SomalifuscatorV2-Deobfuscator
GitHub: espertar/SomalifuscatorV2-Deobfuscator
这是一款 C++ 编写的 SomalifuscatorV2 批处理混淆器专用静态反混淆工具,通过 13 阶段 pipeline 逆转各层混淆以还原原始脚本逻辑。
Stars: 0 | Forks: 0
# SomalifuscatorV2 反混淆器
一款用于对 **SomalifuscatorV2** 混淆器生成的 `.bat` 文件进行静态反混淆的 C++ 工具。
它能够逆转每一层混淆 —— 包括 sandwich 变量、caret 转义、env-var 子字符串、`for /l` 包装器、Caesar cipher、KDOT seeds、ran1/ran2 随机后缀模式,以及基于 goto 的 scrambler 控制流。
## 用法
```
SomalifuscatorV2-Deobfuscator.exe [output.bat]
```
如果省略 `output.bat`,默认在同一目录下输出 `_deobf.bat`。
## Pipeline
该反混淆器运行一个 13 阶段的 pipeline。每个阶段将其输出传递给下一个阶段:
| 阶段 | 目的 |
|-------|---------|
| 0 | **Sandwich + caret** — 解析 `%RAND%%char%%RAND%` sandwich 模式并移除 `^` 转义字符 |
| 1 | **Env var 子字符串** (早期) — 根据已知的 Windows 路径和实时系统环境变量,解析 `%PROGRAMFILES:~8,1%` 等。在 unwrap 之前运行,以便结构行具有人类可读性 |
| 2 | **For /l unwrap** — 展开 `for /l %%g in (N,N,N) do (set "var=val")` → `set "var=val"` |
| 3 | **冗余移除** — 清除填充了非 ASCII 乱码的 `::` 注释块 |
| 4 | **防篡改移除** — 删除由 K.dot 编写的注释、echo 检查 killswitch、DADDYSERVER/logonserver 检查、`taskkill cmd.exe`、wmic VM 检测、AntiConsole 等 |
| 5 | **Caesar 提取** — 扫描 `set "X1=c"` 定义并构建字符映射 |
| 6 | **De-scrambler** — 从基于 goto 的控制流中重建原始执行顺序。解析 `set /a` + `goto` + `:label` 三元组,计算数学表达式,并跟踪 after-section 中的 labels |
| 7 | **死代码移除** — 清除 no-op 条件语句、`doskey`、`mshta`、`timeout 0`、`echo %random%` 等 |
| 8 | **ran1/ran2 解析** — 清除随机后缀:`%CaesarVar%%RANDOM_5PLUS%` → `%CaesarVar%` |
| 9 | **Caesar 替换** — 使用阶段 5 生成的映射将 `%X1%`` 替换为 `c` (带回调的单次正则表达式遍历) |
| 10 | **KDOT 解析** — 提取 62 字符的 `set KDOT=...` seed,解析 `%KDOT:~N,1%` 子字符串引用和纯粹的 `%KDOT%` |
| 11 | **残留清理** — 移除非合法变量的多余 `%RAND_5PLUS%` 模式 |
| 12 | **最终清理** — 丢弃多余的 labels、goto 片段、`set /a` 残留物、重复的 `@echo off` / `chcp 65001 > nul` 以及末尾空行;对连续重复的行进行去重 |
## 项目结构
```
src/
├── main.cpp CLI entry point
├── deobfuscator.h/.cpp Pipeline orchestrator
├── phases/
│ ├── context.h Shared pipeline state (caesar map, KDOT, env)
│ ├── phase0_sandwich Sandwich + caret
│ ├── phase1_env_substring Env var substrings
│ ├── phase2_for_loops For /l unwrap
│ ├── phase3_bloat Bloat comments
│ ├── phase4_anti_tamper Anti-tamper + anti-VM
│ ├── phase5_caesar_extract Caesar def extraction
│ ├── phase6_descramble Goto-based control flow
│ ├── phase7_dead_code Dead code patterns
│ ├── phase8_ran1 ran1/ran2 random suffix
│ ├── phase9_caesar_subst Caesar substitution
│ ├── phase10_kdot KDOT seed + substrings
│ ├── phase11_residual Residual %VAR% removal
│ └── phase12_cleanup Final cleanup + dedup
└── utils/
├── console ANSI color output (Windows VT)
├── regex_utils Regex helpers
├── string_utils Strip, normalize, escape, split/join
├── env_vars Known Windows paths + live env
├── math_eval set /a expression parser/evaluator
└── file_io UTF-8 / UTF-16 BOM file I/O
```
## 输出
反混淆后的文件**几乎达到了 100% 的还原度**。原始逻辑**完全清晰可读** —— 每个 `if`、`for`、`echo`、变量赋值和控制流语句都已恢复为原始形态。
输出中可能存在微小的残留痕迹:多余的 `set KDOT=...` 行、遗留的 `>nul` 重定向,或者关键字的大小写变体(例如是 `@ECho off` 而不是 `@echo off`)。这些都属于表面问题 —— 它们丝毫不会影响代码的可读性或恢复出的逻辑。原始的代码流和意图被完整保留。
## 算法说明
- **Caesar 轮换**在每次混淆运行时为 `random.randint(1, 13)`。反混淆器不需要知道轮换数字 —— 它直接从混淆文件中的 `set "X1=c"` 定义里提取字符映射。
- **KDOT** 是 `[a-zA-Z0-9]` 的 62 字符随机排列组合。`ran2` 路径使用 `%KDOT:~N,1%` 来引用单个字符。反混淆器会提取 seed 并解析所有引用。
- **`strip_vars`** 会移除 `%RAND_VAR_5PLUS%` 模式(scrambler 的随机变量名总是 5 个字符或以上),同时保留像 `%ans%`、`%cd%`、`%KDOT%` 这样的短变量。
- **de-scrambler** 使用原生的递归下降解析器 (`math_eval.cpp`) 来计算 `set /a` 表达式,该解析器支持十六进制、八进制、十进制、按位运算 (`~ ^ & | << >>`)、算术和括号 —— 过程中不涉及任何 `eval()`。
- 文件读取会自动处理 **UTF-16 LE BOM** (`FF FE`) 和普通的 **UTF-8** 格式。
标签:C++, DAST, 云资产清单, 反混淆, 恶意软件分析, 批处理, 数据擦除, 端点可见性, 逆向工程