guang-js-code
Version:
这是一个加密js文件的工具,默认指定当前目录以及子目录的js文件,也可以指定目录,记得先备份好原js文件
92 lines (78 loc) • 2.54 kB
JavaScript
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
};