/** * 安全转换 Unicode 转义序列为中文 * 只处理字符串字面量,不破坏正则表达式 */ const fs = require('fs'); const babel = require('@babel/core'); const traverse = require('@babel/traverse').default; const generate = require('@babel/generator').default; const t = require('@babel/types'); const inputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider.js'; const code = fs.readFileSync(inputPath, 'utf8'); console.log('安全转换 Unicode...'); let ast; try { ast = babel.parseSync(code, { sourceType: 'script' }); } catch (e) { console.error('解析失败:', e.message); process.exit(1); } let converted = 0; traverse(ast, { StringLiteral(path) { const value = path.node.value; // 检查是否包含 Unicode 转义(已解码的中文字符) // 或者检查原始值是否有 \u if (path.node.extra && path.node.extra.raw) { const raw = path.node.extra.raw; if (raw.includes('\\u')) { // 保持已解码的 value,只是清除 extra 让生成器使用 value delete path.node.extra; converted++; } } } }); console.log(`处理了 ${converted} 个字符串`); const output = generate(ast, { comments: false, compact: false, jsescOption: { minimal: true // 最小转义,保留中文 } }, code); fs.writeFileSync(inputPath, output.code); // 验证 try { babel.parseSync(output.code, { sourceType: 'script' }); console.log('✅ 语法正确'); } catch (e) { console.error('❌ 语法错误:', e.message); } // 统计 const unicodeRemaining = (output.code.match(/\\u[0-9a-fA-F]{4}/g) || []).length; console.log(`剩余 Unicode 转义: ${unicodeRemaining}`); console.log(`文件大小: ${(output.code.length / 1024).toFixed(2)} KB`);