UNPKG

guang-js-code

Version:

这是一个加密js文件的工具,默认指定当前目录以及子目录的js文件,也可以指定目录,记得先备份好原js文件

92 lines (78 loc) 2.54 kB
const fs = require('fs'); const path = require('path'); const JavaScriptObfuscator = require('javascript-obfuscator'); // 混淆标识:用于检测文件是否已混淆 const OBFUSCATE_MARKER = '// Obfuscated by guang-js-code\n'; /** * 检查文件是否已混淆 */ function isObfuscated(content) { return content.startsWith(OBFUSCATE_MARKER); } /** * 混淆JS代码(修复配置错误) */ function obfuscateCode(code) { if (isObfuscated(code)) { return code; } // 修复后的混淆配置:stringArrayEncoding改为数组格式 const obfuscationOptions = { compact: true, controlFlowFlattening: true, controlFlowFlatteningThreshold: 0.75, deadCodeInjection: true, deadCodeInjectionThreshold: 0.4, identifierNamesGenerator: 'hexadecimal', renameGlobals: false, rotateStringArray: true, selfDefending: true, stringArray: true, // 关键修复:将stringArrayEncoding从字符串改为数组 stringArrayEncoding: ['base64'], // 正确格式:数组形式 stringArrayThreshold: 0.75 }; const obfuscatedResult = JavaScriptObfuscator.obfuscate(code, obfuscationOptions); return `${OBFUSCATE_MARKER}${obfuscatedResult.getObfuscatedCode()}`; } /** * 处理单个JS文件 */ function processJsFile(filePath) { try { const content = fs.readFileSync(filePath, 'utf8'); if (isObfuscated(content)) { console.log(`⏭️ 已混淆,跳过: ${filePath}`); return; } const obfuscatedContent = obfuscateCode(content); fs.writeFileSync(filePath, obfuscatedContent, 'utf8'); console.log(`✅ 混淆完成: ${filePath}`); } catch (error) { console.error(`❌ 处理失败 ${filePath}: ${error.message}`); } } /** * 递归遍历目录 */ function traverseDirectory(dirPath) { try { const entries = fs.readdirSync(dirPath, { withFileTypes: true }); for (const entry of entries) { const fullPath = path.join(dirPath, entry.name); if (entry.isDirectory() && entry.name === 'node_modules') { continue; } if (entry.isDirectory()) { traverseDirectory(fullPath); } else if (entry.isFile() && path.extname(entry.name) === '.js') { processJsFile(fullPath); } } } catch (error) { console.error(`❌ 遍历目录失败 ${dirPath}: ${error.message}`); } } module.exports = { obfuscateDirectory: traverseDirectory };