ast-deobfuscate 是一个针对 JavaScript 代码的通用 AST 解混淆技能,目标是把混淆过的代码最大化还原为可读形式。它在用户提出解混淆、还原代码、反混淆、deobfuscate,或反映代码难以阅读(例如全是 _0x 命名)时被触发。
【工具链与运行环境】 该技能基于 Babel 工具链,运行于 Node.js 中,使用 @babel/parser、@babel/traverse、@babel/generator、@babel/types,如需格式化可安装 prettier。首次执行前的依赖安装命令为:npm init -y,然后 npm install @babel/parser @babel/traverse @babel/generator @babel/types,如需格式化再 npm install prettier。
【工作目录约定】 项目结构约定为:source/original/ 存放原始混淆文件(只读,不修改);scripts/ 存放解混淆脚本(每步一个,一次性,针对目标定制);intermediate/ 存放每步输出的中间产物,可回退;source/deobfuscated/ 存放最终输出。原则是每个步骤读取上一步的中间文件并输出新的中间文件,出错时可以从任意中间文件重新开始。
【执行策略】 该技能被定位为百科全书而非固定流水线,执行者可灵活选择步骤:先完成 Step 0 分析,进入计划模式向用户展示分析结果和建议的步骤组合,获得确认后执行;没有字符串数组可跳过 Step 1,没有控制流平坦化可跳过 Step 4;任何步骤执行后发现新情况都可回退或插入额外步骤。MCP(如 js-reverse)用于分析、方案验证、中间抽样验证、控制流动态跟踪和最终验证,而大批量转换通过 Node.js 脚本与 Babel AST 完成。部分任务可采用 subagent 并行。
【主要步骤】 Step 0 预分析与特征识别:获取源码、格式化、可选 AST 体检报告(统计字符串数组特征、访问器函数频次、控制流特征、命名模式、混淆强度等)、特征指纹判断、移除反调试代码(如 debugger、定时器中的 debugger、constructor("debu") 检测、console 重写等),最后进入计划模式。 Step 0.5 Webpack/打包工具 Unpack(可选):识别 Webpack/Browserify/Parcel 打包特征,提取各模块为独立文件,按确定性规则重命名固定参数(module、exports、webpack_require 等),并对每个模块独立执行后续步骤。 Step 1 字符串解密与大数组回填:识别字符串数组、旋转 IIFE、访问器函数;先用 MCP 小规模验证方案(evaluate_script 调用访问器函数确认明文与参数模式),再写 Node.js 脚本批量执行(推荐 Node.js vm 沙箱方案,或旋转逻辑简单时的纯静态分析方案);并还原转义字符串与数值字面量。 Step 2 表达式简化:常量折叠、布尔值还原(![]、!![]、!0、!1、!""、void 0 等)、Proxy 函数内联、对象属性字典内联。 Step 3 引用与属性访问标准化:方括号转点号(保留合法标识符判断,保留保留字、含连字符、变量等情况),以及逗号表达式在 ExpressionStatement、ReturnStatement、if test、for init/update、赋值右侧等位置的拆分。 Step 4 控制流平坦化还原:识别 while(true){switch} 结构,实际分析控制流结构,必要时用 MCP set_breakpoint + step_over 动态跟踪执行顺序,按顺序提取 case 代码块并移除控制流包裹,复杂情况请求用户辅助判断,强调宁可保留未还原结构也不错误还原。 Step 5 死代码移除:不可达分支清理、无用变量/函数剔除(考虑副作用)、空语句清理,并要求 Step 2 与 Step 5 循环执行(硬上限 50 次)。 Step 6 变量重命名与最终整形:仅做确定性的模式化重命名(如 Webpack 模块参数、.then 回调、.catch 回调、事件处理回调),不确定语义的变量保留原始混淆名,随后进行代码整形,并用 MCP evaluate_script 做最终验证。
【安全边界与注意事项】 执行混淆代码必须在 vm 模块、isolated-vm 或浏览器(MCP)中沙箱隔离,禁止直接 eval;迭代设硬上限防止无限循环;删除代码前检查副作用;重命名必须通过 path.scope.rename();每步完成后用 @babel/parser 重新解析确认语法合法。文中还列出 Babel 关键 API 速查(path.evaluate、evaluateTruthy、replaceWith、replaceWithMultiple、remove、getBinding、rename、scope.crawl、valueToNode 等)与多项注意事项(如 Step 2↔5 循环不可省略、Webpack bundle 必须先 unpack、逗号表达式位置多样、常量折叠覆盖所有类型、混淆前缀不止 _0x、每步独立 visitor、scope 变更后刷新、保留不确定代码、利用中间文件作为安全网、灵活调整步骤)。
【限制】 该技能为参考手册式流程,实际混淆千变万化,需按代码情况灵活选择步骤;对于状态变量动态计算、嵌套多层等复杂控制流,宁可保留未还原结构。官方并未提供关于收费、价格、平台可用性、成功率或覆盖范围的可量化数据,这些信息暂未提供。