JavaScript 反混淆工具指南

一、先识别混淆类型

拿到一段乱码一样的 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 环境下一行命令解决。

典型用法: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/

image-20260622111143845

deobfuscate.relative.im — synchrony 项目官方 demo:https://deobfuscate.relative.im/

image-20260622111213784

deobfuscate.io — ben-sb/javascript-deobfuscator 项目官方 demo,支持字符串还原、常见混淆变换:https://deobfuscate.io/

image-20260622111224108

针对 obfuscator.io

obf-io.deobfuscate.io — ben-sb/obfuscator-io-deobfuscator 项目官方 demo,专攻 obfuscator.io 输出:https://obf-io.deobfuscate.io/

image-20260622111233349

轻量美化(de4js 同款体验)

lelinhtinh/de4js — 原作者 Thành Lê(GitHub: lelinhtinh)个人域名下的镜像部署,界面与原 de4js 一致:https://thanhle.io.vn/de4js/

image-20260622111247395

多引擎聚合

deo.sigr.io — 聚合多种反混淆引擎,不知道源混淆器是什么时挨个试:https://deo.sigr.io/

image-20260622111258457

五、选型流程

  1. 30 秒识别 → 查表确认混淆类型
  2. 第一站:webcrack(通用,覆盖面最广)
  3. 第二站:synchrony(专攻 obfuscator.io)
  4. 第三站:专用工具(js-beautify / decode-js)
  5. 兜底:babel 手写 AST

几条经验:

  1. 工具要串行用,不要并行。每个工具擅长不同变换,串起来跑往往比单个工具死磕效果好。
  2. 保留每一步的中间结果,万一后面工具搞崩了可以回退。
  3. 别追求 100% 还原。变量名丢了就是丢了,能恢复语义结构和字符串字面量就是成功。
  4. 静态实在搞不定,丢浏览器 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 拆模块,再逐个模块反混淆。

上一篇
下一篇