如何无视作用域批量重命名变量?JS混淆代码Git Diff优化
批量互换JS文件中变量c和d的最优方案
方法一:VSCode正则精准替换
利用单词边界规则避免误匹配,分三步完成互换(直接互换会导致变量覆盖,需借助临时占位符):
- 打开查找替换面板(快捷键
Ctrl+H),勾选「正则表达式」模式 - 第一步替换:查找
\bc\b,替换为__TEMP_C__,点击「Replace All」 - 第二步替换:查找
\bd\b,替换为c,点击「Replace All」 - 第三步替换:查找
__TEMP_C__,替换为d,点击「Replace All」
\b是正则的单词边界,确保只匹配独立的变量名c和d,不会误匹配其他字符串片段(比如console里的c、debug里的d)。
方法二:AST语法树替换(最可靠)
对于混淆压缩的JS文件,正则可能存在漏判或误判,用AST解析能精准识别变量标识符,完全避开字符串、注释等非变量内容:
- 初始化Node.js项目(未初始化则执行):
npm init -y - 安装依赖:
npm install espree estraverse escodegen - 创建替换脚本(命名为
swap-cd.js):
const fs = require('fs'); const espree = require('espree'); const estraverse = require('estraverse'); const escodegen = require('escodegen'); // 读取目标混淆文件 const originalCode = fs.readFileSync('./your-obfuscated-file.js', 'utf8'); // 生成AST语法树 const ast = espree.parse(originalCode, { ecmaVersion: 'latest' }); // 遍历所有标识符节点,互换c和d estraverse.traverse(ast, { enter(node) { if (node.type === 'Identifier') { switch(node.name) { case 'c': node.name = 'd'; break; case 'd': node.name = 'c'; break; } } } }); // 生成修改后的代码并写入文件 const modifiedCode = escodegen.generate(ast); fs.writeFileSync('./swapped-file.js', modifiedCode);
- 运行脚本:
node swap-cd.js
注意事项
- 操作前务必备份原文件,或通过
git stash暂存当前修改,方便回滚 - 若文件包含大量注释或字符串中存在
c/d,优先选择AST方法,避免误改非变量内容
内容的提问来源于stack exchange,提问作者lynux
相关产品推荐
相关产品推荐

