前端代码是明文发给你的,所以对抗全在混淆上。按难度排一下常见形态:
1. 压缩 / 变量名替换
a、b、c 这种。严格说不是混淆,是压缩的副作用。Chrome DevTools 的 Pretty Print 加上手动重命名就够了。
2. 字符串数组 + 解密函数
所有字符串抽到一个大数组里,用 _0x1a2b(idx) 取。这是 obfuscator.io 的典型产物。拆法:把解密函数抠出来单独跑,然后用 AST 遍历,把所有调用替换成计算结果。
3. 控制流平坦化
while(true) + switch 的分发器结构。和二进制里的 CFG 平坦化是同一套东西。拆法也一样:找状态变量、枚举块、重建边。
4. 死代码注入 + 不透明谓词
塞一堆永远不执行的分支。拆法:常量传播 + 化简,能静态求值的条件直接折叠掉。
5. JS 虚拟机
把逻辑编译成自定义字节码,附带一个解释器。这是天花板,工作量和逆二进制 VM 保护同级。
工具
主力是 Babel —— 解析成 AST、写 plugin 做变换、再生成回来。AST-hunter、webcrack 这类是封装好的常见变换集合。
一个心得:不要试图"看懂"混淆代码,要写变换脚本让它变好看。手动读 obfuscator.io 的产物是纯粹的时间浪费。