DragonDragging/minifier-deobfuscator-bugs
GitHub: DragonDragging/minifier-deobfuscator-bugs
揭示 JavaScript 压缩器 Terser 的副作用检测缺陷以及反混淆工具 Webcrack 在处理自重定义闭包模式时的语义丢失问题,为改进静态分析工具提供参考。
Stars: 0 | Forks: 0
# Terser 副作用检测与 Webcrack 反混淆 Bug
本 README 涵盖了两个相关主题:
1. 检测被 **Terser** 等压缩器移除的副作用。
2. Webcrack 中与自重定义查找表相关的反混淆 Bug。
## Terser 副作用检测
此代码片段用于检测 JavaScript 压缩器(例如 **Terser**)是否移除了它认为“未使用”的表达式。
它依赖于 **`Symbol.toPrimitive` 内部的副作用**。
当该对象被用于算术运算(`breakingObject * 2`)时,JavaScript 必须将其转换为数字,从而触发 `Symbol.toPrimitive`。
如果压缩器移除了该表达式:
```
breakingObject * 2
```
转换将不会发生,副作用也会被跳过。
结果
错误调用
思路
压缩器有时会移除结果未被使用的表达式,即使这些表达式通过隐式转换包含隐藏的副作用。
Bug:自重定义查找表的错误转换
原始代码
```
function decodeFunction(index) {
var lookupTable = createLookupTable();
decodeFunction = function(index) {
return lookupTable[index];
};
}
function createLookupTable() {
var lookupTable = [];
createLookupTable = function() {
return lookupTable;
};
return createLookupTable();
}
(() => {})(createLookupTable());
```
代码功能
这是一个自重定义函数修改模式,通常由 javascript-obfuscator (obfuscator.io) 生成。
输出结果:
(() => {})(__STRING_ARRAY__());
错误原因
createLookupTable() 不仅仅是一个简单的字符串数组提供者。
在转换过程中丢失的重要属性:
自重定义行为
针对 lookupTable 的闭包
运行时初始化步骤
反混淆器假设该函数等同于静态数组提供者,但这并不能保证。
影响
这种转换破坏了语义:
用 __STRING_ARRAY__ 替换它会移除闭包。
总结
反混淆器错误地将自重定义闭包模式视为静态字符串数组提供者,从而产生:
(() => {})(__STRING_ARRAY__());
而不是保留原始的运行时行为。
结论
Terser 副作用检测:有助于识别被压缩器移除的隐藏副作用。
Webcrack 反混淆 Bug:演示了当自重定义闭包模式被误判为静态数组时,是如何导致破坏的。
两者都强调了在处理混淆 JavaScript 时保留运行时行为的重要性。
标签:Bug 复现, CMS安全, DNS 反向解析, DoH影响, IP 地址批量处理, JavaScript, javascript-obfuscator, Terser, Webcrack, 云安全监控, 云资产清单, 代码压缩, 代码反混淆, 代码混淆, 前端安全, 副作用检测, 字符串解密, 数据可视化, 符号转换, 自修改代码, 自定义脚本, 逆向工程, 闭包, 静态分析