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, 云资产清单, 反混淆, 恶意软件分析, 批处理, 数据擦除, 端点可见性, 逆向工程