查找大体积混淆JavaScript包中起始表达式的匹配括号
处理大体积混淆JS文件的括号匹配问题
针对17MB混淆JS文件的括号匹配验证需求,这里提供几个实用方案,避开编辑器性能瓶颈和正则字面量的干扰:
方案1:用AST解析工具快速验证整体结构
借助@babel/parser这类专业JS语法解析器,它会自动区分正则、字符串内的括号与代码结构括号,且能高效处理大文件。
先安装依赖:
npm install @babel/parser
然后运行以下脚本:
const fs = require('fs'); const { parse } = require('@babel/parser'); try { const code = fs.readFileSync('your-obfuscated-file.js', 'utf8'); // 根据文件类型选择sourceType:'script'或'module' const ast = parse(code, { sourceType: 'script' }); console.log('✅ 文件语法合法,整体结构完整'); // 若开头是单个大表达式,AST的program.body会是一个ExpressionStatement节点 if (ast.program.body.length === 1 && ast.program.body[0].type === 'ExpressionStatement') { console.log('✅ 验证:文件确实由单个顶层表达式构成'); } } catch (err) { console.error('❌ 语法错误位置:', err.loc); console.error('错误信息:', err.message); }
方案2:自定义括号匹配脚本(精准排除干扰)
手动编写脚本遍历字符,跳过正则和字符串内的括号,仅跟踪代码结构的括号对:
const fs = require('fs'); const filePath = 'your-obfuscated-file.js'; const code = fs.readFileSync(filePath, 'utf8'); let inRegex = false; let inString = null; // 记录当前字符串的引号类型:"或' const bracketStack = []; for (let idx = 0; idx < code.length; idx++) { const char = code[idx]; const prevChar = idx > 0 ? code[idx - 1] : ''; // 处理字符串切换 if (!inRegex && (char === '"' || char === "'")) { if (inString === char) { inString = null; } else if (inString === null) { inString = char; } continue; } // 处理正则字面量切换(排除除法运算符的情况) if (!inString && char === '/') { const divisionOperators = ['=', '+', '-', '*', '/', '%', '!', '?', '&', '|', '(', '[', '{', ';', ',', '\n', '\r', ' ']; if (!divisionOperators.includes(prevChar)) { inRegex = !inRegex; } continue; } // 仅在非正则、非字符串的状态下处理括号 if (!inRegex && !inString) { if (char === '(' || char === '[' || char === '{') { bracketStack.push({ type: char, index: idx }); } else if (char === ')' || char === ']' || char === '}') { const lastBracket = bracketStack.pop(); // 检查括号类型是否匹配 const isMatch = (char === ')' && lastBracket?.type === '(') || (char === ']' && lastBracket?.type === '[') || (char === '}' && lastBracket?.type === '{'); if (!isMatch) { console.log(`❌ 不匹配括号位置:${idx},字符:${char}`); break; } } } } // 检查剩余未闭合的括号 if (bracketStack.length > 0) { const firstUnclosed = bracketStack[0]; console.log(`❌ 未闭合的起始括号位置:${firstUnclosed.index},类型:${firstUnclosed.type}`); if (firstUnclosed.index === 0 && bracketStack.length === 1) { console.log('✅ 验证:文件开头的起始括号确实覆盖整个文件,未找到对应闭合括号'); } } else { console.log('✅ 所有括号匹配完整'); }
方案3:分块验证(可选)
如果担心内存问题,可以将文件分块读取,但上述脚本处理17MB文件在Node环境下完全无压力,无需额外处理。
内容的提问来源于stack exchange,提问作者Tau
相关产品推荐
相关产品推荐

