js-confuser 1.7.3 → 2.0.0-alpha.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/.github/ISSUE_TEMPLATE/bug_report.md +6 -4
- package/CHANGELOG.md +70 -0
- package/Migration.md +57 -0
- package/README.md +23 -929
- package/dist/constants.js +65 -14
- package/dist/index.js +108 -160
- package/dist/obfuscator.js +316 -118
- package/dist/options.js +1 -119
- package/dist/order.js +30 -30
- package/dist/presets.js +47 -45
- package/dist/probability.js +25 -32
- package/dist/templates/bufferToStringTemplate.js +9 -0
- package/dist/templates/deadCodeTemplates.js +9 -0
- package/dist/templates/getGlobalTemplate.js +19 -0
- package/dist/templates/integrityTemplate.js +30 -0
- package/dist/templates/setFunctionLengthTemplate.js +9 -0
- package/dist/templates/stringCompressionTemplate.js +10 -0
- package/dist/templates/tamperProtectionTemplates.js +21 -0
- package/dist/templates/template.js +199 -184
- package/dist/transforms/astScrambler.js +100 -0
- package/dist/transforms/calculator.js +70 -127
- package/dist/transforms/controlFlowFlattening.js +1182 -0
- package/dist/transforms/deadCode.js +62 -587
- package/dist/transforms/dispatcher.js +300 -313
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +88 -189
- package/dist/transforms/extraction/objectExtraction.js +131 -215
- package/dist/transforms/finalizer.js +56 -59
- package/dist/transforms/flatten.js +275 -276
- package/dist/transforms/functionOutlining.js +230 -0
- package/dist/transforms/identifier/globalConcealing.js +214 -135
- package/dist/transforms/identifier/movedDeclarations.js +167 -91
- package/dist/transforms/identifier/renameVariables.js +239 -193
- package/dist/transforms/lock/integrity.js +61 -184
- package/dist/transforms/lock/lock.js +261 -387
- package/dist/transforms/minify.js +431 -436
- package/dist/transforms/opaquePredicates.js +65 -118
- package/dist/transforms/pack.js +160 -0
- package/dist/transforms/plugin.js +179 -0
- package/dist/transforms/preparation.js +261 -173
- package/dist/transforms/renameLabels.js +132 -56
- package/dist/transforms/rgf.js +140 -267
- package/dist/transforms/shuffle.js +52 -145
- package/dist/transforms/string/encoding.js +44 -175
- package/dist/transforms/string/stringCompression.js +79 -155
- package/dist/transforms/string/stringConcealing.js +189 -225
- package/dist/transforms/string/stringEncoding.js +32 -40
- package/dist/transforms/string/stringSplitting.js +54 -55
- package/dist/transforms/variableMasking.js +232 -0
- package/dist/utils/ControlObject.js +125 -0
- package/dist/utils/IntGen.js +46 -0
- package/dist/utils/NameGen.js +106 -0
- package/dist/utils/ast-utils.js +560 -0
- package/dist/utils/function-utils.js +56 -0
- package/dist/utils/gen-utils.js +48 -0
- package/dist/utils/node.js +77 -0
- package/dist/utils/object-utils.js +21 -0
- package/dist/utils/random-utils.js +91 -0
- package/dist/utils/static-utils.js +64 -0
- package/dist/validateOptions.js +122 -0
- package/index.d.ts +1 -17
- package/package.json +27 -22
- package/src/constants.ts +139 -82
- package/src/index.ts +70 -165
- package/src/obfuscationResult.ts +43 -0
- package/src/obfuscator.ts +328 -135
- package/src/options.ts +149 -658
- package/src/order.ts +14 -14
- package/src/presets.ts +39 -34
- package/src/probability.ts +21 -36
- package/src/templates/bufferToStringTemplate.ts +57 -0
- package/src/templates/deadCodeTemplates.ts +1185 -0
- package/src/templates/getGlobalTemplate.ts +72 -0
- package/src/templates/integrityTemplate.ts +69 -0
- package/src/templates/setFunctionLengthTemplate.ts +11 -0
- package/src/templates/stringCompressionTemplate.ts +42 -0
- package/src/templates/tamperProtectionTemplates.ts +116 -0
- package/src/templates/template.ts +149 -157
- package/src/transforms/astScrambler.ts +99 -0
- package/src/transforms/calculator.ts +96 -226
- package/src/transforms/controlFlowFlattening.ts +1594 -0
- package/src/transforms/deadCode.ts +85 -676
- package/src/transforms/dispatcher.ts +431 -640
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +147 -295
- package/src/transforms/extraction/objectExtraction.ts +160 -333
- package/src/transforms/finalizer.ts +63 -64
- package/src/transforms/flatten.ts +439 -557
- package/src/transforms/functionOutlining.ts +225 -0
- package/src/transforms/identifier/globalConcealing.ts +255 -266
- package/src/transforms/identifier/movedDeclarations.ts +228 -142
- package/src/transforms/identifier/renameVariables.ts +250 -271
- package/src/transforms/lock/integrity.ts +85 -263
- package/src/transforms/lock/lock.ts +338 -579
- package/src/transforms/minify.ts +523 -663
- package/src/transforms/opaquePredicates.ts +90 -229
- package/src/transforms/pack.ts +195 -0
- package/src/transforms/plugin.ts +185 -0
- package/src/transforms/preparation.ts +337 -231
- package/src/transforms/renameLabels.ts +176 -77
- package/src/transforms/rgf.ts +293 -424
- package/src/transforms/shuffle.ts +80 -254
- package/src/transforms/string/encoding.ts +20 -126
- package/src/transforms/string/stringCompression.ts +117 -307
- package/src/transforms/string/stringConcealing.ts +254 -342
- package/src/transforms/string/stringEncoding.ts +28 -47
- package/src/transforms/string/stringSplitting.ts +61 -75
- package/src/transforms/variableMasking.ts +257 -0
- package/src/utils/ControlObject.ts +141 -0
- package/src/utils/IntGen.ts +33 -0
- package/src/utils/NameGen.ts +106 -0
- package/src/utils/ast-utils.ts +667 -0
- package/src/utils/function-utils.ts +50 -0
- package/src/utils/gen-utils.ts +48 -0
- package/src/utils/node.ts +78 -0
- package/src/utils/object-utils.ts +21 -0
- package/src/utils/random-utils.ts +79 -0
- package/src/utils/static-utils.ts +66 -0
- package/src/validateOptions.ts +256 -0
- package/tsconfig.json +13 -8
- package/babel.config.js +0 -12
- package/dev.js +0 -8
- package/dist/compiler.js +0 -34
- package/dist/parser.js +0 -59
- package/dist/precedence.js +0 -66
- package/dist/templates/bufferToString.js +0 -129
- package/dist/templates/core.js +0 -35
- package/dist/templates/crash.js +0 -28
- package/dist/templates/es5.js +0 -137
- package/dist/templates/functionLength.js +0 -34
- package/dist/templates/globals.js +0 -9
- package/dist/transforms/antiTooling.js +0 -88
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +0 -1287
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +0 -131
- package/dist/transforms/es5/antiClass.js +0 -164
- package/dist/transforms/es5/antiDestructuring.js +0 -193
- package/dist/transforms/es5/antiES6Object.js +0 -185
- package/dist/transforms/es5/antiSpreadOperator.js +0 -35
- package/dist/transforms/es5/antiTemplate.js +0 -66
- package/dist/transforms/es5/es5.js +0 -123
- package/dist/transforms/extraction/classExtraction.js +0 -83
- package/dist/transforms/identifier/globalAnalysis.js +0 -83
- package/dist/transforms/identifier/variableAnalysis.js +0 -104
- package/dist/transforms/lock/antiDebug.js +0 -76
- package/dist/transforms/stack.js +0 -349
- package/dist/transforms/transform.js +0 -372
- package/dist/traverse.js +0 -110
- package/dist/util/compare.js +0 -145
- package/dist/util/gen.js +0 -564
- package/dist/util/guard.js +0 -14
- package/dist/util/identifiers.js +0 -355
- package/dist/util/insert.js +0 -362
- package/dist/util/math.js +0 -19
- package/dist/util/object.js +0 -40
- package/dist/util/random.js +0 -156
- package/dist/util/scope.js +0 -20
- package/docs/ControlFlowFlattening.md +0 -595
- package/docs/Countermeasures.md +0 -70
- package/docs/ES5.md +0 -197
- package/docs/Integrity.md +0 -82
- package/docs/RGF.md +0 -424
- package/docs/RenameVariables.md +0 -116
- package/docs/TamperProtection.md +0 -100
- package/docs/Template.md +0 -117
- package/samples/example.js +0 -15
- package/samples/high.js +0 -1
- package/samples/input.js +0 -3
- package/samples/javascriptobfuscator.com.js +0 -8
- package/samples/jscrambler_advanced.js +0 -1894
- package/samples/jscrambler_light.js +0 -1134
- package/samples/low.js +0 -1
- package/samples/medium.js +0 -1
- package/samples/obfuscator.io.js +0 -1686
- package/samples/preemptive.com.js +0 -16
- package/src/compiler.ts +0 -35
- package/src/parser.ts +0 -49
- package/src/precedence.ts +0 -61
- package/src/templates/bufferToString.ts +0 -136
- package/src/templates/core.ts +0 -29
- package/src/templates/crash.ts +0 -23
- package/src/templates/es5.ts +0 -131
- package/src/templates/functionLength.ts +0 -32
- package/src/templates/globals.ts +0 -3
- package/src/transforms/antiTooling.ts +0 -102
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +0 -2153
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +0 -179
- package/src/transforms/es5/antiClass.ts +0 -276
- package/src/transforms/es5/antiDestructuring.ts +0 -294
- package/src/transforms/es5/antiES6Object.ts +0 -267
- package/src/transforms/es5/antiSpreadOperator.ts +0 -56
- package/src/transforms/es5/antiTemplate.ts +0 -98
- package/src/transforms/es5/es5.ts +0 -149
- package/src/transforms/extraction/classExtraction.ts +0 -168
- package/src/transforms/identifier/globalAnalysis.ts +0 -102
- package/src/transforms/identifier/variableAnalysis.ts +0 -118
- package/src/transforms/lock/antiDebug.ts +0 -112
- package/src/transforms/stack.ts +0 -557
- package/src/transforms/transform.ts +0 -441
- package/src/traverse.ts +0 -120
- package/src/types.ts +0 -133
- package/src/util/compare.ts +0 -181
- package/src/util/gen.ts +0 -651
- package/src/util/guard.ts +0 -17
- package/src/util/identifiers.ts +0 -494
- package/src/util/insert.ts +0 -419
- package/src/util/math.ts +0 -15
- package/src/util/object.ts +0 -39
- package/src/util/random.ts +0 -221
- package/src/util/scope.ts +0 -21
- package/test/code/Cash.src.js +0 -1011
- package/test/code/Cash.test.ts +0 -132
- package/test/code/Dynamic.src.js +0 -118
- package/test/code/Dynamic.test.ts +0 -49
- package/test/code/ES6.src.js +0 -235
- package/test/code/ES6.test.ts +0 -42
- package/test/code/NewFeatures.test.ts +0 -19
- package/test/code/StrictMode.src.js +0 -65
- package/test/code/StrictMode.test.js +0 -37
- package/test/compare.test.ts +0 -104
- package/test/index.test.ts +0 -249
- package/test/options.test.ts +0 -150
- package/test/presets.test.ts +0 -22
- package/test/probability.test.ts +0 -44
- package/test/templates/template.test.ts +0 -224
- package/test/transforms/antiTooling.test.ts +0 -52
- package/test/transforms/calculator.test.ts +0 -78
- package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +0 -1274
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +0 -192
- package/test/transforms/deadCode.test.ts +0 -85
- package/test/transforms/dispatcher.test.ts +0 -457
- package/test/transforms/es5/antiClass.test.ts +0 -427
- package/test/transforms/es5/antiDestructuring.test.ts +0 -157
- package/test/transforms/es5/antiES6Object.test.ts +0 -245
- package/test/transforms/es5/antiTemplate.test.ts +0 -116
- package/test/transforms/es5/es5.test.ts +0 -110
- package/test/transforms/extraction/classExtraction.test.ts +0 -86
- package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +0 -200
- package/test/transforms/extraction/objectExtraction.test.ts +0 -491
- package/test/transforms/flatten.test.ts +0 -721
- package/test/transforms/hexadecimalNumbers.test.ts +0 -62
- package/test/transforms/identifier/globalConcealing.test.ts +0 -142
- package/test/transforms/identifier/movedDeclarations.test.ts +0 -275
- package/test/transforms/identifier/renameVariables.test.ts +0 -695
- package/test/transforms/lock/antiDebug.test.ts +0 -66
- package/test/transforms/lock/browserLock.test.ts +0 -129
- package/test/transforms/lock/countermeasures.test.ts +0 -100
- package/test/transforms/lock/integrity.test.ts +0 -161
- package/test/transforms/lock/lock.test.ts +0 -204
- package/test/transforms/lock/osLock.test.ts +0 -312
- package/test/transforms/lock/selfDefending.test.ts +0 -68
- package/test/transforms/lock/tamperProtection.test.ts +0 -336
- package/test/transforms/minify.test.ts +0 -575
- package/test/transforms/opaquePredicates.test.ts +0 -43
- package/test/transforms/preparation.test.ts +0 -157
- package/test/transforms/renameLabels.test.ts +0 -95
- package/test/transforms/rgf.test.ts +0 -378
- package/test/transforms/shuffle.test.ts +0 -135
- package/test/transforms/stack.test.ts +0 -573
- package/test/transforms/string/stringCompression.test.ts +0 -120
- package/test/transforms/string/stringConcealing.test.ts +0 -299
- package/test/transforms/string/stringEncoding.test.ts +0 -95
- package/test/transforms/string/stringSplitting.test.ts +0 -135
- package/test/transforms/transform.test.ts +0 -66
- package/test/traverse.test.ts +0 -139
- package/test/util/compare.test.ts +0 -34
- package/test/util/gen.test.ts +0 -121
- package/test/util/identifiers.test.ts +0 -253
- package/test/util/insert.test.ts +0 -142
- package/test/util/math.test.ts +0 -5
- package/test/util/random.test.ts +0 -71
- /package/dist/{types.js → obfuscationResult.js} +0 -0
package/src/constants.ts
CHANGED
|
@@ -1,72 +1,86 @@
|
|
|
1
|
+
import ControlObject from "./utils/ControlObject";
|
|
2
|
+
|
|
3
|
+
export const predictableFunctionTag = "__JS_PREDICT__";
|
|
4
|
+
|
|
1
5
|
/**
|
|
2
|
-
*
|
|
6
|
+
* A function is 'unsafe' if it requires 'eval', 'arguments' or 'this'
|
|
7
|
+
*
|
|
8
|
+
* Transformations will generally not touch unsafe functions.
|
|
3
9
|
*/
|
|
4
|
-
export const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
10
|
+
export const UNSAFE = Symbol("unsafe");
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* A function is 'predictable' if the invoking parameter lengths are guaranteed to be known.
|
|
14
|
+
*
|
|
15
|
+
* ```js
|
|
16
|
+
* a(1,2,3) // predictable
|
|
17
|
+
* a(...[1,2,3]) // unpredictable
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export const PREDICTABLE = Symbol("predictable");
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* A node is marked as 'skip' if it should not be transformed.
|
|
24
|
+
*
|
|
25
|
+
* Preserved throughout transformations, so be careful with this.
|
|
26
|
+
*/
|
|
27
|
+
export const SKIP = Symbol("skip");
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Saves the original length of a function.
|
|
31
|
+
*/
|
|
32
|
+
export const FN_LENGTH = Symbol("fnLength");
|
|
33
|
+
|
|
34
|
+
export const CONTROL_OBJECTS = Symbol("controlObjects");
|
|
35
|
+
|
|
36
|
+
export const NO_RENAME = Symbol("noRename");
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* This Identifier is used for a hexadecimal number or escaped string.
|
|
40
|
+
*/
|
|
41
|
+
export const GEN_NODE = Symbol("genNode");
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* This function is used to mark functions that when transformed will most likely cause a maximum call stack error.
|
|
45
|
+
*
|
|
46
|
+
* Examples: Native Function Check
|
|
47
|
+
*/
|
|
48
|
+
export const MULTI_TRANSFORM = Symbol("multiTransform");
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The function contains a `with` statement.
|
|
52
|
+
*
|
|
53
|
+
* OR
|
|
54
|
+
*
|
|
55
|
+
* This identifier is used for a `with` statement.
|
|
56
|
+
*
|
|
57
|
+
* Tells Pack not to globally transform the node.
|
|
58
|
+
*/
|
|
59
|
+
export const WITH_STATEMENT = Symbol("withStatement");
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Symbols describe precomputed semantics of a node, allowing the obfuscator to make the best choices for the node.
|
|
63
|
+
*/
|
|
64
|
+
export interface NodeSymbol {
|
|
65
|
+
[UNSAFE]?: boolean;
|
|
66
|
+
[PREDICTABLE]?: boolean;
|
|
67
|
+
[SKIP]?: boolean | number;
|
|
68
|
+
[FN_LENGTH]?: number;
|
|
69
|
+
[CONTROL_OBJECTS]?: ControlObject[];
|
|
70
|
+
[NO_RENAME]?: string | number;
|
|
71
|
+
|
|
72
|
+
[GEN_NODE]?: boolean;
|
|
73
|
+
[MULTI_TRANSFORM]?: boolean;
|
|
74
|
+
[WITH_STATEMENT]?: boolean;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Allows the user to grab the variable name of a renamed variable.
|
|
79
|
+
*/
|
|
80
|
+
export const variableFunctionName = "__JS_CONFUSER_VAR__";
|
|
81
|
+
|
|
82
|
+
export const noRenameVariablePrefix = "__NO_JS_CONFUSER_RENAME__";
|
|
83
|
+
export const placeholderVariablePrefix = "__p_";
|
|
70
84
|
|
|
71
85
|
/**
|
|
72
86
|
* Identifiers that are not actually variables.
|
|
@@ -80,22 +94,65 @@ export const reservedIdentifiers = new Set([
|
|
|
80
94
|
"arguments",
|
|
81
95
|
]);
|
|
82
96
|
|
|
83
|
-
export const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
97
|
+
export const reservedObjectPrototype = new Set([
|
|
98
|
+
"toString",
|
|
99
|
+
"valueOf",
|
|
100
|
+
"constructor",
|
|
101
|
+
"__proto__",
|
|
102
|
+
"hasOwnProperty",
|
|
103
|
+
"isPrototypeOf",
|
|
104
|
+
"propertyIsEnumerable",
|
|
105
|
+
"toLocaleString",
|
|
106
|
+
]);
|
|
91
107
|
|
|
92
108
|
/**
|
|
93
|
-
*
|
|
94
|
-
* - Example: string decryption function
|
|
109
|
+
* For Zero Width generator - Mangled variable names
|
|
95
110
|
*/
|
|
96
|
-
export const
|
|
111
|
+
export const reservedKeywords = [
|
|
112
|
+
"if",
|
|
113
|
+
"in",
|
|
114
|
+
"for",
|
|
115
|
+
"let",
|
|
116
|
+
"new",
|
|
117
|
+
"try",
|
|
118
|
+
"var",
|
|
119
|
+
"case",
|
|
120
|
+
"else",
|
|
121
|
+
"null",
|
|
122
|
+
"break",
|
|
123
|
+
"catch",
|
|
124
|
+
"class",
|
|
125
|
+
"const",
|
|
126
|
+
"super",
|
|
127
|
+
"throw",
|
|
128
|
+
"while",
|
|
129
|
+
"yield",
|
|
130
|
+
"delete",
|
|
131
|
+
"export",
|
|
132
|
+
"import",
|
|
133
|
+
"public",
|
|
134
|
+
"return",
|
|
135
|
+
"switch",
|
|
136
|
+
"default",
|
|
137
|
+
"finally",
|
|
138
|
+
"private",
|
|
139
|
+
"continue",
|
|
140
|
+
"debugger",
|
|
141
|
+
"function",
|
|
142
|
+
"arguments",
|
|
143
|
+
"protected",
|
|
144
|
+
"instanceof",
|
|
145
|
+
"await",
|
|
146
|
+
"async",
|
|
97
147
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
148
|
+
// new key words and other fun stuff :P
|
|
149
|
+
"NaN",
|
|
150
|
+
"undefined",
|
|
151
|
+
"true",
|
|
152
|
+
"false",
|
|
153
|
+
"typeof",
|
|
154
|
+
"this",
|
|
155
|
+
"static",
|
|
156
|
+
"void",
|
|
157
|
+
"of",
|
|
158
|
+
];
|
package/src/index.ts
CHANGED
|
@@ -1,198 +1,103 @@
|
|
|
1
|
-
import
|
|
2
|
-
import parseJS, { parseSync } from "./parser";
|
|
1
|
+
import * as babelTypes from "@babel/types";
|
|
3
2
|
import Obfuscator from "./obfuscator";
|
|
4
|
-
import
|
|
5
|
-
import Template from "./templates/template";
|
|
6
|
-
import { remove$Properties } from "./util/object";
|
|
7
|
-
import presets from "./presets";
|
|
8
|
-
|
|
9
|
-
import * as assert from "assert";
|
|
10
|
-
import { correctOptions, ObfuscateOptions, validateOptions } from "./options";
|
|
3
|
+
import { ObfuscateOptions } from "./options";
|
|
11
4
|
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
* @param code - The code to be obfuscated.
|
|
20
|
-
* @param options - An object of obfuscation options: `{preset: "medium", target: "browser"}`.
|
|
21
|
-
*/
|
|
22
|
-
export async function obfuscate(code: string, options: ObfuscateOptions) {
|
|
23
|
-
return await JsConfuser(code, options);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Obfuscates an [ESTree](https://github.com/estree/estree) compliant AST.
|
|
28
|
-
*
|
|
29
|
-
* **Note:** Mutates the object.
|
|
30
|
-
*
|
|
31
|
-
* @param AST - The [ESTree](https://github.com/estree/estree) compliant AST. This object will be mutated.
|
|
32
|
-
* @param options - The obfuscation options.
|
|
33
|
-
*
|
|
34
|
-
* [See all settings here](https://github.com/MichaelXF/js-confuser#options)
|
|
35
|
-
*/
|
|
36
|
-
export async function obfuscateAST(AST, options: ObfuscateOptions) {
|
|
37
|
-
assert.ok(typeof AST === "object", "AST must be type object");
|
|
38
|
-
assert.ok(AST.type == "Program", "AST.type must be equal to 'Program'");
|
|
39
|
-
validateOptions(options);
|
|
40
|
-
|
|
41
|
-
options = await correctOptions(options);
|
|
42
|
-
|
|
43
|
-
var obfuscator = new Obfuscator(options as any);
|
|
44
|
-
|
|
45
|
-
await obfuscator.apply(AST);
|
|
5
|
+
ObfuscationResult,
|
|
6
|
+
ProfileData,
|
|
7
|
+
ProfilerCallback,
|
|
8
|
+
ProfilerLog,
|
|
9
|
+
} from "./obfuscationResult";
|
|
10
|
+
import presets from "./presets";
|
|
11
|
+
import Template from "./templates/template";
|
|
46
12
|
|
|
47
|
-
|
|
13
|
+
export async function obfuscate(
|
|
14
|
+
sourceCode: string,
|
|
15
|
+
options: ObfuscateOptions
|
|
16
|
+
): Promise<ObfuscationResult> {
|
|
17
|
+
const obfuscator = new Obfuscator(options);
|
|
48
18
|
|
|
49
|
-
|
|
19
|
+
return obfuscator.obfuscate(sourceCode);
|
|
50
20
|
}
|
|
51
21
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
* @param code - The code to be obfuscated.
|
|
55
|
-
* @param options - An object of obfuscation options: `{preset: "medium", target: "browser"}`.
|
|
56
|
-
*/
|
|
57
|
-
var JsConfuser: IJsConfuser = async function (
|
|
58
|
-
code: string,
|
|
22
|
+
export async function obfuscateAST(
|
|
23
|
+
ast: babelTypes.File,
|
|
59
24
|
options: ObfuscateOptions
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
throw new TypeError("code must be type string");
|
|
63
|
-
}
|
|
64
|
-
validateOptions(options);
|
|
65
|
-
|
|
66
|
-
options = await correctOptions(options);
|
|
67
|
-
|
|
68
|
-
options.verbose && console.log("* Parsing source code");
|
|
69
|
-
|
|
70
|
-
var tree = await parseJS(code);
|
|
71
|
-
|
|
72
|
-
options.verbose && console.log("* Obfuscating...");
|
|
73
|
-
|
|
74
|
-
var obfuscator = new Obfuscator(options as any);
|
|
75
|
-
|
|
76
|
-
await obfuscator.apply(tree);
|
|
77
|
-
|
|
78
|
-
options.verbose && console.log("* Removing $ properties");
|
|
79
|
-
|
|
80
|
-
remove$Properties(tree);
|
|
81
|
-
|
|
82
|
-
options.verbose && console.log("* Generating code");
|
|
83
|
-
|
|
84
|
-
var result = await compileJs(tree, options);
|
|
85
|
-
|
|
86
|
-
return result;
|
|
87
|
-
} as any;
|
|
88
|
-
|
|
89
|
-
export const debugTransformations: IJsConfuserDebugTransformations =
|
|
90
|
-
async function (
|
|
91
|
-
code: string,
|
|
92
|
-
options: ObfuscateOptions
|
|
93
|
-
): Promise<{ name: string; code: string; ms: number }[]> {
|
|
94
|
-
validateOptions(options);
|
|
95
|
-
options = await correctOptions(options);
|
|
96
|
-
|
|
97
|
-
var frames = [];
|
|
98
|
-
|
|
99
|
-
var tree = parseSync(code);
|
|
100
|
-
var obfuscator = new Obfuscator(options as any);
|
|
101
|
-
|
|
102
|
-
var time = Date.now();
|
|
103
|
-
|
|
104
|
-
obfuscator.on("debug", (name: string, tree: Node) => {
|
|
105
|
-
frames.push({
|
|
106
|
-
name: name,
|
|
107
|
-
code: compileJsSync(tree, options),
|
|
108
|
-
ms: Date.now() - time,
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
time = Date.now();
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
await obfuscator.apply(tree, true);
|
|
25
|
+
) {
|
|
26
|
+
const obfuscator = new Obfuscator(options);
|
|
115
27
|
|
|
116
|
-
|
|
117
|
-
|
|
28
|
+
return obfuscator.obfuscateAST(ast);
|
|
29
|
+
}
|
|
118
30
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
* about the obfuscation.
|
|
122
|
-
*
|
|
123
|
-
* @param code - Source code to obfuscate
|
|
124
|
-
* @param options - Options
|
|
125
|
-
* @param callback - Progress callback, called after each transformation
|
|
126
|
-
* @returns
|
|
127
|
-
*/
|
|
128
|
-
export const debugObfuscation: IJsConfuserDebugObfuscation = async function (
|
|
129
|
-
code: string,
|
|
31
|
+
export async function obfuscateWithProfiler(
|
|
32
|
+
sourceCode: string,
|
|
130
33
|
options: ObfuscateOptions,
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
)
|
|
34
|
+
profiler: {
|
|
35
|
+
callback: ProfilerCallback;
|
|
36
|
+
performance: { now(): number };
|
|
37
|
+
}
|
|
38
|
+
): Promise<ObfuscationResult & { profileData: ProfileData }> {
|
|
134
39
|
const startTime = performance.now();
|
|
135
40
|
|
|
136
|
-
|
|
137
|
-
|
|
41
|
+
const obfuscator = new Obfuscator(options);
|
|
42
|
+
let totalTransforms = obfuscator.plugins.length;
|
|
43
|
+
|
|
44
|
+
let transformMap: ProfileData["transforms"] = Object.create(null);
|
|
138
45
|
|
|
139
46
|
const beforeParseTime = performance.now();
|
|
140
47
|
|
|
141
|
-
|
|
48
|
+
let ast = Obfuscator.parseCode(sourceCode);
|
|
142
49
|
|
|
143
50
|
const parseTime = performance.now() - beforeParseTime;
|
|
144
51
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
52
|
+
let currentTransformTime = performance.now();
|
|
53
|
+
|
|
54
|
+
ast = obfuscator.obfuscateAST(ast, {
|
|
55
|
+
profiler: (log: ProfilerLog) => {
|
|
56
|
+
var nowTime = performance.now();
|
|
57
|
+
transformMap[log.currentTransform] = {
|
|
58
|
+
transformTime: nowTime - currentTransformTime,
|
|
59
|
+
changeData: {},
|
|
60
|
+
};
|
|
61
|
+
currentTransformTime = nowTime;
|
|
62
|
+
profiler.callback(log);
|
|
63
|
+
},
|
|
157
64
|
});
|
|
158
65
|
|
|
159
|
-
|
|
66
|
+
obfuscator.plugins.forEach(({ pluginInstance }) => {
|
|
67
|
+
if (transformMap[pluginInstance.name]) {
|
|
68
|
+
transformMap[pluginInstance.name].changeData = pluginInstance.changeData;
|
|
69
|
+
}
|
|
70
|
+
});
|
|
160
71
|
|
|
161
72
|
const beforeCompileTime = performance.now();
|
|
162
73
|
|
|
163
|
-
|
|
74
|
+
const code = Obfuscator.generateCode(ast, obfuscator.options);
|
|
164
75
|
|
|
165
76
|
const compileTime = performance.now() - beforeCompileTime;
|
|
166
77
|
|
|
167
78
|
const endTime = performance.now();
|
|
168
79
|
|
|
80
|
+
const obfuscationTime = endTime - startTime;
|
|
81
|
+
|
|
169
82
|
return {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
83
|
+
code: code,
|
|
84
|
+
profileData: {
|
|
85
|
+
transforms: transformMap,
|
|
86
|
+
obfuscationTime: obfuscationTime,
|
|
87
|
+
parseTime: parseTime,
|
|
88
|
+
compileTime: compileTime,
|
|
89
|
+
totalTransforms: totalTransforms,
|
|
90
|
+
totalPossibleTransforms: obfuscator.totalPossibleTransforms,
|
|
91
|
+
},
|
|
177
92
|
};
|
|
178
|
-
};
|
|
179
|
-
|
|
180
|
-
JsConfuser.obfuscate = obfuscate;
|
|
181
|
-
JsConfuser.obfuscateAST = obfuscateAST;
|
|
182
|
-
JsConfuser.presets = presets;
|
|
183
|
-
JsConfuser.debugTransformations = debugTransformations;
|
|
184
|
-
JsConfuser.debugObfuscation = debugObfuscation;
|
|
185
|
-
JsConfuser.Obfuscator = Obfuscator;
|
|
186
|
-
JsConfuser.Transform = Transform;
|
|
187
|
-
JsConfuser.Template = Template;
|
|
188
|
-
|
|
189
|
-
if (typeof window !== "undefined") {
|
|
190
|
-
window["JsConfuser"] = JsConfuser;
|
|
191
|
-
}
|
|
192
|
-
if (typeof global !== "undefined") {
|
|
193
|
-
global["JsConfuser"] = JsConfuser;
|
|
194
93
|
}
|
|
195
94
|
|
|
196
|
-
|
|
95
|
+
const JsConfuser = {
|
|
96
|
+
obfuscate,
|
|
97
|
+
obfuscateAST,
|
|
98
|
+
obfuscateWithProfiler,
|
|
99
|
+
presets,
|
|
100
|
+
Template,
|
|
101
|
+
};
|
|
197
102
|
|
|
198
|
-
export
|
|
103
|
+
export default JsConfuser;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { PluginInstance } from "./transforms/plugin";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Obfuscation result object.
|
|
5
|
+
*/
|
|
6
|
+
export interface ObfuscationResult {
|
|
7
|
+
/**
|
|
8
|
+
* Obfuscated code.
|
|
9
|
+
*/
|
|
10
|
+
code: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Profile report for the obfuscation process.
|
|
15
|
+
*/
|
|
16
|
+
export interface ProfileData {
|
|
17
|
+
obfuscationTime: number;
|
|
18
|
+
compileTime: number;
|
|
19
|
+
parseTime: number;
|
|
20
|
+
totalPossibleTransforms: number;
|
|
21
|
+
totalTransforms: number;
|
|
22
|
+
transforms: {
|
|
23
|
+
[transformName: string]: {
|
|
24
|
+
transformTime: number;
|
|
25
|
+
changeData: PluginInstance["changeData"];
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* A callback function that is called when a transform is applied.
|
|
32
|
+
*/
|
|
33
|
+
export type ProfilerCallback = (log: ProfilerLog) => void;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The current progress of the obfuscation process.
|
|
37
|
+
*/
|
|
38
|
+
export interface ProfilerLog {
|
|
39
|
+
index: number;
|
|
40
|
+
currentTransform: string;
|
|
41
|
+
nextTransform: string;
|
|
42
|
+
totalTransforms: number;
|
|
43
|
+
}
|