js-confuser 2.0.0 → 2.0.1
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/.github/ISSUE_TEMPLATE/bug_report.md +43 -43
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -20
- package/.github/workflows/node.js.yml +28 -28
- package/.prettierrc +4 -4
- package/CHANGELOG.md +1015 -987
- package/CODE_OF_CONDUCT.md +131 -131
- package/CONTRIBUTING.md +52 -52
- package/LICENSE +21 -21
- package/Migration.md +72 -72
- package/README.md +86 -86
- package/dist/constants.js +43 -43
- package/dist/index.js +14 -23
- package/dist/obfuscator.js +31 -25
- package/dist/order.js +4 -4
- package/dist/presets.js +31 -31
- package/dist/templates/integrityTemplate.js +4 -4
- package/dist/templates/template.js +1 -2
- package/dist/transforms/astScrambler.js +1 -2
- package/dist/transforms/calculator.js +1 -2
- package/dist/transforms/controlFlowFlattening.js +60 -41
- package/dist/transforms/deadCode.js +1 -2
- package/dist/transforms/dispatcher.js +4 -5
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +1 -2
- package/dist/transforms/extraction/objectExtraction.js +1 -2
- package/dist/transforms/finalizer.js +1 -2
- package/dist/transforms/flatten.js +1 -2
- package/dist/transforms/identifier/globalConcealing.js +15 -2
- package/dist/transforms/identifier/movedDeclarations.js +8 -7
- package/dist/transforms/identifier/renameVariables.js +7 -7
- package/dist/transforms/lock/integrity.js +8 -9
- package/dist/transforms/lock/lock.js +1 -2
- package/dist/transforms/minify.js +11 -29
- package/dist/transforms/opaquePredicates.js +1 -2
- package/dist/transforms/pack.js +1 -2
- package/dist/transforms/plugin.js +18 -19
- package/dist/transforms/preparation.js +16 -16
- package/dist/transforms/renameLabels.js +1 -2
- package/dist/transforms/rgf.js +8 -9
- package/dist/transforms/shuffle.js +1 -2
- package/dist/transforms/string/encoding.js +1 -2
- package/dist/transforms/string/stringCompression.js +3 -4
- package/dist/transforms/string/stringConcealing.js +1 -2
- package/dist/transforms/string/stringEncoding.js +1 -2
- package/dist/transforms/variableMasking.js +1 -2
- package/dist/utils/NameGen.js +2 -2
- package/dist/utils/PredicateGen.js +1 -2
- package/dist/utils/ast-utils.js +87 -88
- package/dist/utils/function-utils.js +8 -8
- package/dist/utils/node.js +5 -6
- package/dist/utils/object-utils.js +4 -4
- package/dist/utils/random-utils.js +20 -20
- package/dist/utils/static-utils.js +1 -2
- package/dist/validateOptions.js +4 -7
- package/index.d.ts +17 -17
- package/package.json +61 -59
- package/src/constants.ts +168 -168
- package/src/index.ts +118 -118
- package/src/obfuscationResult.ts +49 -49
- package/src/obfuscator.ts +501 -497
- package/src/options.ts +407 -407
- package/src/order.ts +54 -54
- package/src/presets.ts +125 -125
- package/src/templates/bufferToStringTemplate.ts +57 -57
- package/src/templates/deadCodeTemplates.ts +1185 -1185
- package/src/templates/getGlobalTemplate.ts +76 -76
- package/src/templates/integrityTemplate.ts +64 -64
- package/src/templates/setFunctionLengthTemplate.ts +11 -11
- package/src/templates/stringCompressionTemplate.ts +20 -20
- package/src/templates/tamperProtectionTemplates.ts +120 -120
- package/src/templates/template.ts +224 -224
- package/src/transforms/astScrambler.ts +99 -99
- package/src/transforms/calculator.ts +99 -99
- package/src/transforms/controlFlowFlattening.ts +1716 -1680
- package/src/transforms/deadCode.ts +82 -82
- package/src/transforms/dispatcher.ts +450 -450
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +156 -158
- package/src/transforms/extraction/objectExtraction.ts +186 -186
- package/src/transforms/finalizer.ts +74 -74
- package/src/transforms/flatten.ts +421 -418
- package/src/transforms/identifier/globalConcealing.ts +315 -295
- package/src/transforms/identifier/movedDeclarations.ts +252 -251
- package/src/transforms/identifier/renameVariables.ts +328 -321
- package/src/transforms/lock/integrity.ts +117 -117
- package/src/transforms/lock/lock.ts +418 -418
- package/src/transforms/minify.ts +615 -629
- package/src/transforms/opaquePredicates.ts +100 -100
- package/src/transforms/pack.ts +239 -239
- package/src/transforms/plugin.ts +173 -173
- package/src/transforms/preparation.ts +349 -347
- package/src/transforms/renameLabels.ts +175 -175
- package/src/transforms/rgf.ts +322 -322
- package/src/transforms/shuffle.ts +82 -82
- package/src/transforms/string/encoding.ts +144 -144
- package/src/transforms/string/stringCompression.ts +128 -128
- package/src/transforms/string/stringConcealing.ts +312 -312
- package/src/transforms/string/stringEncoding.ts +80 -80
- package/src/transforms/string/stringSplitting.ts +77 -77
- package/src/transforms/variableMasking.ts +257 -257
- package/src/utils/IntGen.ts +33 -33
- package/src/utils/NameGen.ts +116 -116
- package/src/utils/PredicateGen.ts +61 -61
- package/src/utils/ast-utils.ts +663 -663
- package/src/utils/function-utils.ts +50 -50
- package/src/utils/gen-utils.ts +48 -48
- package/src/utils/node.ts +78 -78
- package/src/utils/object-utils.ts +21 -21
- package/src/utils/random-utils.ts +93 -93
- package/src/utils/static-utils.ts +66 -66
- package/src/validateOptions.ts +256 -259
- package/tsconfig.json +13 -14
- package/dist/probability.js +0 -1
- package/dist/transforms/functionOutlining.js +0 -230
- package/dist/utils/ControlObject.js +0 -125
package/src/constants.ts
CHANGED
|
@@ -1,168 +1,168 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A function is 'unsafe' if it requires 'eval', 'arguments' or 'this'
|
|
3
|
-
*
|
|
4
|
-
* Transformations will generally not touch unsafe functions.
|
|
5
|
-
*/
|
|
6
|
-
export const UNSAFE = Symbol("unsafe");
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* A function is 'predictable' if the invoking parameter lengths are guaranteed to be known.
|
|
10
|
-
*
|
|
11
|
-
* ```js
|
|
12
|
-
* a(1,2,3) // predictable
|
|
13
|
-
* a(...[1,2,3]) // unpredictable
|
|
14
|
-
* ```
|
|
15
|
-
*/
|
|
16
|
-
export const PREDICTABLE = Symbol("predictable");
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* A node is marked as 'skip' if it should not be transformed.
|
|
20
|
-
*
|
|
21
|
-
* Preserved throughout transformations, so be careful with this.
|
|
22
|
-
*/
|
|
23
|
-
export const SKIP = Symbol("skip");
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Saves the original length of a function.
|
|
27
|
-
*/
|
|
28
|
-
export const FN_LENGTH = Symbol("fnLength");
|
|
29
|
-
|
|
30
|
-
export const NO_RENAME = Symbol("noRename");
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* This Identifier is used for a hexadecimal number or escaped string.
|
|
34
|
-
*/
|
|
35
|
-
export const GEN_NODE = Symbol("genNode");
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* This function is used to mark functions that when transformed will most likely cause a maximum call stack error.
|
|
39
|
-
*
|
|
40
|
-
* Examples: Native Function Check
|
|
41
|
-
*/
|
|
42
|
-
export const MULTI_TRANSFORM = Symbol("multiTransform");
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* The function contains a `with` statement.
|
|
46
|
-
*
|
|
47
|
-
* OR
|
|
48
|
-
*
|
|
49
|
-
* This identifier is used for a `with` statement.
|
|
50
|
-
*
|
|
51
|
-
* Tells Pack not to globally transform the node.
|
|
52
|
-
*/
|
|
53
|
-
export const WITH_STATEMENT = Symbol("withStatement");
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Tells minify to not remove the node.
|
|
57
|
-
*/
|
|
58
|
-
export const NO_REMOVE = Symbol("noRemove");
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Symbols describe precomputed semantics of a node, allowing the obfuscator to make the best choices for the node.
|
|
62
|
-
*/
|
|
63
|
-
export interface NodeSymbol {
|
|
64
|
-
[UNSAFE]?: boolean;
|
|
65
|
-
[PREDICTABLE]?: boolean;
|
|
66
|
-
[SKIP]?: boolean | number;
|
|
67
|
-
[FN_LENGTH]?: number;
|
|
68
|
-
[NO_RENAME]?: string | number;
|
|
69
|
-
|
|
70
|
-
[GEN_NODE]?: boolean;
|
|
71
|
-
[MULTI_TRANSFORM]?: boolean;
|
|
72
|
-
[WITH_STATEMENT]?: boolean;
|
|
73
|
-
[NO_REMOVE]?: boolean;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Allows the user to grab the variable name of a renamed variable.
|
|
78
|
-
*/
|
|
79
|
-
export const variableFunctionName = "__JS_CONFUSER_VAR__";
|
|
80
|
-
|
|
81
|
-
export const noRenameVariablePrefix = "__NO_JS_CONFUSER_RENAME__";
|
|
82
|
-
export const placeholderVariablePrefix = "__p_";
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Identifiers that are not actually variables.
|
|
86
|
-
*/
|
|
87
|
-
export const reservedIdentifiers = new Set([
|
|
88
|
-
"undefined",
|
|
89
|
-
"null",
|
|
90
|
-
"NaN",
|
|
91
|
-
"Infinity",
|
|
92
|
-
"eval",
|
|
93
|
-
"arguments",
|
|
94
|
-
]);
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Reserved Node.JS module identifiers.
|
|
98
|
-
*/
|
|
99
|
-
export const reservedNodeModuleIdentifiers = new Set([
|
|
100
|
-
"module",
|
|
101
|
-
"exports",
|
|
102
|
-
"require",
|
|
103
|
-
]);
|
|
104
|
-
|
|
105
|
-
export const reservedObjectPrototype = new Set([
|
|
106
|
-
"toString",
|
|
107
|
-
"valueOf",
|
|
108
|
-
"constructor",
|
|
109
|
-
"__proto__",
|
|
110
|
-
"hasOwnProperty",
|
|
111
|
-
"isPrototypeOf",
|
|
112
|
-
"propertyIsEnumerable",
|
|
113
|
-
"toLocaleString",
|
|
114
|
-
]);
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* For Zero Width generator - Mangled variable names
|
|
118
|
-
*/
|
|
119
|
-
export const reservedKeywords = [
|
|
120
|
-
"if",
|
|
121
|
-
"in",
|
|
122
|
-
"do",
|
|
123
|
-
"for",
|
|
124
|
-
"let",
|
|
125
|
-
"new",
|
|
126
|
-
"try",
|
|
127
|
-
"var",
|
|
128
|
-
"case",
|
|
129
|
-
"else",
|
|
130
|
-
"null",
|
|
131
|
-
"with",
|
|
132
|
-
"break",
|
|
133
|
-
"catch",
|
|
134
|
-
"class",
|
|
135
|
-
"const",
|
|
136
|
-
"super",
|
|
137
|
-
"throw",
|
|
138
|
-
"while",
|
|
139
|
-
"yield",
|
|
140
|
-
"delete",
|
|
141
|
-
"export",
|
|
142
|
-
"import",
|
|
143
|
-
"public",
|
|
144
|
-
"return",
|
|
145
|
-
"switch",
|
|
146
|
-
"default",
|
|
147
|
-
"finally",
|
|
148
|
-
"private",
|
|
149
|
-
"continue",
|
|
150
|
-
"debugger",
|
|
151
|
-
"function",
|
|
152
|
-
"arguments",
|
|
153
|
-
"protected",
|
|
154
|
-
"instanceof",
|
|
155
|
-
"await",
|
|
156
|
-
"async",
|
|
157
|
-
|
|
158
|
-
// new key words and other fun stuff :P
|
|
159
|
-
"NaN",
|
|
160
|
-
"undefined",
|
|
161
|
-
"true",
|
|
162
|
-
"false",
|
|
163
|
-
"typeof",
|
|
164
|
-
"this",
|
|
165
|
-
"static",
|
|
166
|
-
"void",
|
|
167
|
-
"of",
|
|
168
|
-
];
|
|
1
|
+
/**
|
|
2
|
+
* A function is 'unsafe' if it requires 'eval', 'arguments' or 'this'
|
|
3
|
+
*
|
|
4
|
+
* Transformations will generally not touch unsafe functions.
|
|
5
|
+
*/
|
|
6
|
+
export const UNSAFE = Symbol("unsafe");
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A function is 'predictable' if the invoking parameter lengths are guaranteed to be known.
|
|
10
|
+
*
|
|
11
|
+
* ```js
|
|
12
|
+
* a(1,2,3) // predictable
|
|
13
|
+
* a(...[1,2,3]) // unpredictable
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export const PREDICTABLE = Symbol("predictable");
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* A node is marked as 'skip' if it should not be transformed.
|
|
20
|
+
*
|
|
21
|
+
* Preserved throughout transformations, so be careful with this.
|
|
22
|
+
*/
|
|
23
|
+
export const SKIP = Symbol("skip");
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Saves the original length of a function.
|
|
27
|
+
*/
|
|
28
|
+
export const FN_LENGTH = Symbol("fnLength");
|
|
29
|
+
|
|
30
|
+
export const NO_RENAME = Symbol("noRename");
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* This Identifier is used for a hexadecimal number or escaped string.
|
|
34
|
+
*/
|
|
35
|
+
export const GEN_NODE = Symbol("genNode");
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* This function is used to mark functions that when transformed will most likely cause a maximum call stack error.
|
|
39
|
+
*
|
|
40
|
+
* Examples: Native Function Check
|
|
41
|
+
*/
|
|
42
|
+
export const MULTI_TRANSFORM = Symbol("multiTransform");
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The function contains a `with` statement.
|
|
46
|
+
*
|
|
47
|
+
* OR
|
|
48
|
+
*
|
|
49
|
+
* This identifier is used for a `with` statement.
|
|
50
|
+
*
|
|
51
|
+
* Tells Pack not to globally transform the node.
|
|
52
|
+
*/
|
|
53
|
+
export const WITH_STATEMENT = Symbol("withStatement");
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Tells minify to not remove the node.
|
|
57
|
+
*/
|
|
58
|
+
export const NO_REMOVE = Symbol("noRemove");
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Symbols describe precomputed semantics of a node, allowing the obfuscator to make the best choices for the node.
|
|
62
|
+
*/
|
|
63
|
+
export interface NodeSymbol {
|
|
64
|
+
[UNSAFE]?: boolean;
|
|
65
|
+
[PREDICTABLE]?: boolean;
|
|
66
|
+
[SKIP]?: boolean | number;
|
|
67
|
+
[FN_LENGTH]?: number;
|
|
68
|
+
[NO_RENAME]?: string | number;
|
|
69
|
+
|
|
70
|
+
[GEN_NODE]?: boolean;
|
|
71
|
+
[MULTI_TRANSFORM]?: boolean;
|
|
72
|
+
[WITH_STATEMENT]?: boolean;
|
|
73
|
+
[NO_REMOVE]?: boolean;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Allows the user to grab the variable name of a renamed variable.
|
|
78
|
+
*/
|
|
79
|
+
export const variableFunctionName = "__JS_CONFUSER_VAR__";
|
|
80
|
+
|
|
81
|
+
export const noRenameVariablePrefix = "__NO_JS_CONFUSER_RENAME__";
|
|
82
|
+
export const placeholderVariablePrefix = "__p_";
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Identifiers that are not actually variables.
|
|
86
|
+
*/
|
|
87
|
+
export const reservedIdentifiers = new Set([
|
|
88
|
+
"undefined",
|
|
89
|
+
"null",
|
|
90
|
+
"NaN",
|
|
91
|
+
"Infinity",
|
|
92
|
+
"eval",
|
|
93
|
+
"arguments",
|
|
94
|
+
]);
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Reserved Node.JS module identifiers.
|
|
98
|
+
*/
|
|
99
|
+
export const reservedNodeModuleIdentifiers = new Set([
|
|
100
|
+
"module",
|
|
101
|
+
"exports",
|
|
102
|
+
"require",
|
|
103
|
+
]);
|
|
104
|
+
|
|
105
|
+
export const reservedObjectPrototype = new Set([
|
|
106
|
+
"toString",
|
|
107
|
+
"valueOf",
|
|
108
|
+
"constructor",
|
|
109
|
+
"__proto__",
|
|
110
|
+
"hasOwnProperty",
|
|
111
|
+
"isPrototypeOf",
|
|
112
|
+
"propertyIsEnumerable",
|
|
113
|
+
"toLocaleString",
|
|
114
|
+
]);
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* For Zero Width generator - Mangled variable names
|
|
118
|
+
*/
|
|
119
|
+
export const reservedKeywords = [
|
|
120
|
+
"if",
|
|
121
|
+
"in",
|
|
122
|
+
"do",
|
|
123
|
+
"for",
|
|
124
|
+
"let",
|
|
125
|
+
"new",
|
|
126
|
+
"try",
|
|
127
|
+
"var",
|
|
128
|
+
"case",
|
|
129
|
+
"else",
|
|
130
|
+
"null",
|
|
131
|
+
"with",
|
|
132
|
+
"break",
|
|
133
|
+
"catch",
|
|
134
|
+
"class",
|
|
135
|
+
"const",
|
|
136
|
+
"super",
|
|
137
|
+
"throw",
|
|
138
|
+
"while",
|
|
139
|
+
"yield",
|
|
140
|
+
"delete",
|
|
141
|
+
"export",
|
|
142
|
+
"import",
|
|
143
|
+
"public",
|
|
144
|
+
"return",
|
|
145
|
+
"switch",
|
|
146
|
+
"default",
|
|
147
|
+
"finally",
|
|
148
|
+
"private",
|
|
149
|
+
"continue",
|
|
150
|
+
"debugger",
|
|
151
|
+
"function",
|
|
152
|
+
"arguments",
|
|
153
|
+
"protected",
|
|
154
|
+
"instanceof",
|
|
155
|
+
"await",
|
|
156
|
+
"async",
|
|
157
|
+
|
|
158
|
+
// new key words and other fun stuff :P
|
|
159
|
+
"NaN",
|
|
160
|
+
"undefined",
|
|
161
|
+
"true",
|
|
162
|
+
"false",
|
|
163
|
+
"typeof",
|
|
164
|
+
"this",
|
|
165
|
+
"static",
|
|
166
|
+
"void",
|
|
167
|
+
"of",
|
|
168
|
+
];
|
package/src/index.ts
CHANGED
|
@@ -1,118 +1,118 @@
|
|
|
1
|
-
import * as babelTypes from "@babel/types";
|
|
2
|
-
import Obfuscator from "./obfuscator";
|
|
3
|
-
import { ObfuscateOptions } from "./options";
|
|
4
|
-
import {
|
|
5
|
-
ObfuscationResult,
|
|
6
|
-
ProfileData,
|
|
7
|
-
ProfilerCallback,
|
|
8
|
-
ProfilerLog,
|
|
9
|
-
} from "./obfuscationResult";
|
|
10
|
-
import presets from "./presets";
|
|
11
|
-
import Template from "./templates/template";
|
|
12
|
-
|
|
13
|
-
export async function obfuscate(
|
|
14
|
-
sourceCode: string,
|
|
15
|
-
options: ObfuscateOptions
|
|
16
|
-
): Promise<ObfuscationResult> {
|
|
17
|
-
const obfuscator = new Obfuscator(options);
|
|
18
|
-
|
|
19
|
-
return obfuscator.obfuscate(sourceCode);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export async function obfuscateAST(
|
|
23
|
-
ast: babelTypes.File,
|
|
24
|
-
options: ObfuscateOptions
|
|
25
|
-
) {
|
|
26
|
-
const obfuscator = new Obfuscator(options);
|
|
27
|
-
|
|
28
|
-
return obfuscator.obfuscateAST(ast);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export async function obfuscateWithProfiler(
|
|
32
|
-
sourceCode: string,
|
|
33
|
-
options: ObfuscateOptions,
|
|
34
|
-
profiler: {
|
|
35
|
-
callback?: ProfilerCallback;
|
|
36
|
-
performance?: { now(): number };
|
|
37
|
-
} = {}
|
|
38
|
-
): Promise<ObfuscationResult & { profileData: ProfileData }> {
|
|
39
|
-
if (!profiler.performance) {
|
|
40
|
-
profiler.performance = {
|
|
41
|
-
now: () => Date.now(),
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const startTime = performance.now();
|
|
46
|
-
|
|
47
|
-
const obfuscator = new Obfuscator(options);
|
|
48
|
-
let totalTransforms = obfuscator.plugins.length;
|
|
49
|
-
|
|
50
|
-
let transformMap: ProfileData["transforms"] = Object.create(null);
|
|
51
|
-
|
|
52
|
-
const beforeParseTime = performance.now();
|
|
53
|
-
|
|
54
|
-
let ast = Obfuscator.parseCode(sourceCode);
|
|
55
|
-
|
|
56
|
-
const parseTime = performance.now() - beforeParseTime;
|
|
57
|
-
|
|
58
|
-
let currentTransformTime = performance.now();
|
|
59
|
-
|
|
60
|
-
ast = obfuscator.obfuscateAST(ast, {
|
|
61
|
-
profiler: (log: ProfilerLog) => {
|
|
62
|
-
var nowTime = performance.now();
|
|
63
|
-
let entry = {
|
|
64
|
-
transformTime: nowTime - currentTransformTime,
|
|
65
|
-
changeData: {},
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
transformMap[log.currentTransform] = entry;
|
|
69
|
-
|
|
70
|
-
// (JS-Confuser.com can run performance benchmark tests here)
|
|
71
|
-
profiler.callback?.(log, entry, ast);
|
|
72
|
-
|
|
73
|
-
// The profiler.callback() function may take a long time to execute,
|
|
74
|
-
// so we need to update the currentTransformTime here for accurate profiling.
|
|
75
|
-
currentTransformTime = performance.now();
|
|
76
|
-
},
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
obfuscator.plugins.forEach(({ pluginInstance }) => {
|
|
80
|
-
if (transformMap[pluginInstance.name]) {
|
|
81
|
-
transformMap[pluginInstance.name].changeData = pluginInstance.changeData;
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
const beforeCompileTime = performance.now();
|
|
86
|
-
|
|
87
|
-
const code = Obfuscator.generateCode(ast, obfuscator.options);
|
|
88
|
-
|
|
89
|
-
const compileTime = performance.now() - beforeCompileTime;
|
|
90
|
-
|
|
91
|
-
const endTime = performance.now();
|
|
92
|
-
|
|
93
|
-
const obfuscationTime = endTime - startTime;
|
|
94
|
-
|
|
95
|
-
return {
|
|
96
|
-
code: code,
|
|
97
|
-
profileData: {
|
|
98
|
-
transforms: transformMap,
|
|
99
|
-
obfuscationTime: obfuscationTime,
|
|
100
|
-
parseTime: parseTime,
|
|
101
|
-
compileTime: compileTime,
|
|
102
|
-
totalTransforms: totalTransforms,
|
|
103
|
-
totalPossibleTransforms: obfuscator.totalPossibleTransforms,
|
|
104
|
-
},
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
const JsConfuser = {
|
|
109
|
-
obfuscate,
|
|
110
|
-
obfuscateAST,
|
|
111
|
-
obfuscateWithProfiler,
|
|
112
|
-
Obfuscator,
|
|
113
|
-
presets,
|
|
114
|
-
Template,
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
export default JsConfuser;
|
|
118
|
-
export { Obfuscator, presets, Template };
|
|
1
|
+
import * as babelTypes from "@babel/types";
|
|
2
|
+
import Obfuscator from "./obfuscator";
|
|
3
|
+
import { ObfuscateOptions } from "./options";
|
|
4
|
+
import {
|
|
5
|
+
ObfuscationResult,
|
|
6
|
+
ProfileData,
|
|
7
|
+
ProfilerCallback,
|
|
8
|
+
ProfilerLog,
|
|
9
|
+
} from "./obfuscationResult";
|
|
10
|
+
import presets from "./presets";
|
|
11
|
+
import Template from "./templates/template";
|
|
12
|
+
|
|
13
|
+
export async function obfuscate(
|
|
14
|
+
sourceCode: string,
|
|
15
|
+
options: ObfuscateOptions
|
|
16
|
+
): Promise<ObfuscationResult> {
|
|
17
|
+
const obfuscator = new Obfuscator(options);
|
|
18
|
+
|
|
19
|
+
return obfuscator.obfuscate(sourceCode);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export async function obfuscateAST(
|
|
23
|
+
ast: babelTypes.File,
|
|
24
|
+
options: ObfuscateOptions
|
|
25
|
+
) {
|
|
26
|
+
const obfuscator = new Obfuscator(options);
|
|
27
|
+
|
|
28
|
+
return obfuscator.obfuscateAST(ast);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export async function obfuscateWithProfiler(
|
|
32
|
+
sourceCode: string,
|
|
33
|
+
options: ObfuscateOptions,
|
|
34
|
+
profiler: {
|
|
35
|
+
callback?: ProfilerCallback;
|
|
36
|
+
performance?: { now(): number };
|
|
37
|
+
} = {}
|
|
38
|
+
): Promise<ObfuscationResult & { profileData: ProfileData }> {
|
|
39
|
+
if (!profiler.performance) {
|
|
40
|
+
profiler.performance = {
|
|
41
|
+
now: () => Date.now(),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const startTime = performance.now();
|
|
46
|
+
|
|
47
|
+
const obfuscator = new Obfuscator(options);
|
|
48
|
+
let totalTransforms = obfuscator.plugins.length;
|
|
49
|
+
|
|
50
|
+
let transformMap: ProfileData["transforms"] = Object.create(null);
|
|
51
|
+
|
|
52
|
+
const beforeParseTime = performance.now();
|
|
53
|
+
|
|
54
|
+
let ast = Obfuscator.parseCode(sourceCode);
|
|
55
|
+
|
|
56
|
+
const parseTime = performance.now() - beforeParseTime;
|
|
57
|
+
|
|
58
|
+
let currentTransformTime = performance.now();
|
|
59
|
+
|
|
60
|
+
ast = obfuscator.obfuscateAST(ast, {
|
|
61
|
+
profiler: (log: ProfilerLog) => {
|
|
62
|
+
var nowTime = performance.now();
|
|
63
|
+
let entry = {
|
|
64
|
+
transformTime: nowTime - currentTransformTime,
|
|
65
|
+
changeData: {},
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
transformMap[log.currentTransform] = entry;
|
|
69
|
+
|
|
70
|
+
// (JS-Confuser.com can run performance benchmark tests here)
|
|
71
|
+
profiler.callback?.(log, entry, ast);
|
|
72
|
+
|
|
73
|
+
// The profiler.callback() function may take a long time to execute,
|
|
74
|
+
// so we need to update the currentTransformTime here for accurate profiling.
|
|
75
|
+
currentTransformTime = performance.now();
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
obfuscator.plugins.forEach(({ pluginInstance }) => {
|
|
80
|
+
if (transformMap[pluginInstance.name]) {
|
|
81
|
+
transformMap[pluginInstance.name].changeData = pluginInstance.changeData;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const beforeCompileTime = performance.now();
|
|
86
|
+
|
|
87
|
+
const code = Obfuscator.generateCode(ast, obfuscator.options);
|
|
88
|
+
|
|
89
|
+
const compileTime = performance.now() - beforeCompileTime;
|
|
90
|
+
|
|
91
|
+
const endTime = performance.now();
|
|
92
|
+
|
|
93
|
+
const obfuscationTime = endTime - startTime;
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
code: code,
|
|
97
|
+
profileData: {
|
|
98
|
+
transforms: transformMap,
|
|
99
|
+
obfuscationTime: obfuscationTime,
|
|
100
|
+
parseTime: parseTime,
|
|
101
|
+
compileTime: compileTime,
|
|
102
|
+
totalTransforms: totalTransforms,
|
|
103
|
+
totalPossibleTransforms: obfuscator.totalPossibleTransforms,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const JsConfuser = {
|
|
109
|
+
obfuscate,
|
|
110
|
+
obfuscateAST,
|
|
111
|
+
obfuscateWithProfiler,
|
|
112
|
+
Obfuscator,
|
|
113
|
+
presets,
|
|
114
|
+
Template,
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
export default JsConfuser;
|
|
118
|
+
export { Obfuscator, presets, Template };
|
package/src/obfuscationResult.ts
CHANGED
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
import { PluginInstance } from "./transforms/plugin";
|
|
2
|
-
import { File } from "@babel/types";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Obfuscation result object.
|
|
6
|
-
*/
|
|
7
|
-
export interface ObfuscationResult {
|
|
8
|
-
/**
|
|
9
|
-
* Obfuscated code.
|
|
10
|
-
*/
|
|
11
|
-
code: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Profile report for the obfuscation process.
|
|
16
|
-
*/
|
|
17
|
-
export interface ProfileData {
|
|
18
|
-
obfuscationTime: number;
|
|
19
|
-
compileTime: number;
|
|
20
|
-
parseTime: number;
|
|
21
|
-
totalPossibleTransforms: number;
|
|
22
|
-
totalTransforms: number;
|
|
23
|
-
transforms: {
|
|
24
|
-
[transformName: string]: {
|
|
25
|
-
transformTime: number;
|
|
26
|
-
changeData: PluginInstance["changeData"];
|
|
27
|
-
fileSize?: string;
|
|
28
|
-
};
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* A callback function that is called when a transform is applied.
|
|
34
|
-
*/
|
|
35
|
-
export type ProfilerCallback = (
|
|
36
|
-
log: ProfilerLog,
|
|
37
|
-
transformEntry?: object,
|
|
38
|
-
ast?: File
|
|
39
|
-
) => void;
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* The current progress of the obfuscation process.
|
|
43
|
-
*/
|
|
44
|
-
export interface ProfilerLog {
|
|
45
|
-
index: number;
|
|
46
|
-
currentTransform: string;
|
|
47
|
-
nextTransform: string;
|
|
48
|
-
totalTransforms: number;
|
|
49
|
-
}
|
|
1
|
+
import { PluginInstance } from "./transforms/plugin";
|
|
2
|
+
import { File } from "@babel/types";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Obfuscation result object.
|
|
6
|
+
*/
|
|
7
|
+
export interface ObfuscationResult {
|
|
8
|
+
/**
|
|
9
|
+
* Obfuscated code.
|
|
10
|
+
*/
|
|
11
|
+
code: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Profile report for the obfuscation process.
|
|
16
|
+
*/
|
|
17
|
+
export interface ProfileData {
|
|
18
|
+
obfuscationTime: number;
|
|
19
|
+
compileTime: number;
|
|
20
|
+
parseTime: number;
|
|
21
|
+
totalPossibleTransforms: number;
|
|
22
|
+
totalTransforms: number;
|
|
23
|
+
transforms: {
|
|
24
|
+
[transformName: string]: {
|
|
25
|
+
transformTime: number;
|
|
26
|
+
changeData: PluginInstance["changeData"];
|
|
27
|
+
fileSize?: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* A callback function that is called when a transform is applied.
|
|
34
|
+
*/
|
|
35
|
+
export type ProfilerCallback = (
|
|
36
|
+
log: ProfilerLog,
|
|
37
|
+
transformEntry?: object,
|
|
38
|
+
ast?: File
|
|
39
|
+
) => void;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The current progress of the obfuscation process.
|
|
43
|
+
*/
|
|
44
|
+
export interface ProfilerLog {
|
|
45
|
+
index: number;
|
|
46
|
+
currentTransform: string;
|
|
47
|
+
nextTransform: string;
|
|
48
|
+
totalTransforms: number;
|
|
49
|
+
}
|