JS混淆是不是纸老虎?

本文通过实验验证JS代码混淆的有效性,使用JShaman平台对示例代码进行混淆处理,结果显示混淆后的代码难以被轻易解读,证明JS混淆是有效的代码保护手段。进一步测试反混淆工具,发现无法完全还原原始代码,特别是变量名等关键信息无法恢复。

关于JS代码混淆,一直有两种观点。

一种观点认为很有用,是JS代码保护的重要手段,这是主流观点。

但也见到少数人称不管用,是纸老虎,混淆后的代码还能读懂,随随便便就能破解。

 

哪种观点才是正确的呢?我们通过实验来证明。

实验使用JShaman平台,这是一个专业的JS代码混淆加密平台。

测试用代码,就使用平台提供的例程,简单的几行:

 

保护选项,去掉默认的“压缩代码”功能,为方便我们查看混淆后的代码。

 

一键完成混淆,得到保护后的代码:

 

跟前面保护前的4行代码相比,很显然复杂了很多,跟原始代码相比差别很大,绝不是随便就看看出代码逻辑和功能的。这还只是使用默认的保护选项,保护等级比较低,因此在代码中还有“hello world”字符串能被看到。

如果使用更多的保护选项,提高混淆强度,又会如何呢?

多勾选两个混淆选项:

 

再次一键完成保护,得到:

 

可以看到,这次得到的保护结果更为复杂。短时间、甚至长时间也不容易读懂并还原回原有的代码逻辑。

实验到这里,显然可以说:JS混淆,不是纸老虎,是真有用。

那么,混淆后的代码,是否可以进行反混淆,还原为原始代码呢?

有的人认为可以。实验继续进行:

对保护后的代码反混淆,通常用esprima、escodegen。

我们准备以下代码实现一个反混淆工具

 

注意在代码中,传入了要进行反混淆的代码,即上面我们混淆的结果。

运行,得到反混淆结果:

 

可以看到,确实条理化了代码,但远远没有还原回原本的代码,还记的原本的代码,对比一下:

 

而且我们可以思考一下:比如有一个变量名:car,它是一个有字面意义的变量。经混淆后,它会被变成随字符串,比如:_0x12345。在反混淆时,反混淆程序、工具,无论如何也不可能知道它原本的名称是car。那么,也就绝对不可能把代码完好还原回去。

实验结果证明:JS混淆,是有效的JS代码保护方式!

你的问题非常好!我们来澄清一下: --- ## ✅ 正确术语是:**AST 混淆**(Abstract Syntax Tree Obfuscation) ### ❌ **ALT混淆** 并不是一个标准术语,它可能是对某些高级混淆技术的非正式称呼,或者某些混淆工具的特定输出风格(如 AltJS),但不是广泛认可的技术术语。 --- ## ✅ AST 混淆(抽象语法树混淆)是标准术语 AST 混淆是指通过**修改 JavaScript 的抽象语法树结构**,使代码在语法结构上变得难以理解和分析,但保持其运行时行为不变。 ### AST 是什么? AST(Abstract Syntax Tree)是 JavaScript 源代码的结构化表示。例如: ```javascript function add(a, b) { return a + b; } ``` 在 AST 中,它会被表示为一个树形结构,包含函数声明、参数、返回语句、操作符等节点。 --- ## 🧠 AST 混淆的原理 AST 混淆工具会: 1. 解析原始代码为 AST。 2. 对 AST 进行变换,例如: - 将函数体拆分成多个表达式。 - 插入无意义的节点。 - 改变控制流结构(如将 `if` 转换为 `switch`)。 - 使用 `eval`、`new Function()` 动态执行代码。 3. 将变换后的 AST 重新生成 JavaScript 代码。 --- ## 🧪 AST 混淆示例 ### 原始代码: ```javascript function greet(name) { console.log("Hello, " + name); } ``` ### AST 混淆代码(模拟): ```javascript (function(_0x1234, _0x5678) { var _0x9abc = function(_0xdef) { while (--_0xdef) { _0x1234['push'](_0x1234['shift']()); } }; _0x9abc(++_0x5678); })(['log', 'Hello, '], 0x1f5); var _0xgreet = function(name) { console[_0x1234[0]](_0x1234[1] + name); }; _0xgreet('Alice'); ``` 在这个例子中: - 字符串被提取到数组中并加密。 - 使用了自执行函数来混淆变量作用域。 - 控制流被打乱。 - 函数结构被重构。 --- ## 🛠️ 支持 AST 混淆工具 | 工具名称 | 是否支持 AST 混淆 | 特点 | |----------|--------------------|------| | [JavaScript Obfuscator](https://obfuscator.io/) | ✅ | 支持 AST 变形、控制流混淆、字符串加密 | | [Babel + 自定义插件](https://babeljs.io/) | ✅ | 可以手动编写插件实现 AST 混淆 | | [AltJS](https://github.com/43081j/alt) | ✅ | AST 转换实验性工具 | | [Terser](https://terser.org/) | ❌(部分) | 主要用于压缩,不支持 AST 混淆 | | [JScrambler](https://jscrambler.com/) | ✅ | 商业工具,支持 AST 混淆和多态变异 | --- ## 🔍 总结对比 | 术语 | 含义 | 是否标准 | |------|------|-----------| | **AST 混淆** | 通过修改抽象语法树结构进行代码混淆 | ✅ 是标准术语 | | **ALT混淆** | 非标准术语,可能指代 AST 混淆或某些工具的输出风格 | ❌ 非标准术语 | --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值