一、先识别混淆类型
拿到一段乱码一样的 JavaScript,别急着上工具。反混淆工具不是万能的,每种工具只擅长一类混淆。下手前花 30 秒看代码特征,再按表对症下药:
| 特征 | 大概率来源 | 对症工具 |
|---|---|---|
函数名都是 _0x 开头的十六进制 |
obfuscator.io | synchrony |
| 顶部有大字符串数组 + 旋转函数 | obfuscator.io | synchrony |
控制流是 while(true) switch(...) |
控制流平坦化 | synchrony |
整段代码包在 eval(function(p,a,c,k,e,d) 里 |
Dean Edwards packer | js-beautify |
看到奇怪命名(QAQ、ooo0o0 等) |
sojson v4/v5 | decode-js |
整体是个超大 IIFE,里面有 __webpack_require__ |
webpack 打包 | webcrack |
仅变量名被压缩(a、b、c)但结构正常 |
仅 minify | prettier / webcrack |
二、工具能力矩阵
不同工具覆盖的混淆类型不一样,选错工具等于白跑。下表是实测的能力边界:
| 工具 | 字符串数组旋转 | 控制流平坦化 | webpack 打包 | sojson | eval/packer |
|---|---|---|---|---|---|
| webcrack | ❌ | ⚠️ 部分 | ✅ | ❌ | ❌ |
| synchrony | ✅ | ✅ | ❌ | ❌ | ❌ |
| js-beautify | ❌ | ❌ | ❌ | ❌ | ✅ |
| decode-js | ⚠️ 部分 | ⚠️ 部分 | ❌ | ✅ | ❌ |
✅ 强项 / ⚠️ 部分支持 / ❌ 不支持
三、工具链
通用反打包 / 反压缩
webcrack — 当前最活跃的项目。能拆 webpack bundle、还原压缩变量名、解开 webpack 模块内的字符串字面量数组。2026 年的「首选第一站」。注意:它处理的是 webpack 风格的字符串数组,不是 obfuscator.io 风格的字符串数组旋转(那是 synchrony 的活)。
典型用法:npx webcrack input.js -o output/,会把拆出来的模块按目录结构摊开。
prettier — 只做美化,速度快,用来先格式化代码再喂给后续工具。
典型用法:npx prettier --write input.js。
针对 obfuscator.io
synchrony — relative 作者的命令行工具,专攻 obfuscator.io 输出,目前社区主流。控制流平坦化、字符串数组旋转、死代码注入、数字常量混淆都能处理。
典型用法:npx synchrony deobfuscate input.js,会在同目录生成 .deobf.js。
eval / packer 类
js-beautify — 主流美化工具(npm 几十万 star 量级),内置 unpackers/packer 模块,专解 Dean Edwards packer(eval(function(p,a,c,k,e,d){...}) 格式)。不需要单独装其他工具,Node 环境下一行命令解决。
- GitHub:https://github.com/beautify-web/js-beautify
- 文档:https://github.com/beautify-web/js-beautify/blob/main/python/jsbeautifier/unpackers/packer.py
典型用法:npx js-beautify input.js,会自动识别 packer 格式并解包。
国产混淆器
decode-js — echo094 作者的 Babel AST 工具,支持 sojson v4/v5/v7、jsjiami、obfuscator.io。该领域开源工具稀少,这是目前相对最完整的实现。
jsjiami v6/v7 有专门的破解脚本,GitHub 搜「decode-jsjiami」。
在线破解工具 — 部分国内站点提供 sojson 在线破解(搜索「sojson 在线解密」),适合不想装 Node 环境的快速尝试。注意:上传代码存在泄露风险,敏感样本不要用。
AST 手工
自动工具覆盖不到的(自定义混淆、奇葩控制流),上 AST:
babel + @babel/traverse — 主流方案。
swc — Rust 实现,更快。
oxc — 2025 年崛起的 Rust AST 工具。
四、在线工具速查表
按用途分组,不想装 Node 环境时用:
通用反混淆
webcrack.netlify.app — webcrack 官方在线版,体验与命令行一致:https://webcrack.netlify.app/
deobfuscate.relative.im — synchrony 项目官方 demo:https://deobfuscate.relative.im/
deobfuscate.io — ben-sb/javascript-deobfuscator 项目官方 demo,支持字符串还原、常见混淆变换:https://deobfuscate.io/
针对 obfuscator.io
obf-io.deobfuscate.io — ben-sb/obfuscator-io-deobfuscator 项目官方 demo,专攻 obfuscator.io 输出:https://obf-io.deobfuscate.io/
轻量美化(de4js 同款体验)
lelinhtinh/de4js — 原作者 Thành Lê(GitHub: lelinhtinh)个人域名下的镜像部署,界面与原 de4js 一致:https://thanhle.io.vn/de4js/
多引擎聚合
deo.sigr.io — 聚合多种反混淆引擎,不知道源混淆器是什么时挨个试:https://deo.sigr.io/
五、选型流程
- 30 秒识别 → 查表确认混淆类型
- 第一站:webcrack(通用,覆盖面最广)
- 第二站:synchrony(专攻 obfuscator.io)
- 第三站:专用工具(js-beautify / decode-js)
- 兜底:babel 手写 AST
几条经验:
- 工具要串行用,不要并行。每个工具擅长不同变换,串起来跑往往比单个工具死磕效果好。
- 保留每一步的中间结果,万一后面工具搞崩了可以回退。
- 别追求 100% 还原。变量名丢了就是丢了,能恢复语义结构和字符串字面量就是成功。
- 静态实在搞不定,丢浏览器 DevTools 下断点看运行时值,反推源码意图。
六、常见坑
Q:webcrack 跑出来还是乱码?
A:大概率源代码不是 webpack 打包,也不是单纯压缩。先看识别表,如果是 obfuscator.io 输出,换 synchrony。
Q:synchrony 报「Not an obfuscator.io output」?
A:就是字面意思,源混淆器不是 obfuscator.io。国产混淆器走 decode-js,packer 走 js-beautify。
Q:AST 处理字符串数组旋转时变量引用错位?
A:obfuscator.io 的字符串数组会在运行时被 IIFE 旋转 N 次。AST 还原前必须先静态执行这个旋转函数,否则索引全错。synchrony 内部已经处理,手写时要自己实现。
Q:sojson v5 解出来还是看不到关键逻辑?
A:sojson v5 会在关键函数外再包一层「壳函数」,需要先剥壳。decode-js 最新版有处理,老版本可能漏。
Q:源代码几十 MB,工具跑不动或直接 OOM?
A:先用 prettier 切片(按行数拆分)分批处理;或换 swc / oxc 等 Rust 工具,比 babel 快 10 倍以上。webpack bundle 太大的情况,先用 webcrack 拆模块,再逐个模块反混淆。