KennethHelmuth/JS-Deobfuscator
GitHub: KennethHelmuth/JS-Deobfuscator
基于 Babel AST 的纯静态 JavaScript 反混淆工具,通过多 Pass 转换管道在不执行代码的前提下安全还原混淆脚本的可读形态。
Stars: 2 | Forks: 0
# JS-Deobfuscator 🛡️⚡
```
__ ____ ____ __ ____ __
/ // __/ / __ \ ___ ___ / /_ / __/__ __ ___ ____ ___ ___ / /_ ___ ____
__ / /_\ \ __ / /_/ // _ \/ _ \/ __// _// // / / /(_- __// _ `(_- __// _ \/ __/
\___//___/ /_/ /_____/ \___/\___/\__//_/ /_/ \_,_//___/\__/\_,_/___/\__/\___/_/
```
[](https://opensource.org/licenses/MIT)
[](https://nodejs.org/)
[](https://babeljs.io/)
[](#)
一个可用于生产环境、高度模块化的**纯静态** JavaScript 反混淆 CLI 工具。专为恶意软件分析师、安全研究员和逆向工程师打造,用于在不执行代码的情况下安全地分析混淆或打包的 JavaScript 代码(无 `eval`、无 VM 沙箱、不执行不受信任的代码)。
## 📖 目录
- [它是什么及为什么存在](#-what-it-is--why-it-exists)
- [已破解的混淆矩阵](#-defeated-obfuscation-matrix)
- [架构与技术栈](#-architecture--tech-stack)
- [安装](#-installation)
- [使用指南](#-usage-guide)
- [核心转换 Pass](#-core-transformation-passes)
- [运行测试](#-running-tests)
- [免责声明](#-disclaimer)
## 🔍 它是什么及为什么存在
现代的 JavaScript 混淆器(如 `javascript-obfuscator`、`Jasy` 或自定义打包器)通过打乱代码结构、平坦化控制流、编码字符串,以及将简单表达式封装在代理函数中来保护代码。
传统的反混淆工具通常依赖于动态分析、沙盒执行或基于 hook 的拦截。然而,在恶意软件分析中,**动态执行不受信任的脚本风险极高**。Dropper 或 Downloader 可能会检查沙箱环境、执行反分析检查,或者在你的机器上执行未经授权的 payload。
**JS-Deobfuscator** 通过使用 **100% 静态分析** 解决了这个问题。它将输入代码解析为 Babel 抽象语法树 (AST),通过可配置的类编译器 pipeline 运行安全的 pass,并重构出可读的、线性化的 JavaScript 代码。源脚本**绝对不会被执行**。
## 📊 已破解的混淆矩阵
| 混淆技术 | 破解机制 | Pass 名称 |
| :--- | :--- | :--- |
| **字符串数组编码** | 大型 base64/hex/unicode 数组和旋转 IIFE | `stringArray` |
| **代理函数** | 间接包装函数和对象映射 helper | `proxyInliner` |
| **算术与逻辑平坦化** | 常量表达式(例如 `1 + 2`, `![]`, `!![]`) | `constantFolding` |
| **控制流平坦化** | 封装在 while 循环中的 switch 语句 | `controlFlow` |
| **死代码 / 日志刷屏** | debugger 语句、console 日志、空块、无法到达的路径 | `deadCode` |
| **标识符混淆** | 无意义的十六进制 token(`_0x12af`, `a`, `b`)按类型/作用域重命名 | `renaming` |
## 🏗️ 架构与技术栈
JS-Deobfuscator 遵循**基于 Pass 的编译器 pipeline** 架构。
```
graph TD
A[Input Obfuscated JS] --> B[Parser: @babel/parser]
B --> C[Babel AST]
C --> D[Orchestrator: engine.js]
subgraph Passes [Configurable AST Transformation Passes]
D --> P1[1. stringArray]
P1 --> P2[2. proxyInliner]
P2 --> P3[3. constantFolding]
P3 --> P4[4. controlFlow]
P4 --> P5[5. deadCode]
P5 --> P6[6. renaming]
end
P6 --> E[Generator: @babel/generator]
E --> F[Readable Deobfuscated JS]
```
### 技术栈
- **Runtime:** Node.js (v18+)
- **AST 解析与遍历:** `@babel/parser`, `@babel/traverse`, `@babel/types`
- **代码生成:** `@babel/generator`
- **CLI 接口:** `commander`, `chalk`
- **测试框架:** `jest`
## ⚙️ 安装
### 前置条件
确保你已安装 [Node.js](https://nodejs.org/) v18 或更高版本。
### 全局安装(克隆仓库)
```
# Clone 仓库
git clone https://github.com/kennethHelmuth/JS-Deobfuscator.git
cd JS-Deobfuscator
# 安装 production 和 development 依赖
npm install
# 全局 link package(安装 'js-deobfuscator' 命令)
npm link
```
### 通过 npx 运行(本地开发)
要在不进行全局安装的情况下直接运行,请使用 node:
```
node src/cli.js --help
```
## 🚀 使用指南
```
# 基本用法:deobfuscate 文件并输出至 deobfuscated.js
js-deobfuscator input.js -o deobfuscated.js
# 直接输出到 stdout(用于 piping)
js-deobfuscator input.js | grep "domain.com"
# 通过在 Safe Mode 下运行来禁用 aggressive transformations
js-deobfuscator input.js -o deobfuscated.js --safe-mode
# 指定要运行的确切 passes
js-deobfuscator input.js -o deobfuscated.js --passes stringArray,constantFolding
# 启用详细的 AST debugging 日志
js-deobfuscator input.js -o deobfuscated.js --debug
# 导出概述所有已应用 transformations 的 JSON 报告
js-deobfuscator input.js -o deobfuscated.js --report report.json
```
### 预期输出示例
#### 输入(已混淆):
```
var _0x5b6c = ["\x68\x65\x6c\x6c\x6f", "\x77\x6f\x72\x6c\x64"];
var _0x3e4f = {
"add": function(a, b) { return a + b; }
};
var a = 10 + 5;
var res = _0x3e4f.add(_0x5b6c[0], _0x5b6c[1]);
```
#### 输出(反混淆后):
```
var num_1 = 15;
var str_1 = "helloworld";
```
## 🛠️ 核心转换 Pass
### 1. 字符串数组解析器 (`stringArray`)
分析分配给字符串字面量数组的变量,识别关联的自调用 shift/rotation 函数,并使用我们自定义的 AST 解释器安全地模拟它们。评估并内联 decode helper 调用,返回实际的字符串字面量。
### 2. 代理函数内联器 (`proxyInliner`)
定位代理对象和包装函数,这些函数的唯一功能是调用其他例程或评估算术表达式。将它们的表达式内联以清理调用栈层级。
### 3. 常量折叠与传播 (`constantFolding`)
折叠像 `"a" + "b"`(变成 `"ab"`)或 `!![]`(变成 `true`)这样的静态操作,并传播被定义为常量且从未被重新赋值的变量。
### 4. 控制流反平坦化 (`controlFlow`)
撤销控制流平坦化(即将顺序代码块封装在循环内的 switch 语句的 case 中)。顺序追踪执行路由并输出干净的线性块级作用域。
### 5. 死代码消除 (`deadCode`)
移除 console 刷屏、debugging 行、空语句和无法到达的语句(例如 `return` 之后的代码,或 `if(false)` 块内部的代码)。
### 6. 作用域感知重命名 (`renaming`)
利用 Babel 的作用域绑定,将像 `_0x2a3e` 这样被混淆的十六进制标识符重命名为干净的、派生自类型的变量名,例如 `str_1`、`num_2` 或 `func_1`,以保证名称隔离。
## 🧪 运行测试
在 `tests/` 下配置了全面的单元测试套件,用于针对模拟的混淆代码模板运行每一个 pass。
```
npm run test
```
## ⚠️ 免责声明
此工具专为**安全研究、恶意软件分析和教育目的**而创建。在专有商业软件上使用此工具需遵守当地法律和许可协议。作者对滥用此工具不承担任何责任。
标签:CMS安全, DAST, JavaScript, MITM代理, 云安全监控, 云资产清单, 反混淆, 恶意软件分析, 自定义脚本, 逆向工程, 静态分析