让混淆不再成为逆向分析中的绊脚石。基于 Babel AST 的自动化 JS 反混淆工具,提供在线 Playground、命令行与可编程 API。
- Playground: https://js-deobfuscator.vercel.app/
- 代码在浏览器内执行,可调整参数实时查看反混淆效果。
- 解密入口定位:按字符串数组长度、解密器调用次数或手动注入代码/解密器名称进行定位。
- 字符串解密:识别字符串数组与旋转器,展开解密器封装并用明文替换调用点。
- 控制流还原:展开控制流平坦化、移除死代码/花指令、合并对象属性与赋值。
- 代码整形:unminify、美化、变量重命名(hex/short/custom),可选关键字标记。
- 自卫清理:移除 self-defending / anti-debug 逻辑,支持多轮执行处理重度混淆。
- 多形态使用:CLI、浏览器 Playground、TypeScript API,并附带真实案例集合。
git clone https://github.com/kuizuo/js-deobfuscator
cd js-deobfuscator
pnpm install
# 处理单个文件并写入目录 (生成 output.js)
pnpm exec deob path/to/input.js -o ./out
# 也可通过 stdin 使用
cat path/to/input.js | pnpm exec deob > output.js快速体验:将混淆代码放到 tmp/input.js,执行 pnpm tmp,结果会输出到 tmp/output.js。
import { readFileSync } from 'node:fs'
import { defaultOptions, Deob } from 'deob'
const code = readFileSync('input.js', 'utf8')
const deob = new Deob(code, {
...defaultOptions,
decoderLocationMethod: 'callCount',
decoderCallCount: 300,
inlineWrappersDepth: 3,
mangleMode: 'hex',
})
const { code: cleanCode, save } = deob.run()
await save('./out') // 写入 out/output.jsexample/ 下收录了多组真实混淆样本,每个子目录包含:
index.ts: 配置/驱动脚本(建议使用 tsx 执行)。input.js/output.js/pretty.js: 输入、还原结果与美化对比。setupCode.js: 运行前注入的自定义代码。errorCode.js: 替换失败时的错误片段输出。
packages/deob: 核心 AST 变换与 CLI (deob二进制)。website: Nuxt 3 + Monaco 的在线 Playground。example: 真实混淆案例与演示脚本。tmp: 简单的本地快速体验目录。
该项目引用并受到 j4k0xb/webcrack 的启发,以及书籍 反爬虫 AST 原理与还原混淆实战。
