@nodesecure/js-x-ray 9.1.0 → 9.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AstAnalyser.d.ts +64 -0
- package/dist/AstAnalyser.d.ts.map +1 -0
- package/dist/AstAnalyser.js +165 -0
- package/dist/AstAnalyser.js.map +1 -0
- package/dist/Deobfuscator.d.ts +36 -0
- package/dist/Deobfuscator.d.ts.map +1 -0
- package/dist/Deobfuscator.js +154 -0
- package/dist/Deobfuscator.js.map +1 -0
- package/dist/EntryFilesAnalyser.d.ts +20 -0
- package/dist/EntryFilesAnalyser.d.ts.map +1 -0
- package/dist/EntryFilesAnalyser.js +121 -0
- package/dist/EntryFilesAnalyser.js.map +1 -0
- package/dist/JsSourceParser.d.ts +18 -0
- package/dist/JsSourceParser.d.ts.map +1 -0
- package/dist/JsSourceParser.js +38 -0
- package/dist/JsSourceParser.js.map +1 -0
- package/dist/NodeCounter.d.ts +24 -0
- package/dist/NodeCounter.d.ts.map +1 -0
- package/dist/NodeCounter.js +62 -0
- package/dist/NodeCounter.js.map +1 -0
- package/dist/ProbeRunner.d.ts +40 -0
- package/dist/ProbeRunner.d.ts.map +1 -0
- package/dist/ProbeRunner.js +106 -0
- package/dist/ProbeRunner.js.map +1 -0
- package/dist/SourceFile.d.ts +43 -0
- package/dist/SourceFile.d.ts.map +1 -0
- package/dist/SourceFile.js +137 -0
- package/dist/SourceFile.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/{src/index.ts → dist/index.js} +1 -0
- package/dist/index.js.map +1 -0
- package/dist/obfuscators/freejsobfuscator.d.ts +3 -0
- package/dist/obfuscators/freejsobfuscator.d.ts.map +1 -0
- package/dist/obfuscators/freejsobfuscator.js +10 -0
- package/dist/obfuscators/freejsobfuscator.js.map +1 -0
- package/dist/obfuscators/jjencode.d.ts +3 -0
- package/dist/obfuscators/jjencode.d.ts.map +1 -0
- package/dist/obfuscators/jjencode.js +24 -0
- package/dist/obfuscators/jjencode.js.map +1 -0
- package/dist/obfuscators/jsfuck.d.ts +3 -0
- package/dist/obfuscators/jsfuck.d.ts.map +1 -0
- package/dist/obfuscators/jsfuck.js +13 -0
- package/dist/obfuscators/jsfuck.js.map +1 -0
- package/dist/obfuscators/obfuscator-io.d.ts +3 -0
- package/dist/obfuscators/obfuscator-io.d.ts.map +1 -0
- package/dist/obfuscators/obfuscator-io.js +15 -0
- package/dist/obfuscators/obfuscator-io.js.map +1 -0
- package/dist/obfuscators/trojan-source.d.ts +2 -0
- package/dist/obfuscators/trojan-source.d.ts.map +1 -0
- package/dist/obfuscators/trojan-source.js +27 -0
- package/dist/obfuscators/trojan-source.js.map +1 -0
- package/dist/probes/isArrayExpression.d.ts +21 -0
- package/dist/probes/isArrayExpression.d.ts.map +1 -0
- package/dist/probes/isArrayExpression.js +27 -0
- package/dist/probes/isArrayExpression.js.map +1 -0
- package/dist/probes/isBinaryExpression.d.ts +21 -0
- package/dist/probes/isBinaryExpression.d.ts.map +1 -0
- package/dist/probes/isBinaryExpression.js +54 -0
- package/dist/probes/isBinaryExpression.js.map +1 -0
- package/dist/probes/isESMExport.d.ts +24 -0
- package/dist/probes/isESMExport.d.ts.map +1 -0
- package/dist/probes/isESMExport.js +30 -0
- package/dist/probes/isESMExport.js.map +1 -0
- package/dist/probes/isFetch.d.ts +14 -0
- package/dist/probes/isFetch.d.ts.map +1 -0
- package/dist/probes/isFetch.js +18 -0
- package/dist/probes/isFetch.js.map +1 -0
- package/dist/probes/isImportDeclaration.d.ts +26 -0
- package/dist/probes/isImportDeclaration.d.ts.map +1 -0
- package/dist/probes/isImportDeclaration.js +38 -0
- package/dist/probes/isImportDeclaration.js.map +1 -0
- package/dist/probes/isLiteral.d.ts +21 -0
- package/dist/probes/isLiteral.d.ts.map +1 -0
- package/dist/probes/isLiteral.js +66 -0
- package/dist/probes/isLiteral.js.map +1 -0
- package/dist/probes/isLiteralRegex.d.ts +20 -0
- package/dist/probes/isLiteralRegex.d.ts.map +1 -0
- package/dist/probes/isLiteralRegex.js +30 -0
- package/dist/probes/isLiteralRegex.js.map +1 -0
- package/dist/probes/isRegexObject.d.ts +22 -0
- package/dist/probes/isRegexObject.d.ts.map +1 -0
- package/dist/probes/isRegexObject.js +50 -0
- package/dist/probes/isRegexObject.js.map +1 -0
- package/dist/probes/isRequire/RequireCallExpressionWalker.d.ts +15 -0
- package/dist/probes/isRequire/RequireCallExpressionWalker.d.ts.map +1 -0
- package/dist/probes/isRequire/RequireCallExpressionWalker.js +95 -0
- package/dist/probes/isRequire/RequireCallExpressionWalker.js.map +1 -0
- package/dist/probes/isRequire/isRequire.d.ts +20 -0
- package/dist/probes/isRequire/isRequire.d.ts.map +1 -0
- package/dist/probes/isRequire/isRequire.js +138 -0
- package/dist/probes/isRequire/isRequire.js.map +1 -0
- package/dist/probes/isSerializeEnv.d.ts +24 -0
- package/dist/probes/isSerializeEnv.d.ts.map +1 -0
- package/dist/probes/isSerializeEnv.js +66 -0
- package/dist/probes/isSerializeEnv.js.map +1 -0
- package/dist/probes/isSyncIO.d.ts +16 -0
- package/dist/probes/isSyncIO.d.ts.map +1 -0
- package/dist/probes/isSyncIO.js +74 -0
- package/dist/probes/isSyncIO.js.map +1 -0
- package/dist/probes/isUnsafeCallee.d.ts +22 -0
- package/dist/probes/isUnsafeCallee.d.ts.map +1 -0
- package/dist/probes/isUnsafeCallee.js +60 -0
- package/dist/probes/isUnsafeCallee.js.map +1 -0
- package/dist/probes/isUnsafeCommand.d.ts +24 -0
- package/dist/probes/isUnsafeCommand.d.ts.map +1 -0
- package/dist/probes/isUnsafeCommand.js +100 -0
- package/dist/probes/isUnsafeCommand.js.map +1 -0
- package/dist/probes/isWeakCrypto.d.ts +16 -0
- package/dist/probes/isWeakCrypto.d.ts.map +1 -0
- package/dist/probes/isWeakCrypto.js +46 -0
- package/dist/probes/isWeakCrypto.js.map +1 -0
- package/dist/types/estree.d.ts +11 -0
- package/dist/types/estree.d.ts.map +1 -0
- package/dist/types/estree.js +15 -0
- package/dist/types/estree.js.map +1 -0
- package/dist/utils/extractNode.d.ts +5 -0
- package/dist/utils/extractNode.d.ts.map +1 -0
- package/dist/utils/extractNode.js +13 -0
- package/dist/utils/extractNode.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/{src/utils/index.ts → dist/utils/index.js} +1 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/isOneLineExpressionExport.d.ts +3 -0
- package/dist/utils/isOneLineExpressionExport.d.ts.map +1 -0
- package/dist/utils/isOneLineExpressionExport.js +49 -0
- package/dist/utils/isOneLineExpressionExport.js.map +1 -0
- package/dist/utils/notNullOrUndefined.d.ts +2 -0
- package/dist/utils/notNullOrUndefined.d.ts.map +1 -0
- package/dist/utils/notNullOrUndefined.js +4 -0
- package/dist/utils/notNullOrUndefined.js.map +1 -0
- package/dist/utils/toArrayLocation.d.ts +5 -0
- package/dist/utils/toArrayLocation.d.ts.map +1 -0
- package/dist/utils/toArrayLocation.js +14 -0
- package/dist/utils/toArrayLocation.js.map +1 -0
- package/dist/warnings.d.ts +88 -0
- package/dist/warnings.d.ts.map +1 -0
- package/dist/warnings.js +91 -0
- package/dist/warnings.js.map +1 -0
- package/package.json +3 -6
- package/src/AstAnalyser.ts +0 -283
- package/src/Deobfuscator.ts +0 -228
- package/src/EntryFilesAnalyser.ts +0 -206
- package/src/JsSourceParser.ts +0 -77
- package/src/NodeCounter.ts +0 -90
- package/src/ProbeRunner.ts +0 -167
- package/src/SourceFile.ts +0 -226
- package/src/obfuscators/freejsobfuscator.ts +0 -17
- package/src/obfuscators/jjencode.ts +0 -39
- package/src/obfuscators/jsfuck.ts +0 -19
- package/src/obfuscators/obfuscator-io.ts +0 -25
- package/src/obfuscators/trojan-source.ts +0 -30
- package/src/probes/isArrayExpression.ts +0 -41
- package/src/probes/isBinaryExpression.ts +0 -74
- package/src/probes/isESMExport.ts +0 -50
- package/src/probes/isFetch.ts +0 -28
- package/src/probes/isImportDeclaration.ts +0 -58
- package/src/probes/isLiteral.ts +0 -91
- package/src/probes/isLiteralRegex.ts +0 -42
- package/src/probes/isRegexObject.ts +0 -71
- package/src/probes/isRequire/RequireCallExpressionWalker.ts +0 -142
- package/src/probes/isRequire/isRequire.ts +0 -195
- package/src/probes/isSerializeEnv.ts +0 -65
- package/src/probes/isSyncIO.ts +0 -96
- package/src/probes/isUnsafeCallee.ts +0 -89
- package/src/probes/isUnsafeCommand.ts +0 -133
- package/src/probes/isWeakCrypto.ts +0 -69
- package/src/types/estree.ts +0 -35
- package/src/utils/extractNode.ts +0 -22
- package/src/utils/isOneLineExpressionExport.ts +0 -70
- package/src/utils/notNullOrUndefined.ts +0 -5
- package/src/utils/toArrayLocation.ts +0 -22
- package/src/warnings.ts +0 -146
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { ESTree } from "meriyah";
|
|
2
|
+
import { type Warning } from "./warnings.js";
|
|
3
|
+
import { SourceFile, type ProbesOptions, type SourceFlags } from "./SourceFile.js";
|
|
4
|
+
import { type SourceParser } from "./JsSourceParser.js";
|
|
5
|
+
export interface Dependency {
|
|
6
|
+
unsafe: boolean;
|
|
7
|
+
inTry: boolean;
|
|
8
|
+
location?: null | ESTree.SourceLocation;
|
|
9
|
+
}
|
|
10
|
+
export interface RuntimeOptions {
|
|
11
|
+
/**
|
|
12
|
+
* @default true
|
|
13
|
+
*/
|
|
14
|
+
module?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* @default false
|
|
17
|
+
*/
|
|
18
|
+
removeHTMLComments?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* @default false
|
|
21
|
+
*/
|
|
22
|
+
isMinified?: boolean;
|
|
23
|
+
initialize?: (sourceFile: SourceFile) => void;
|
|
24
|
+
finalize?: (sourceFile: SourceFile) => void;
|
|
25
|
+
}
|
|
26
|
+
export interface RuntimeFileOptions extends Omit<RuntimeOptions, "isMinified"> {
|
|
27
|
+
packageName?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface Report {
|
|
30
|
+
dependencies: Map<string, Dependency>;
|
|
31
|
+
warnings: Warning[];
|
|
32
|
+
flags: Set<SourceFlags>;
|
|
33
|
+
idsLengthAvg: number;
|
|
34
|
+
stringScore: number;
|
|
35
|
+
}
|
|
36
|
+
export type ReportOnFile = {
|
|
37
|
+
ok: true;
|
|
38
|
+
warnings: Warning[];
|
|
39
|
+
dependencies: Map<string, Dependency>;
|
|
40
|
+
flags: Set<SourceFlags>;
|
|
41
|
+
} | {
|
|
42
|
+
ok: false;
|
|
43
|
+
warnings: Warning[];
|
|
44
|
+
};
|
|
45
|
+
export interface AstAnalyserOptions extends ProbesOptions {
|
|
46
|
+
/**
|
|
47
|
+
* @default JsSourceParser
|
|
48
|
+
*/
|
|
49
|
+
customParser?: SourceParser;
|
|
50
|
+
}
|
|
51
|
+
export interface PrepareSourceOptions {
|
|
52
|
+
removeHTMLComments?: boolean;
|
|
53
|
+
}
|
|
54
|
+
export declare class AstAnalyser {
|
|
55
|
+
#private;
|
|
56
|
+
parser: SourceParser;
|
|
57
|
+
probesOptions: ProbesOptions;
|
|
58
|
+
constructor(options?: AstAnalyserOptions);
|
|
59
|
+
analyse(str: string, options?: RuntimeOptions): Report;
|
|
60
|
+
analyseFile(pathToFile: string | URL, options?: RuntimeFileOptions): Promise<ReportOnFile>;
|
|
61
|
+
analyseFileSync(pathToFile: string | URL, options?: RuntimeFileOptions): ReportOnFile;
|
|
62
|
+
prepareSource(source: string, options?: PrepareSourceOptions): string;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=AstAnalyser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AstAnalyser.d.ts","sourceRoot":"","sources":["../src/AstAnalyser.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAItC,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EACL,UAAU,EACV,KAAK,aAAa,EAClB,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExE,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC9C,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,MAAM;IACrB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACtC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,IAAI,CAAC;IACT,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACtC,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;CACzB,GAAG;IACF,EAAE,EAAE,KAAK,CAAC;IACV,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD;;OAEG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,qBAAa,WAAW;;IACtB,MAAM,EAAE,YAAY,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;gBAEjB,OAAO,GAAE,kBAAuB;IAS5C,OAAO,CACL,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,cAAmB,GAC3B,MAAM;IA4DH,WAAW,CACf,UAAU,EAAE,MAAM,GAAG,GAAG,EACxB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,YAAY,CAAC;IAkDxB,eAAe,CACb,UAAU,EAAE,MAAM,GAAG,GAAG,EACxB,OAAO,GAAE,kBAAuB,GAC/B,YAAY;IAkDf,aAAa,CACX,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,oBAAyB,GACjC,MAAM;CAqBV"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// Import Node.js Dependencies
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import fsSync from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
// Import Third-party Dependencies
|
|
6
|
+
import { walk } from "estree-walker";
|
|
7
|
+
import isMinified from "is-minified-code";
|
|
8
|
+
// Import Internal Dependencies
|
|
9
|
+
import { generateWarning } from "./warnings.js";
|
|
10
|
+
import { SourceFile } from "./SourceFile.js";
|
|
11
|
+
import { isOneLineExpressionExport } from "./utils/index.js";
|
|
12
|
+
import { JsSourceParser } from "./JsSourceParser.js";
|
|
13
|
+
export class AstAnalyser {
|
|
14
|
+
parser;
|
|
15
|
+
probesOptions;
|
|
16
|
+
constructor(options = {}) {
|
|
17
|
+
this.parser = options.customParser ?? new JsSourceParser();
|
|
18
|
+
this.probesOptions = {
|
|
19
|
+
customProbes: options.customProbes ?? [],
|
|
20
|
+
skipDefaultProbes: options.skipDefaultProbes ?? false,
|
|
21
|
+
optionalWarnings: options.optionalWarnings ?? false
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
analyse(str, options = {}) {
|
|
25
|
+
const { isMinified = false, module = true, removeHTMLComments = false, initialize, finalize } = options;
|
|
26
|
+
const body = this.parser.parse(this.prepareSource(str, { removeHTMLComments }), {
|
|
27
|
+
isEcmaScriptModule: Boolean(module)
|
|
28
|
+
});
|
|
29
|
+
const source = new SourceFile(str, this.probesOptions);
|
|
30
|
+
// TODO: this check should be factorized in a way that we reuse it
|
|
31
|
+
// on analyze and anlyseFile
|
|
32
|
+
if (initialize) {
|
|
33
|
+
if (typeof initialize !== "function") {
|
|
34
|
+
throw new TypeError("options.initialize must be a function");
|
|
35
|
+
}
|
|
36
|
+
initialize(source);
|
|
37
|
+
}
|
|
38
|
+
// we walk each AST Nodes, this is a purely synchronous I/O
|
|
39
|
+
// @ts-expect-error
|
|
40
|
+
walk(body, {
|
|
41
|
+
enter(node) {
|
|
42
|
+
// Skip the root of the AST.
|
|
43
|
+
if (Array.isArray(node)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const action = source.walk(node);
|
|
47
|
+
if (action === "skip") {
|
|
48
|
+
this.skip();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
// TODO: this check should be factorized in a way that we reuse it
|
|
53
|
+
// on analyze and anlyseFile
|
|
54
|
+
if (finalize) {
|
|
55
|
+
if (typeof finalize !== "function") {
|
|
56
|
+
throw new TypeError("options.finalize must be a function");
|
|
57
|
+
}
|
|
58
|
+
finalize(source);
|
|
59
|
+
}
|
|
60
|
+
// Add oneline-require flag if this is a one-line require expression
|
|
61
|
+
if (isOneLineExpressionExport(body)) {
|
|
62
|
+
source.flags.add("oneline-require");
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
...source.getResult(isMinified),
|
|
66
|
+
dependencies: source.dependencies,
|
|
67
|
+
flags: source.flags
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
async analyseFile(pathToFile, options = {}) {
|
|
71
|
+
try {
|
|
72
|
+
const { packageName = null, module = true, removeHTMLComments = false, initialize, finalize } = options;
|
|
73
|
+
const str = await fs.readFile(pathToFile, "utf-8");
|
|
74
|
+
const filePathString = pathToFile instanceof URL ? pathToFile.href : pathToFile;
|
|
75
|
+
const isMin = filePathString.includes(".min") || isMinified(str);
|
|
76
|
+
const data = this.analyse(str, {
|
|
77
|
+
isMinified: isMin,
|
|
78
|
+
module: path.extname(filePathString) === ".mjs" ? true : module,
|
|
79
|
+
removeHTMLComments,
|
|
80
|
+
initialize,
|
|
81
|
+
finalize
|
|
82
|
+
});
|
|
83
|
+
if (packageName !== null) {
|
|
84
|
+
data.dependencies.delete(packageName);
|
|
85
|
+
}
|
|
86
|
+
// Add is-minified flag if the file is minified and not a one-line require
|
|
87
|
+
if (!data.flags.has("oneline-require") && isMin) {
|
|
88
|
+
data.flags.add("is-minified");
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
ok: true,
|
|
92
|
+
dependencies: data.dependencies,
|
|
93
|
+
warnings: data.warnings,
|
|
94
|
+
flags: data.flags
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
return {
|
|
99
|
+
ok: false,
|
|
100
|
+
warnings: [
|
|
101
|
+
generateWarning("parsing-error", {
|
|
102
|
+
value: error.message
|
|
103
|
+
})
|
|
104
|
+
]
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
analyseFileSync(pathToFile, options = {}) {
|
|
109
|
+
try {
|
|
110
|
+
const { packageName = null, module = true, removeHTMLComments = false, initialize, finalize } = options;
|
|
111
|
+
const str = fsSync.readFileSync(pathToFile, "utf-8");
|
|
112
|
+
const filePathString = pathToFile instanceof URL ? pathToFile.href : pathToFile;
|
|
113
|
+
const isMin = filePathString.includes(".min") || isMinified(str);
|
|
114
|
+
const data = this.analyse(str, {
|
|
115
|
+
isMinified: isMin,
|
|
116
|
+
module: path.extname(filePathString) === ".mjs" ? true : module,
|
|
117
|
+
removeHTMLComments,
|
|
118
|
+
initialize,
|
|
119
|
+
finalize
|
|
120
|
+
});
|
|
121
|
+
if (packageName !== null) {
|
|
122
|
+
data.dependencies.delete(packageName);
|
|
123
|
+
}
|
|
124
|
+
// Add is-minified flag if the file is minified and not a one-line require
|
|
125
|
+
if (!data.flags.has("oneline-require") && isMin) {
|
|
126
|
+
data.flags.add("is-minified");
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
ok: true,
|
|
130
|
+
dependencies: data.dependencies,
|
|
131
|
+
warnings: data.warnings,
|
|
132
|
+
flags: data.flags
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
return {
|
|
137
|
+
ok: false,
|
|
138
|
+
warnings: [
|
|
139
|
+
generateWarning("parsing-error", {
|
|
140
|
+
value: error.message
|
|
141
|
+
})
|
|
142
|
+
]
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
prepareSource(source, options = {}) {
|
|
147
|
+
if (typeof source !== "string") {
|
|
148
|
+
throw new TypeError("source must be a string");
|
|
149
|
+
}
|
|
150
|
+
const { removeHTMLComments = false } = options;
|
|
151
|
+
/**
|
|
152
|
+
* if the file start with a shebang then we remove it because meriyah.parseScript fail to parse it.
|
|
153
|
+
* @example
|
|
154
|
+
* #!/usr/bin/env node
|
|
155
|
+
*/
|
|
156
|
+
const rawNoShebang = source.startsWith("#") ?
|
|
157
|
+
source.slice(source.indexOf("\n") + 1) : source;
|
|
158
|
+
return removeHTMLComments ?
|
|
159
|
+
this.#removeHTMLComment(rawNoShebang) : rawNoShebang;
|
|
160
|
+
}
|
|
161
|
+
#removeHTMLComment(str) {
|
|
162
|
+
return str.replaceAll(/<!--[\s\S]*?(?:-->)/g, "");
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=AstAnalyser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AstAnalyser.js","sourceRoot":"","sources":["../src/AstAnalyser.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,kCAAkC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAE1C,+BAA+B;AAC/B,OAAO,EAAE,eAAe,EAAgB,MAAM,eAAe,CAAC;AAC9D,OAAO,EACL,UAAU,EAGX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAqB,MAAM,qBAAqB,CAAC;AA0DxE,MAAM,OAAO,WAAW;IACtB,MAAM,CAAe;IACrB,aAAa,CAAgB;IAE7B,YAAY,UAA8B,EAAE;QAC1C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,cAAc,EAAE,CAAC;QAC3D,IAAI,CAAC,aAAa,GAAG;YACnB,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;YACxC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,KAAK;YACrD,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,KAAK;SACpD,CAAC;IACJ,CAAC;IAED,OAAO,CACL,GAAW,EACX,UAA0B,EAAE;QAE5B,MAAM,EACJ,UAAU,GAAG,KAAK,EAClB,MAAM,GAAG,IAAI,EACb,kBAAkB,GAAG,KAAK,EAC1B,UAAU,EACV,QAAQ,EACT,GAAG,OAAO,CAAC;QAEZ,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE;YAC9E,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAEvD,kEAAkE;QAClE,4BAA4B;QAC5B,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;gBACrC,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC,CAAC;YAC/D,CAAC;YACD,UAAU,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;QAED,2DAA2D;QAC3D,mBAAmB;QACnB,IAAI,CAAC,IAAI,EAAE;YACT,KAAK,CAAC,IAAI;gBACR,4BAA4B;gBAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxB,OAAO;gBACT,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAmB,CAAC,CAAC;gBAChD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBACtB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QAEH,kEAAkE;QAClE,4BAA4B;QAC5B,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;gBACnC,MAAM,IAAI,SAAS,CAAC,qCAAqC,CAAC,CAAC;YAC7D,CAAC;YACD,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAED,oEAAoE;QACpE,IAAI,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACtC,CAAC;QAED,OAAO;YACL,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;YAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CACf,UAAwB,EACxB,UAA8B,EAAE;QAEhC,IAAI,CAAC;YACH,MAAM,EACJ,WAAW,GAAG,IAAI,EAClB,MAAM,GAAG,IAAI,EACb,kBAAkB,GAAG,KAAK,EAC1B,UAAU,EACV,QAAQ,EACT,GAAG,OAAO,CAAC;YAEZ,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,cAAc,GAAG,UAAU,YAAY,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;YAEhF,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC7B,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;gBAC/D,kBAAkB;gBAClB,UAAU;gBACV,QAAQ;aACT,CAAC,CAAC;YAEH,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBACzB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACxC,CAAC;YAED,0EAA0E;YAC1E,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,KAAK,EAAE,CAAC;gBAChD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAChC,CAAC;YAED,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC;QACJ,CAAC;QACD,OAAO,KAAU,EAAE,CAAC;YAClB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,QAAQ,EAAE;oBACR,eAAe,CAAC,eAAe,EAAE;wBAC/B,KAAK,EAAE,KAAK,CAAC,OAAO;qBACrB,CAAC;iBACH;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,eAAe,CACb,UAAwB,EACxB,UAA8B,EAAE;QAEhC,IAAI,CAAC;YACH,MAAM,EACJ,WAAW,GAAG,IAAI,EAClB,MAAM,GAAG,IAAI,EACb,kBAAkB,GAAG,KAAK,EAC1B,UAAU,EACV,QAAQ,EACT,GAAG,OAAO,CAAC;YAEZ,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,cAAc,GAAG,UAAU,YAAY,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;YAEhF,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC7B,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;gBAC/D,kBAAkB;gBAClB,UAAU;gBACV,QAAQ;aACT,CAAC,CAAC;YAEH,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBACzB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACxC,CAAC;YAED,0EAA0E;YAC1E,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,KAAK,EAAE,CAAC;gBAChD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAChC,CAAC;YAED,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC;QACJ,CAAC;QACD,OAAO,KAAU,EAAE,CAAC;YAClB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,QAAQ,EAAE;oBACR,eAAe,CAAC,eAAe,EAAE;wBAC/B,KAAK,EAAE,KAAK,CAAC,OAAO;qBACrB,CAAC;iBACH;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,aAAa,CACX,MAAc,EACd,UAAgC,EAAE;QAElC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,EAAE,kBAAkB,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;QAE/C;;;;WAIG;QACH,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAElD,OAAO,kBAAkB,CAAC,CAAC;YACzB,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IACzD,CAAC;IAED,kBAAkB,CAAC,GAAW;QAC5B,OAAO,GAAG,CAAC,UAAU,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;CACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ESTree } from "meriyah";
|
|
2
|
+
export type ObfuscatedEngine = "jsfuck" | "jjencode" | "morse" | "freejsobfuscator" | "obfuscator.io" | "unknown";
|
|
3
|
+
export interface ObfuscatedIdentifier {
|
|
4
|
+
name: string;
|
|
5
|
+
type: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ObfuscatedCounters {
|
|
8
|
+
Identifiers: number;
|
|
9
|
+
VariableDeclaration?: {
|
|
10
|
+
const?: number;
|
|
11
|
+
let?: number;
|
|
12
|
+
var?: number;
|
|
13
|
+
};
|
|
14
|
+
VariableDeclarator?: number;
|
|
15
|
+
AssignmentExpression?: number;
|
|
16
|
+
FunctionDeclaration?: number;
|
|
17
|
+
MemberExpression?: Record<string, number>;
|
|
18
|
+
Property?: number;
|
|
19
|
+
UnaryExpression?: number;
|
|
20
|
+
DoubleUnaryExpression?: number;
|
|
21
|
+
}
|
|
22
|
+
export declare class Deobfuscator {
|
|
23
|
+
#private;
|
|
24
|
+
deepBinaryExpression: number;
|
|
25
|
+
encodedArrayValue: number;
|
|
26
|
+
hasDictionaryString: boolean;
|
|
27
|
+
hasPrefixedIdentifiers: boolean;
|
|
28
|
+
morseLiterals: Set<string>;
|
|
29
|
+
literalScores: number[];
|
|
30
|
+
identifiers: ObfuscatedIdentifier[];
|
|
31
|
+
analyzeString(str: string): void;
|
|
32
|
+
walk(node: ESTree.Node): void;
|
|
33
|
+
aggregateCounters(): ObfuscatedCounters;
|
|
34
|
+
assertObfuscation(): ObfuscatedEngine | null;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=Deobfuscator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Deobfuscator.d.ts","sourceRoot":"","sources":["../src/Deobfuscator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAoBtC,MAAM,MAAM,gBAAgB,GACxB,QAAQ,GACR,UAAU,GACV,OAAO,GACP,kBAAkB,GAClB,eAAe,GACf,SAAS,CAAC;AAEd,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,YAAY;;IACvB,oBAAoB,SAAK;IACzB,iBAAiB,SAAK;IACtB,mBAAmB,UAAS;IAC5B,sBAAsB,UAAS;IAE/B,aAAa,cAAqB;IAClC,aAAa,EAAE,MAAM,EAAE,CAAM;IAE7B,WAAW,EAAE,oBAAoB,EAAE,CAAM;IAkDzC,aAAa,CACX,GAAG,EAAE,MAAM,GACV,IAAI;IAmBP,IAAI,CACF,IAAI,EAAE,MAAM,CAAC,IAAI,GAChB,IAAI;IAuBP,iBAAiB,IAAI,kBAAkB;IAgCvC,iBAAiB,IAAI,gBAAgB,GAAG,IAAI;CAqC7C"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// Import Third-party Dependencies
|
|
2
|
+
import { getVariableDeclarationIdentifiers } from "@nodesecure/estree-ast-utils";
|
|
3
|
+
import { Utils, Patterns } from "@nodesecure/sec-literal";
|
|
4
|
+
import { match } from "ts-pattern";
|
|
5
|
+
// Import Internal Dependencies
|
|
6
|
+
import { NodeCounter } from "./NodeCounter.js";
|
|
7
|
+
import { extractNode } from "./utils/index.js";
|
|
8
|
+
import * as jjencode from "./obfuscators/jjencode.js";
|
|
9
|
+
import * as jsfuck from "./obfuscators/jsfuck.js";
|
|
10
|
+
import * as freejsobfuscator from "./obfuscators/freejsobfuscator.js";
|
|
11
|
+
import * as obfuscatorio from "./obfuscators/obfuscator-io.js";
|
|
12
|
+
// CONSTANTS
|
|
13
|
+
const kIdentifierNodeExtractor = extractNode("Identifier");
|
|
14
|
+
const kDictionaryStrParts = [
|
|
15
|
+
"abcdefghijklmnopqrstuvwxyz",
|
|
16
|
+
"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
|
|
17
|
+
"0123456789"
|
|
18
|
+
];
|
|
19
|
+
const kMinimumIdsCount = 5;
|
|
20
|
+
export class Deobfuscator {
|
|
21
|
+
deepBinaryExpression = 0;
|
|
22
|
+
encodedArrayValue = 0;
|
|
23
|
+
hasDictionaryString = false;
|
|
24
|
+
hasPrefixedIdentifiers = false;
|
|
25
|
+
morseLiterals = new Set();
|
|
26
|
+
literalScores = [];
|
|
27
|
+
identifiers = [];
|
|
28
|
+
#counters = [
|
|
29
|
+
new NodeCounter("VariableDeclaration[kind]"),
|
|
30
|
+
new NodeCounter("AssignmentExpression", {
|
|
31
|
+
match: (node, nc) => this.#extractCounterIdentifiers(nc, node.left)
|
|
32
|
+
}),
|
|
33
|
+
new NodeCounter("FunctionDeclaration", {
|
|
34
|
+
match: (node, nc) => this.#extractCounterIdentifiers(nc, node.id)
|
|
35
|
+
}),
|
|
36
|
+
new NodeCounter("MemberExpression[computed]"),
|
|
37
|
+
new NodeCounter("Property", {
|
|
38
|
+
filter: (node) => node.key.type === "Identifier",
|
|
39
|
+
match: (node, nc) => this.#extractCounterIdentifiers(nc, node.key)
|
|
40
|
+
}),
|
|
41
|
+
new NodeCounter("UnaryExpression", {
|
|
42
|
+
name: "DoubleUnaryExpression",
|
|
43
|
+
filter: ({ argument }) => argument.type === "UnaryExpression" && argument.argument.type === "ArrayExpression"
|
|
44
|
+
}),
|
|
45
|
+
new NodeCounter("VariableDeclarator", {
|
|
46
|
+
match: (node, nc) => this.#extractCounterIdentifiers(nc, node.id)
|
|
47
|
+
})
|
|
48
|
+
];
|
|
49
|
+
#extractCounterIdentifiers(nc, node) {
|
|
50
|
+
if (node === null) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const { type } = nc;
|
|
54
|
+
switch (type) {
|
|
55
|
+
case "VariableDeclarator":
|
|
56
|
+
case "AssignmentExpression": {
|
|
57
|
+
for (const { name } of getVariableDeclarationIdentifiers(node)) {
|
|
58
|
+
this.identifiers.push({ name, type });
|
|
59
|
+
}
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
case "Property":
|
|
63
|
+
case "FunctionDeclaration":
|
|
64
|
+
if (node.type === "Identifier") {
|
|
65
|
+
this.identifiers.push({ name: node.name, type });
|
|
66
|
+
}
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
analyzeString(str) {
|
|
71
|
+
const score = Utils.stringSuspicionScore(str);
|
|
72
|
+
if (score !== 0) {
|
|
73
|
+
this.literalScores.push(score);
|
|
74
|
+
}
|
|
75
|
+
if (!this.hasDictionaryString) {
|
|
76
|
+
const isDictionaryStr = kDictionaryStrParts.every((word) => str.includes(word));
|
|
77
|
+
if (isDictionaryStr) {
|
|
78
|
+
this.hasDictionaryString = true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Searching for morse string like "--.- --.--"
|
|
82
|
+
if (Utils.isMorse(str)) {
|
|
83
|
+
this.morseLiterals.add(str);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
walk(node) {
|
|
87
|
+
const nodesToExtract = match(node)
|
|
88
|
+
.with({ type: "ClassDeclaration" }, (node) => [node.id, node.superClass])
|
|
89
|
+
.with({ type: "FunctionDeclaration" }, (node) => node.params)
|
|
90
|
+
.with({ type: "FunctionExpression" }, (node) => node.params)
|
|
91
|
+
.with({ type: "MethodDefinition" }, (node) => [node.key])
|
|
92
|
+
.otherwise(() => []);
|
|
93
|
+
const isFunctionParams = node.type === "FunctionDeclaration" ||
|
|
94
|
+
node.type === "FunctionExpression";
|
|
95
|
+
kIdentifierNodeExtractor(({ name }) => this.identifiers.push({
|
|
96
|
+
name,
|
|
97
|
+
type: isFunctionParams ? "FunctionParams" : node.type
|
|
98
|
+
}), nodesToExtract);
|
|
99
|
+
this.#counters.forEach((counter) => counter.walk(node));
|
|
100
|
+
}
|
|
101
|
+
aggregateCounters() {
|
|
102
|
+
return this.#counters.reduce((result, counter) => {
|
|
103
|
+
result[counter.name] = counter.lookup ?
|
|
104
|
+
counter.properties :
|
|
105
|
+
counter.count;
|
|
106
|
+
return result;
|
|
107
|
+
}, {
|
|
108
|
+
Identifiers: this.identifiers.length
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
#calcAvgPrefixedIdentifiers(counters, prefix) {
|
|
112
|
+
const valuesArr = Object
|
|
113
|
+
.values(prefix)
|
|
114
|
+
.slice()
|
|
115
|
+
.sort((left, right) => left - right);
|
|
116
|
+
if (valuesArr.length === 0) {
|
|
117
|
+
return 0;
|
|
118
|
+
}
|
|
119
|
+
const nbOfPrefixedIds = valuesArr.length === 1 ?
|
|
120
|
+
valuesArr.pop() :
|
|
121
|
+
(valuesArr.pop() + valuesArr.pop());
|
|
122
|
+
const maxIds = counters.Identifiers - (counters.Property ?? 0);
|
|
123
|
+
return ((nbOfPrefixedIds / maxIds) * 100);
|
|
124
|
+
}
|
|
125
|
+
assertObfuscation() {
|
|
126
|
+
const counters = this.aggregateCounters();
|
|
127
|
+
if (jsfuck.verify(counters)) {
|
|
128
|
+
return "jsfuck";
|
|
129
|
+
}
|
|
130
|
+
if (jjencode.verify(this.identifiers, counters)) {
|
|
131
|
+
return "jjencode";
|
|
132
|
+
}
|
|
133
|
+
if (this.morseLiterals.size >= 36) {
|
|
134
|
+
return "morse";
|
|
135
|
+
}
|
|
136
|
+
const { prefix } = Patterns.commonHexadecimalPrefix(this.identifiers.flatMap(({ name }) => (typeof name === "string" ? [name] : [])));
|
|
137
|
+
const uPrefixNames = new Set(Object.keys(prefix));
|
|
138
|
+
if (this.identifiers.length > kMinimumIdsCount && uPrefixNames.size > 0) {
|
|
139
|
+
this.hasPrefixedIdentifiers = this.#calcAvgPrefixedIdentifiers(counters, prefix) > 80;
|
|
140
|
+
}
|
|
141
|
+
if (uPrefixNames.size === 1 && freejsobfuscator.verify(this.identifiers, prefix)) {
|
|
142
|
+
return "freejsobfuscator";
|
|
143
|
+
}
|
|
144
|
+
if (obfuscatorio.verify(this, counters)) {
|
|
145
|
+
return "obfuscator.io";
|
|
146
|
+
}
|
|
147
|
+
// if ((identifierLength > (kMinimumIdsCount * 3) && this.hasPrefixedIdentifiers)
|
|
148
|
+
// && (oneTimeOccurence <= 3 || this.encodedArrayValue > 0)) {
|
|
149
|
+
// return "unknown";
|
|
150
|
+
// }
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=Deobfuscator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Deobfuscator.js","sourceRoot":"","sources":["../src/Deobfuscator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DiGraph, type VertexBody, type VertexDefinition } from "digraph-js";
|
|
2
|
+
import { AstAnalyser, type ReportOnFile, type RuntimeFileOptions } from "./AstAnalyser.js";
|
|
3
|
+
export interface EntryFilesAnalyserOptions {
|
|
4
|
+
astAnalyzer?: AstAnalyser;
|
|
5
|
+
loadExtensions?: (defaults: string[]) => string[];
|
|
6
|
+
rootPath?: string | URL;
|
|
7
|
+
ignoreENOENT?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare class EntryFilesAnalyser {
|
|
10
|
+
#private;
|
|
11
|
+
astAnalyzer: AstAnalyser;
|
|
12
|
+
allowedExtensions: Set<string>;
|
|
13
|
+
dependencies: DiGraph<VertexDefinition<VertexBody>>;
|
|
14
|
+
ignoreENOENT: boolean;
|
|
15
|
+
constructor(options?: EntryFilesAnalyserOptions);
|
|
16
|
+
analyse(entryFiles: Iterable<string | URL>, options?: RuntimeFileOptions): AsyncGenerator<ReportOnFile & {
|
|
17
|
+
file: string;
|
|
18
|
+
}>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=EntryFilesAnalyser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryFilesAnalyser.d.ts","sourceRoot":"","sources":["../src/EntryFilesAnalyser.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,OAAO,EACP,KAAK,UAAU,EACf,KAAK,gBAAgB,EACtB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACxB,MAAM,kBAAkB,CAAC;AAK1B,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IAClD,QAAQ,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,qBAAa,kBAAkB;;IAE7B,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,YAAY,EAAE,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;IACpD,YAAY,EAAE,OAAO,CAAC;gBAGpB,OAAO,GAAE,yBAA8B;IAoBlC,OAAO,CACZ,UAAU,EAAE,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,EAClC,OAAO,GAAE,kBAAuB,GAC/B,cAAc,CAAC,YAAY,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;KAAE,CAAC;CAyIpD"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// Import Node.js Dependencies
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
// Import Third-party Dependencies
|
|
6
|
+
import { DiGraph } from "digraph-js";
|
|
7
|
+
// Import Internal Dependencies
|
|
8
|
+
import { AstAnalyser } from "./AstAnalyser.js";
|
|
9
|
+
// CONSTANTS
|
|
10
|
+
const kDefaultExtensions = ["js", "cjs", "mjs", "node"];
|
|
11
|
+
export class EntryFilesAnalyser {
|
|
12
|
+
#rootPath = null;
|
|
13
|
+
astAnalyzer;
|
|
14
|
+
allowedExtensions;
|
|
15
|
+
dependencies;
|
|
16
|
+
ignoreENOENT;
|
|
17
|
+
constructor(options = {}) {
|
|
18
|
+
const { astAnalyzer = new AstAnalyser(), loadExtensions, rootPath = null, ignoreENOENT = false } = options;
|
|
19
|
+
this.astAnalyzer = astAnalyzer;
|
|
20
|
+
const rawAllowedExtensions = loadExtensions
|
|
21
|
+
? loadExtensions(kDefaultExtensions)
|
|
22
|
+
: kDefaultExtensions;
|
|
23
|
+
this.allowedExtensions = new Set(rawAllowedExtensions);
|
|
24
|
+
this.#rootPath = rootPath === null ?
|
|
25
|
+
null : fileURLToPathExtended(rootPath);
|
|
26
|
+
this.ignoreENOENT = ignoreENOENT;
|
|
27
|
+
}
|
|
28
|
+
async *analyse(entryFiles, options = {}) {
|
|
29
|
+
this.dependencies = new DiGraph();
|
|
30
|
+
for (const entryFile of new Set(entryFiles)) {
|
|
31
|
+
const normalizedEntryFile = this.#normalizeAndCleanEntryFile(entryFile);
|
|
32
|
+
if (this.ignoreENOENT &&
|
|
33
|
+
!await this.#fileExists(normalizedEntryFile)) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
yield* this.#analyseFile(normalizedEntryFile, this.#getRelativeFilePath(normalizedEntryFile), options);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
#normalizeAndCleanEntryFile(file) {
|
|
40
|
+
let normalizedEntryFile = path.normalize(fileURLToPathExtended(file));
|
|
41
|
+
if (this.#rootPath !== null && !path.isAbsolute(normalizedEntryFile)) {
|
|
42
|
+
normalizedEntryFile = path.join(this.#rootPath, normalizedEntryFile);
|
|
43
|
+
}
|
|
44
|
+
return normalizedEntryFile;
|
|
45
|
+
}
|
|
46
|
+
#getRelativeFilePath(file) {
|
|
47
|
+
return this.#rootPath ?
|
|
48
|
+
path.relative(this.#rootPath, file) :
|
|
49
|
+
file;
|
|
50
|
+
}
|
|
51
|
+
async *#analyseFile(file, relativeFile, options) {
|
|
52
|
+
this.dependencies.addVertex({
|
|
53
|
+
id: relativeFile,
|
|
54
|
+
adjacentTo: [],
|
|
55
|
+
body: {}
|
|
56
|
+
});
|
|
57
|
+
const report = await this.astAnalyzer.analyseFile(file, options);
|
|
58
|
+
yield { file: relativeFile, ...report };
|
|
59
|
+
if (!report.ok || typeof report.dependencies === "undefined") {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
for (const [name] of report.dependencies) {
|
|
63
|
+
const depFile = await this.#getInternalDepPath(path.join(path.dirname(file), name));
|
|
64
|
+
if (depFile === null) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const depRelativeFile = this.#getRelativeFilePath(depFile);
|
|
68
|
+
if (!this.dependencies.hasVertex(depRelativeFile)) {
|
|
69
|
+
this.dependencies.addVertex({
|
|
70
|
+
id: depRelativeFile,
|
|
71
|
+
adjacentTo: [],
|
|
72
|
+
body: {}
|
|
73
|
+
});
|
|
74
|
+
yield* this.#analyseFile(depFile, depRelativeFile, options);
|
|
75
|
+
}
|
|
76
|
+
this.dependencies.addEdge({
|
|
77
|
+
from: relativeFile, to: depRelativeFile
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async #getInternalDepPath(filePath) {
|
|
82
|
+
const fileExtension = path.extname(filePath);
|
|
83
|
+
if (fileExtension === "") {
|
|
84
|
+
for (const ext of this.allowedExtensions) {
|
|
85
|
+
const depPathWithExt = `${filePath}.${ext}`;
|
|
86
|
+
const fileExist = await this.#fileExists(depPathWithExt);
|
|
87
|
+
if (fileExist) {
|
|
88
|
+
return depPathWithExt;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
if (!this.allowedExtensions.has(fileExtension.slice(1))) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
const fileExist = await this.#fileExists(filePath);
|
|
97
|
+
if (fileExist) {
|
|
98
|
+
return filePath;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
async #fileExists(filePath) {
|
|
104
|
+
try {
|
|
105
|
+
await fs.access(filePath, fs.constants.R_OK);
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (error.code !== "ENOENT") {
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function fileURLToPathExtended(file) {
|
|
117
|
+
return file instanceof URL ?
|
|
118
|
+
fileURLToPath(file) :
|
|
119
|
+
file;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=EntryFilesAnalyser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryFilesAnalyser.js","sourceRoot":"","sources":["../src/EntryFilesAnalyser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ESTree } from "meriyah";
|
|
2
|
+
export type SourceParserSyntaxError = SyntaxError & {
|
|
3
|
+
start: number;
|
|
4
|
+
end: number;
|
|
5
|
+
range: [number, number];
|
|
6
|
+
description: string;
|
|
7
|
+
loc: ESTree.SourceLocation;
|
|
8
|
+
};
|
|
9
|
+
export interface SourceParser {
|
|
10
|
+
parse(source: string, options: unknown): ESTree.Statement[];
|
|
11
|
+
}
|
|
12
|
+
export interface JsSourceParserOptions {
|
|
13
|
+
isEcmaScriptModule?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare class JsSourceParser implements SourceParser {
|
|
16
|
+
parse(source: string, options?: JsSourceParserOptions): ESTree.Program["body"];
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=JsSourceParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsSourceParser.d.ts","sourceRoot":"","sources":["../src/JsSourceParser.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,MAAM,EAEZ,MAAM,SAAS,CAAC;AAUjB,MAAM,MAAM,uBAAuB,GAAG,WAAW,GAAG;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC;CAC5B,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;CAC7D;AAED,MAAM,WAAW,qBAAqB;IACpC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,qBAAa,cAAe,YAAW,YAAY;IACjD,KAAK,CACH,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,qBAA0B,GAClC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;CAyC1B"}
|