文章目录
- 常见js混淆原理和特征
-
- [1. 混淆](#1. 混淆)
-
- [1.1 OB混淆](#1.1 OB混淆)
- [1.2. eval混淆](#1.2. eval混淆)
- [1.3. AAEncode混淆(表情包加密)](#1.3. AAEncode混淆(表情包加密))
- [1.4. JSFuck 混淆](#1.4. JSFuck 混淆)
- [1.5. JJEncode 混淆](#1.5. JJEncode 混淆)
- [1.6. Sojson 混淆](#1.6. Sojson 混淆)
常见js混淆原理和特征
1. 混淆
1.1 OB混淆
- 定义 :OB 混淆全称 Obfuscator,Obfuscator 其实就是混淆的意思,官网:https://obfuscator.io/ ,其作者是一位叫 Timofey Kachalov 的俄罗斯 JavaScript开发工程师,早在 2016 年就发布了第一个版本。
- 特征 :
- 一般由一个大数组或者含有大数组的函数、一个自执行函数、解密函数和加密后的函数四部分组成;
- 函数名和变量名通常以 _0x 或者 0x 开头,后接 1~6 位数字或字母组合;
- 自执行函数,进行移位操作,有明显的 push、shift 关键字;
- 在线转换 :https://webfem.com/tools/js-decode/index.html
1.2. eval混淆
- 定义:eval(string) ,可计算某个字符串,并执行其中的的 JavaScript 代码。 有返回值
- 特征 :想要运行
字符串的值,只能通过明文的eval()函数执行,然后里面的字符串可能是多层加密的,我们通常在eval处下断点。
1.3. AAEncode混淆(表情包加密)
- 定义:利用 JavaScript 的类型转换和运算符特性,将字符编码映射成特定的符号组合,其本质是:
原始字符 → Unicode 码点 → 特定的表情符号/符号序列 → 通过 eval() 执行 - 特征:由表情符号如
゚ω゚、ノ、`ー´等组成的看似乱码的字符串的混淆技术,在浏览器中执行后能还原出原始代码。 - 在线转换:https://www.sojson.com/aaencode.html
- 查看代码:


1.4. JSFuck 混淆
- 定义:JSFuck 利用 JavaScript 的
类型转换和隐式转换特性,通过这六个字符的组合,表达出数字、字符串、数组、对象、函数等所有 JavaScript 的基本元素。 - 特征:JSFuck 是一种极端的 JavaScript 混淆技术,它只使用六个字符
[ ] ( ) ! +就能编写出任何有效的 JavaScript 代码。 - 在线转换:https://www.sojson.com/jsfuck.html#google_vignette
- 官网:https://jsfuck.com/
1.5. JJEncode 混淆
- 定义:JJEncode 是一种 JavaScript 混淆编码工具,由日本作者 Yosuke HASEGAWA 于 2009 年开发,它可以将任意 JavaScript 代码转换成仅使用 18 个符号的混淆形式:
[]()!+,\"$.:;_{}~=。 - 特征:代码以自执行函数(IIFE)形式呈现,混淆后的代码极度压缩,所有变量被替换为 $、_ 等短符号,配合数组和字符串操作动态构造出原始代码。
javascript
$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,...})();
- 在线转换:https://toolwa.com/jjencode/
- 查看代码:同
AAEncode混淆
1.6. Sojson 混淆
- 定义:Sojson 是一款针对 JavaScript 代码的商业级混淆加密工具,其核心原理是多层复合混淆 + 主动防御。与 JSFuck、JJEncode 等编码型混淆不同,Sojson 的目标不仅是让代码难以阅读,更是主动防止攻击者对代码进行调试和格式化,属于高强度的代码保护方案。Sojson 是一款针对 JavaScript 代码的商业级混淆加密工具,其核心原理是多层复合混淆 + 主动防御。与 JSFuck、JJEncode 等编码型混淆不同,Sojson 的目标不仅是让代码难以阅读,更是主动防止攻击者对代码进行调试和格式化,属于高强度的代码保护方案。
- 特征:
Sojson 通过多种技术的组合,构建其防护体系:
| 技术手段 | 原理说明 | 代码示例/表现 |
|---|---|---|
| 变量名混淆 | 将有意义的变量、函数名替换为 _0x43a11d、_0x24372d 等随机十六进制字符串,彻底抹去语义信息 。 |
var userName = "admin" → var _0x2e3f = "admin" |
| 字符串加密 | 将代码中的字符串字面量(如URL、Key)转换为十六进制、Unicode 或自定义编码形式,运行时再动态解密还原 。 | "https://api.example.com" → '\x68\x74\x74\x70...' |
| 控制流平坦化 | 将原本顺序、循环、分支等执行逻辑,打散为一个由 switch-case 或 while 驱动的状态机,真实执行顺序由状态变量控制,极大增加分析难度 。 |
将 if...else 重构为 switch(state){ case 0:...; state=1; break; case 1:... } 的形式 |
| 死代码注入 | 在代码中插入大量无用或永远不会执行的代码片段和函数调用,干扰分析者的视线,增加阅读量 。 | 在关键逻辑间随机插入 var _0x1234 = 123; 或调用空函数。 |
| 压缩成一行的代码 | 将整个代码库删除所有换行和多余空格,压缩为单行。这是混淆的第一步,旨在破坏代码的可读性和基础的格式化工具 。 | 多行易读的代码被强制压缩为一长行字符串。 |
| 防止格式化 | 正则、死循环 等手段 | 如果调试时对代码进行了格式化, 陷入的卡死状态就是注入的死代码导致的 |
参考文章: JavaScript混淆
感谢关注【遇事不決洛必達】!欢迎点赞收藏和交流指正,我会持续分享我的学习经验和心得。