@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.
Files changed (174) hide show
  1. package/dist/AstAnalyser.d.ts +64 -0
  2. package/dist/AstAnalyser.d.ts.map +1 -0
  3. package/dist/AstAnalyser.js +165 -0
  4. package/dist/AstAnalyser.js.map +1 -0
  5. package/dist/Deobfuscator.d.ts +36 -0
  6. package/dist/Deobfuscator.d.ts.map +1 -0
  7. package/dist/Deobfuscator.js +154 -0
  8. package/dist/Deobfuscator.js.map +1 -0
  9. package/dist/EntryFilesAnalyser.d.ts +20 -0
  10. package/dist/EntryFilesAnalyser.d.ts.map +1 -0
  11. package/dist/EntryFilesAnalyser.js +121 -0
  12. package/dist/EntryFilesAnalyser.js.map +1 -0
  13. package/dist/JsSourceParser.d.ts +18 -0
  14. package/dist/JsSourceParser.d.ts.map +1 -0
  15. package/dist/JsSourceParser.js +38 -0
  16. package/dist/JsSourceParser.js.map +1 -0
  17. package/dist/NodeCounter.d.ts +24 -0
  18. package/dist/NodeCounter.d.ts.map +1 -0
  19. package/dist/NodeCounter.js +62 -0
  20. package/dist/NodeCounter.js.map +1 -0
  21. package/dist/ProbeRunner.d.ts +40 -0
  22. package/dist/ProbeRunner.d.ts.map +1 -0
  23. package/dist/ProbeRunner.js +106 -0
  24. package/dist/ProbeRunner.js.map +1 -0
  25. package/dist/SourceFile.d.ts +43 -0
  26. package/dist/SourceFile.d.ts.map +1 -0
  27. package/dist/SourceFile.js +137 -0
  28. package/dist/SourceFile.js.map +1 -0
  29. package/dist/index.d.ts +6 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/{src/index.ts → dist/index.js} +1 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/obfuscators/freejsobfuscator.d.ts +3 -0
  34. package/dist/obfuscators/freejsobfuscator.d.ts.map +1 -0
  35. package/dist/obfuscators/freejsobfuscator.js +10 -0
  36. package/dist/obfuscators/freejsobfuscator.js.map +1 -0
  37. package/dist/obfuscators/jjencode.d.ts +3 -0
  38. package/dist/obfuscators/jjencode.d.ts.map +1 -0
  39. package/dist/obfuscators/jjencode.js +24 -0
  40. package/dist/obfuscators/jjencode.js.map +1 -0
  41. package/dist/obfuscators/jsfuck.d.ts +3 -0
  42. package/dist/obfuscators/jsfuck.d.ts.map +1 -0
  43. package/dist/obfuscators/jsfuck.js +13 -0
  44. package/dist/obfuscators/jsfuck.js.map +1 -0
  45. package/dist/obfuscators/obfuscator-io.d.ts +3 -0
  46. package/dist/obfuscators/obfuscator-io.d.ts.map +1 -0
  47. package/dist/obfuscators/obfuscator-io.js +15 -0
  48. package/dist/obfuscators/obfuscator-io.js.map +1 -0
  49. package/dist/obfuscators/trojan-source.d.ts +2 -0
  50. package/dist/obfuscators/trojan-source.d.ts.map +1 -0
  51. package/dist/obfuscators/trojan-source.js +27 -0
  52. package/dist/obfuscators/trojan-source.js.map +1 -0
  53. package/dist/probes/isArrayExpression.d.ts +21 -0
  54. package/dist/probes/isArrayExpression.d.ts.map +1 -0
  55. package/dist/probes/isArrayExpression.js +27 -0
  56. package/dist/probes/isArrayExpression.js.map +1 -0
  57. package/dist/probes/isBinaryExpression.d.ts +21 -0
  58. package/dist/probes/isBinaryExpression.d.ts.map +1 -0
  59. package/dist/probes/isBinaryExpression.js +54 -0
  60. package/dist/probes/isBinaryExpression.js.map +1 -0
  61. package/dist/probes/isESMExport.d.ts +24 -0
  62. package/dist/probes/isESMExport.d.ts.map +1 -0
  63. package/dist/probes/isESMExport.js +30 -0
  64. package/dist/probes/isESMExport.js.map +1 -0
  65. package/dist/probes/isFetch.d.ts +14 -0
  66. package/dist/probes/isFetch.d.ts.map +1 -0
  67. package/dist/probes/isFetch.js +18 -0
  68. package/dist/probes/isFetch.js.map +1 -0
  69. package/dist/probes/isImportDeclaration.d.ts +26 -0
  70. package/dist/probes/isImportDeclaration.d.ts.map +1 -0
  71. package/dist/probes/isImportDeclaration.js +38 -0
  72. package/dist/probes/isImportDeclaration.js.map +1 -0
  73. package/dist/probes/isLiteral.d.ts +21 -0
  74. package/dist/probes/isLiteral.d.ts.map +1 -0
  75. package/dist/probes/isLiteral.js +66 -0
  76. package/dist/probes/isLiteral.js.map +1 -0
  77. package/dist/probes/isLiteralRegex.d.ts +20 -0
  78. package/dist/probes/isLiteralRegex.d.ts.map +1 -0
  79. package/dist/probes/isLiteralRegex.js +30 -0
  80. package/dist/probes/isLiteralRegex.js.map +1 -0
  81. package/dist/probes/isRegexObject.d.ts +22 -0
  82. package/dist/probes/isRegexObject.d.ts.map +1 -0
  83. package/dist/probes/isRegexObject.js +50 -0
  84. package/dist/probes/isRegexObject.js.map +1 -0
  85. package/dist/probes/isRequire/RequireCallExpressionWalker.d.ts +15 -0
  86. package/dist/probes/isRequire/RequireCallExpressionWalker.d.ts.map +1 -0
  87. package/dist/probes/isRequire/RequireCallExpressionWalker.js +95 -0
  88. package/dist/probes/isRequire/RequireCallExpressionWalker.js.map +1 -0
  89. package/dist/probes/isRequire/isRequire.d.ts +20 -0
  90. package/dist/probes/isRequire/isRequire.d.ts.map +1 -0
  91. package/dist/probes/isRequire/isRequire.js +138 -0
  92. package/dist/probes/isRequire/isRequire.js.map +1 -0
  93. package/dist/probes/isSerializeEnv.d.ts +24 -0
  94. package/dist/probes/isSerializeEnv.d.ts.map +1 -0
  95. package/dist/probes/isSerializeEnv.js +66 -0
  96. package/dist/probes/isSerializeEnv.js.map +1 -0
  97. package/dist/probes/isSyncIO.d.ts +16 -0
  98. package/dist/probes/isSyncIO.d.ts.map +1 -0
  99. package/dist/probes/isSyncIO.js +74 -0
  100. package/dist/probes/isSyncIO.js.map +1 -0
  101. package/dist/probes/isUnsafeCallee.d.ts +22 -0
  102. package/dist/probes/isUnsafeCallee.d.ts.map +1 -0
  103. package/dist/probes/isUnsafeCallee.js +60 -0
  104. package/dist/probes/isUnsafeCallee.js.map +1 -0
  105. package/dist/probes/isUnsafeCommand.d.ts +24 -0
  106. package/dist/probes/isUnsafeCommand.d.ts.map +1 -0
  107. package/dist/probes/isUnsafeCommand.js +100 -0
  108. package/dist/probes/isUnsafeCommand.js.map +1 -0
  109. package/dist/probes/isWeakCrypto.d.ts +16 -0
  110. package/dist/probes/isWeakCrypto.d.ts.map +1 -0
  111. package/dist/probes/isWeakCrypto.js +46 -0
  112. package/dist/probes/isWeakCrypto.js.map +1 -0
  113. package/dist/types/estree.d.ts +11 -0
  114. package/dist/types/estree.d.ts.map +1 -0
  115. package/dist/types/estree.js +15 -0
  116. package/dist/types/estree.js.map +1 -0
  117. package/dist/utils/extractNode.d.ts +5 -0
  118. package/dist/utils/extractNode.d.ts.map +1 -0
  119. package/dist/utils/extractNode.js +13 -0
  120. package/dist/utils/extractNode.js.map +1 -0
  121. package/dist/utils/index.d.ts +5 -0
  122. package/dist/utils/index.d.ts.map +1 -0
  123. package/{src/utils/index.ts → dist/utils/index.js} +1 -0
  124. package/dist/utils/index.js.map +1 -0
  125. package/dist/utils/isOneLineExpressionExport.d.ts +3 -0
  126. package/dist/utils/isOneLineExpressionExport.d.ts.map +1 -0
  127. package/dist/utils/isOneLineExpressionExport.js +49 -0
  128. package/dist/utils/isOneLineExpressionExport.js.map +1 -0
  129. package/dist/utils/notNullOrUndefined.d.ts +2 -0
  130. package/dist/utils/notNullOrUndefined.d.ts.map +1 -0
  131. package/dist/utils/notNullOrUndefined.js +4 -0
  132. package/dist/utils/notNullOrUndefined.js.map +1 -0
  133. package/dist/utils/toArrayLocation.d.ts +5 -0
  134. package/dist/utils/toArrayLocation.d.ts.map +1 -0
  135. package/dist/utils/toArrayLocation.js +14 -0
  136. package/dist/utils/toArrayLocation.js.map +1 -0
  137. package/dist/warnings.d.ts +88 -0
  138. package/dist/warnings.d.ts.map +1 -0
  139. package/dist/warnings.js +91 -0
  140. package/dist/warnings.js.map +1 -0
  141. package/package.json +3 -6
  142. package/src/AstAnalyser.ts +0 -283
  143. package/src/Deobfuscator.ts +0 -228
  144. package/src/EntryFilesAnalyser.ts +0 -206
  145. package/src/JsSourceParser.ts +0 -77
  146. package/src/NodeCounter.ts +0 -90
  147. package/src/ProbeRunner.ts +0 -167
  148. package/src/SourceFile.ts +0 -226
  149. package/src/obfuscators/freejsobfuscator.ts +0 -17
  150. package/src/obfuscators/jjencode.ts +0 -39
  151. package/src/obfuscators/jsfuck.ts +0 -19
  152. package/src/obfuscators/obfuscator-io.ts +0 -25
  153. package/src/obfuscators/trojan-source.ts +0 -30
  154. package/src/probes/isArrayExpression.ts +0 -41
  155. package/src/probes/isBinaryExpression.ts +0 -74
  156. package/src/probes/isESMExport.ts +0 -50
  157. package/src/probes/isFetch.ts +0 -28
  158. package/src/probes/isImportDeclaration.ts +0 -58
  159. package/src/probes/isLiteral.ts +0 -91
  160. package/src/probes/isLiteralRegex.ts +0 -42
  161. package/src/probes/isRegexObject.ts +0 -71
  162. package/src/probes/isRequire/RequireCallExpressionWalker.ts +0 -142
  163. package/src/probes/isRequire/isRequire.ts +0 -195
  164. package/src/probes/isSerializeEnv.ts +0 -65
  165. package/src/probes/isSyncIO.ts +0 -96
  166. package/src/probes/isUnsafeCallee.ts +0 -89
  167. package/src/probes/isUnsafeCommand.ts +0 -133
  168. package/src/probes/isWeakCrypto.ts +0 -69
  169. package/src/types/estree.ts +0 -35
  170. package/src/utils/extractNode.ts +0 -22
  171. package/src/utils/isOneLineExpressionExport.ts +0 -70
  172. package/src/utils/notNullOrUndefined.ts +0 -5
  173. package/src/utils/toArrayLocation.ts +0 -22
  174. 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":"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"}
@@ -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"}