js-confuser
Version:
JavaScript Obfuscation Tool.
119 lines (93 loc) • 3.02 kB
text/typescript
import * as babelTypes from "@babel/types";
import Obfuscator from "./obfuscator";
import { ObfuscateOptions } from "./options";
import {
ObfuscationResult,
ProfileData,
ProfilerCallback,
ProfilerLog,
} from "./obfuscationResult";
import presets from "./presets";
import Template from "./templates/template";
export async function obfuscate(
sourceCode: string,
options: ObfuscateOptions
): Promise<ObfuscationResult> {
const obfuscator = new Obfuscator(options);
return obfuscator.obfuscate(sourceCode);
}
export async function obfuscateAST(
ast: babelTypes.File,
options: ObfuscateOptions
) {
const obfuscator = new Obfuscator(options);
return obfuscator.obfuscateAST(ast);
}
export async function obfuscateWithProfiler(
sourceCode: string,
options: ObfuscateOptions,
profiler: {
callback?: ProfilerCallback;
performance?: { now(): number };
} = {}
): Promise<ObfuscationResult & { profileData: ProfileData }> {
if (!profiler.performance) {
profiler.performance = {
now: () => Date.now(),
};
}
const startTime = performance.now();
const obfuscator = new Obfuscator(options);
let totalTransforms = obfuscator.plugins.length;
let transformMap: ProfileData["transforms"] = Object.create(null);
const beforeParseTime = performance.now();
let ast = Obfuscator.parseCode(sourceCode);
const parseTime = performance.now() - beforeParseTime;
let currentTransformTime = performance.now();
ast = obfuscator.obfuscateAST(ast, {
profiler: (log: ProfilerLog) => {
var nowTime = performance.now();
let entry = {
transformTime: nowTime - currentTransformTime,
changeData: {},
};
transformMap[log.currentTransform] = entry;
// (JS-Confuser.com can run performance benchmark tests here)
profiler.callback?.(log, entry, ast);
// The profiler.callback() function may take a long time to execute,
// so we need to update the currentTransformTime here for accurate profiling.
currentTransformTime = performance.now();
},
});
obfuscator.plugins.forEach(({ pluginInstance }) => {
if (transformMap[pluginInstance.name]) {
transformMap[pluginInstance.name].changeData = pluginInstance.changeData;
}
});
const beforeCompileTime = performance.now();
const code = Obfuscator.generateCode(ast, obfuscator.options);
const compileTime = performance.now() - beforeCompileTime;
const endTime = performance.now();
const obfuscationTime = endTime - startTime;
return {
code: code,
profileData: {
transforms: transformMap,
obfuscationTime: obfuscationTime,
parseTime: parseTime,
compileTime: compileTime,
totalTransforms: totalTransforms,
totalPossibleTransforms: obfuscator.totalPossibleTransforms,
},
};
}
const JsConfuser = {
obfuscate,
obfuscateAST,
obfuscateWithProfiler,
Obfuscator,
presets,
Template,
};
export default JsConfuser;
export { Obfuscator, presets, Template };