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, 云安全监控, 云资产清单, 代码压缩, 代码反混淆, 代码混淆, 前端安全, 副作用检测, 字符串解密, 数据可视化, 符号转换, 自修改代码, 自定义脚本, 逆向工程, 闭包, 静态分析