js-confuser 1.7.2 → 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/.github/workflows/node.js.yml +1 -1
- package/CHANGELOG.md +105 -0
- package/Migration.md +57 -0
- package/README.md +23 -913
- package/dist/constants.js +69 -13
- package/dist/index.js +108 -152
- package/dist/obfuscator.js +316 -118
- package/dist/options.js +1 -109
- 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 +213 -93
- 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 -577
- package/dist/transforms/dispatcher.js +300 -309
- 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 +217 -103
- package/dist/transforms/identifier/movedDeclarations.js +167 -91
- package/dist/transforms/identifier/renameVariables.js +240 -187
- package/dist/transforms/lock/integrity.js +61 -184
- package/dist/transforms/lock/lock.js +263 -303
- 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 +263 -163
- package/dist/transforms/renameLabels.js +132 -56
- package/dist/transforms/rgf.js +142 -240
- package/dist/transforms/shuffle.js +52 -145
- package/dist/transforms/string/encoding.js +45 -173
- package/dist/transforms/string/stringCompression.js +81 -126
- package/dist/transforms/string/stringConcealing.js +189 -224
- 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 -77
- package/src/index.ts +70 -163
- package/src/obfuscationResult.ts +43 -0
- package/src/obfuscator.ts +328 -135
- package/src/options.ts +154 -623
- package/src/order.ts +14 -14
- package/src/presets.ts +39 -34
- package/src/probability.ts +21 -36
- package/src/templates/{bufferToString.ts → bufferToStringTemplate.ts} +5 -54
- 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 +183 -92
- package/src/transforms/astScrambler.ts +99 -0
- package/src/transforms/calculator.ts +96 -224
- package/src/transforms/controlFlowFlattening.ts +1594 -0
- package/src/transforms/deadCode.ts +85 -628
- package/src/transforms/dispatcher.ts +431 -636
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +147 -299
- 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 +261 -189
- package/src/transforms/identifier/movedDeclarations.ts +228 -142
- package/src/transforms/identifier/renameVariables.ts +252 -258
- package/src/transforms/lock/integrity.ts +84 -260
- package/src/transforms/lock/lock.ts +342 -491
- 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 -215
- package/src/transforms/renameLabels.ts +176 -77
- package/src/transforms/rgf.ts +293 -386
- package/src/transforms/shuffle.ts +80 -254
- package/src/transforms/string/encoding.ts +26 -129
- package/src/transforms/string/stringCompression.ts +118 -236
- package/src/transforms/string/stringConcealing.ts +255 -339
- 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 -108
- package/dist/templates/crash.js +0 -59
- 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 -1281
- 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 -70
- package/dist/transforms/identifier/variableAnalysis.js +0 -104
- package/dist/transforms/lock/antiDebug.js +0 -76
- package/dist/transforms/stack.js +0 -343
- package/dist/transforms/transform.js +0 -350
- 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 -9
- 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 -130
- package/dist/util/scope.js +0 -20
- package/docs/ControlFlowFlattening.md +0 -595
- package/docs/Countermeasures.md +0 -63
- package/docs/ES5.md +0 -197
- package/docs/Integrity.md +0 -75
- package/docs/RGF.md +0 -419
- 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/crash.ts +0 -55
- 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 -2146
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +0 -179
- package/src/transforms/es5/antiClass.ts +0 -272
- 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 -85
- package/src/transforms/identifier/variableAnalysis.ts +0 -118
- package/src/transforms/lock/antiDebug.ts +0 -112
- package/src/transforms/stack.ts +0 -551
- package/src/transforms/transform.ts +0 -453
- package/src/traverse.ts +0 -120
- package/src/types.ts +0 -131
- package/src/util/compare.ts +0 -181
- package/src/util/gen.ts +0 -651
- package/src/util/guard.ts +0 -7
- 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 -141
- package/src/util/scope.ts +0 -21
- package/test/code/Cash.src.js +0 -1011
- package/test/code/Cash.test.ts +0 -49
- 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 -132
- package/test/presets.test.ts +0 -22
- package/test/probability.test.ts +0 -44
- package/test/templates/template.test.ts +0 -14
- 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 -72
- package/test/transforms/identifier/movedDeclarations.test.ts +0 -275
- package/test/transforms/identifier/renameVariables.test.ts +0 -621
- 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/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
|
@@ -1,721 +0,0 @@
|
|
|
1
|
-
import JsConfuser from "../../src/index";
|
|
2
|
-
|
|
3
|
-
test("Variant #1: Function Declaration", async () => {
|
|
4
|
-
var output = await JsConfuser.obfuscate(
|
|
5
|
-
`
|
|
6
|
-
function myFunction(){
|
|
7
|
-
return 10;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
TEST_OUTPUT = myFunction();
|
|
11
|
-
`,
|
|
12
|
-
{
|
|
13
|
-
target: "node",
|
|
14
|
-
flatten: true,
|
|
15
|
-
}
|
|
16
|
-
);
|
|
17
|
-
|
|
18
|
-
expect(output).toContain("_flat_myFunction");
|
|
19
|
-
|
|
20
|
-
var TEST_OUTPUT;
|
|
21
|
-
eval(output);
|
|
22
|
-
|
|
23
|
-
expect(TEST_OUTPUT).toStrictEqual(10);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
test("Variant #2: Function Expression", async () => {
|
|
27
|
-
var output = await JsConfuser.obfuscate(
|
|
28
|
-
`
|
|
29
|
-
var outsideVar = "Correct Value";
|
|
30
|
-
|
|
31
|
-
var myFunction = function(){
|
|
32
|
-
return outsideVar;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
TEST_OUTPUT = myFunction();
|
|
36
|
-
`,
|
|
37
|
-
{
|
|
38
|
-
target: "node",
|
|
39
|
-
flatten: true,
|
|
40
|
-
}
|
|
41
|
-
);
|
|
42
|
-
|
|
43
|
-
expect(output).toContain("_flat_myFunction");
|
|
44
|
-
|
|
45
|
-
var TEST_OUTPUT;
|
|
46
|
-
eval(output);
|
|
47
|
-
|
|
48
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
test("Variant #3: Simple parameters", async () => {
|
|
52
|
-
var output = await JsConfuser.obfuscate(
|
|
53
|
-
`
|
|
54
|
-
function myFunction(x, y){
|
|
55
|
-
TEST_OUTPUT = x + y;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
myFunction(10, 15);
|
|
59
|
-
`,
|
|
60
|
-
{
|
|
61
|
-
target: "node",
|
|
62
|
-
flatten: true,
|
|
63
|
-
}
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
expect(output).toContain("_flat_myFunction");
|
|
67
|
-
|
|
68
|
-
var TEST_OUTPUT;
|
|
69
|
-
|
|
70
|
-
eval(output);
|
|
71
|
-
expect(TEST_OUTPUT).toStrictEqual(25);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
test("Variant #4: Simple parameters nested", async () => {
|
|
75
|
-
var output = await JsConfuser.obfuscate(
|
|
76
|
-
`
|
|
77
|
-
function TEST_FUNCTION(x){
|
|
78
|
-
function TEST_NESTED_FUNCTION(y){
|
|
79
|
-
input(y);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
TEST_NESTED_FUNCTION(x)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
TEST_FUNCTION(10);
|
|
86
|
-
`,
|
|
87
|
-
{
|
|
88
|
-
target: "node",
|
|
89
|
-
flatten: true,
|
|
90
|
-
}
|
|
91
|
-
);
|
|
92
|
-
|
|
93
|
-
var value = "never_called",
|
|
94
|
-
input = (x) => (value = x);
|
|
95
|
-
|
|
96
|
-
eval(output);
|
|
97
|
-
expect(value).toStrictEqual(10);
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
test("Variant #5: Correct return values when nested", async () => {
|
|
101
|
-
var output = await JsConfuser.obfuscate(
|
|
102
|
-
`
|
|
103
|
-
function TEST_FUNCTION(){
|
|
104
|
-
function TEST_NESTED_FUNCTION(){
|
|
105
|
-
return 10;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
return TEST_NESTED_FUNCTION()
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
input(TEST_FUNCTION());
|
|
112
|
-
`,
|
|
113
|
-
{
|
|
114
|
-
target: "node",
|
|
115
|
-
flatten: true,
|
|
116
|
-
}
|
|
117
|
-
);
|
|
118
|
-
|
|
119
|
-
var value = "never_called",
|
|
120
|
-
input = (x) => (value = x);
|
|
121
|
-
|
|
122
|
-
eval(output);
|
|
123
|
-
expect(value).toStrictEqual(10);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
test("Variant #6: Correct values when deeply nested", async () => {
|
|
127
|
-
var output = await JsConfuser.obfuscate(
|
|
128
|
-
`
|
|
129
|
-
function TEST_FUNCTION(x, y){
|
|
130
|
-
function TEST_NESTED_FUNCTION(){
|
|
131
|
-
|
|
132
|
-
function TEST_INNER_FUNCTION(a,b){
|
|
133
|
-
return a + b;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return TEST_INNER_FUNCTION(x,y);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
return TEST_NESTED_FUNCTION()
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
input(TEST_FUNCTION(10, 5));
|
|
143
|
-
`,
|
|
144
|
-
{
|
|
145
|
-
target: "node",
|
|
146
|
-
flatten: true,
|
|
147
|
-
}
|
|
148
|
-
);
|
|
149
|
-
|
|
150
|
-
var value = "never_called",
|
|
151
|
-
input = (x) => (value = x);
|
|
152
|
-
|
|
153
|
-
eval(output);
|
|
154
|
-
expect(value).toStrictEqual(15);
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
test("Variant #7: Correct values when modifying local variables", async () => {
|
|
158
|
-
var output = await JsConfuser.obfuscate(
|
|
159
|
-
`
|
|
160
|
-
function TEST_FUNCTION(x, y){
|
|
161
|
-
var A = 0;
|
|
162
|
-
function TEST_NESTED_FUNCTION(){
|
|
163
|
-
A++;
|
|
164
|
-
A = A + 1;
|
|
165
|
-
|
|
166
|
-
function TEST_INNER_FUNCTION(a,b){
|
|
167
|
-
return a + b;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
return TEST_INNER_FUNCTION(x,y);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
return TEST_NESTED_FUNCTION() + A;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
input(TEST_FUNCTION(10, 5));
|
|
177
|
-
`,
|
|
178
|
-
{
|
|
179
|
-
target: "node",
|
|
180
|
-
flatten: true,
|
|
181
|
-
}
|
|
182
|
-
);
|
|
183
|
-
|
|
184
|
-
var value = "never_called",
|
|
185
|
-
input = (x) => (value = x);
|
|
186
|
-
|
|
187
|
-
eval(output);
|
|
188
|
-
expect(value).toStrictEqual(17);
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
test("Variant #8: Work with dispatcher", async () => {
|
|
192
|
-
var output = await JsConfuser.obfuscate(
|
|
193
|
-
`
|
|
194
|
-
function container(x){
|
|
195
|
-
function nested(x){
|
|
196
|
-
return x * 10;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
return nested(x);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
input(container(10))
|
|
203
|
-
`,
|
|
204
|
-
{
|
|
205
|
-
target: "node",
|
|
206
|
-
flatten: true,
|
|
207
|
-
dispatcher: true,
|
|
208
|
-
}
|
|
209
|
-
);
|
|
210
|
-
|
|
211
|
-
var value = "never_called";
|
|
212
|
-
function input(x) {
|
|
213
|
-
value = x;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
eval(output);
|
|
217
|
-
expect(value).toStrictEqual(100);
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
// https://github.com/MichaelXF/js-confuser/issues/25
|
|
221
|
-
test("Variant #9: Work with pattern-based assignment expressions", async () => {
|
|
222
|
-
var output = await JsConfuser.obfuscate(
|
|
223
|
-
`
|
|
224
|
-
var i = 0;
|
|
225
|
-
|
|
226
|
-
function change() {
|
|
227
|
-
[([i] = [1])];
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
change();
|
|
231
|
-
input(i);
|
|
232
|
-
`,
|
|
233
|
-
{
|
|
234
|
-
target: "node",
|
|
235
|
-
flatten: true,
|
|
236
|
-
}
|
|
237
|
-
);
|
|
238
|
-
|
|
239
|
-
// Ensure flatten was applied
|
|
240
|
-
expect(output).toContain("_flat_");
|
|
241
|
-
|
|
242
|
-
var value = "never_called",
|
|
243
|
-
input = (x) => (value = x);
|
|
244
|
-
|
|
245
|
-
eval(output);
|
|
246
|
-
expect(value).toStrictEqual(1);
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
test("Variant #10: Async function", async () => {
|
|
250
|
-
var output = await JsConfuser.obfuscate(
|
|
251
|
-
`
|
|
252
|
-
async function timeout(ms){
|
|
253
|
-
return await new Promise((resolve, reject)=>{
|
|
254
|
-
setTimeout(()=>{
|
|
255
|
-
resolve();
|
|
256
|
-
}, ms);
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
(async ()=>{
|
|
261
|
-
var startTime = Date.now();
|
|
262
|
-
|
|
263
|
-
await timeout(1000);
|
|
264
|
-
|
|
265
|
-
var endTime = Date.now();
|
|
266
|
-
|
|
267
|
-
var duration = endTime - startTime;
|
|
268
|
-
|
|
269
|
-
TEST_CALLBACK(duration);
|
|
270
|
-
})();
|
|
271
|
-
`,
|
|
272
|
-
{
|
|
273
|
-
target: "node",
|
|
274
|
-
flatten: true,
|
|
275
|
-
}
|
|
276
|
-
);
|
|
277
|
-
|
|
278
|
-
expect(output).toContain("_flat_timeout");
|
|
279
|
-
|
|
280
|
-
var wasCalled = false;
|
|
281
|
-
var TEST_CALLBACK = (time) => {
|
|
282
|
-
expect(time).toBeGreaterThan(500);
|
|
283
|
-
wasCalled = true;
|
|
284
|
-
};
|
|
285
|
-
|
|
286
|
-
eval(output);
|
|
287
|
-
|
|
288
|
-
setTimeout(() => {
|
|
289
|
-
expect(wasCalled).toStrictEqual(true);
|
|
290
|
-
}, 2000);
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
test("Variant #11: Work with properties", async () => {
|
|
294
|
-
var output = await JsConfuser.obfuscate(
|
|
295
|
-
`
|
|
296
|
-
var outsideVar = "Incorrect Value";
|
|
297
|
-
|
|
298
|
-
var myObject = {
|
|
299
|
-
myInitProperty: function(){
|
|
300
|
-
return outsideVar;
|
|
301
|
-
},
|
|
302
|
-
|
|
303
|
-
myMethodProperty(){
|
|
304
|
-
return;
|
|
305
|
-
},
|
|
306
|
-
|
|
307
|
-
get myGetProperty(){
|
|
308
|
-
return;
|
|
309
|
-
},
|
|
310
|
-
|
|
311
|
-
set mySetProperty(val){
|
|
312
|
-
outsideVar = val;
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
myObject.mySetProperty = "Correct Value";
|
|
317
|
-
TEST_OUTPUT = myObject.myInitProperty();
|
|
318
|
-
`,
|
|
319
|
-
{
|
|
320
|
-
target: "node",
|
|
321
|
-
flatten: true,
|
|
322
|
-
}
|
|
323
|
-
);
|
|
324
|
-
|
|
325
|
-
// Ensure flatten applied
|
|
326
|
-
expect(output).toContain("_flat_");
|
|
327
|
-
|
|
328
|
-
var TEST_OUTPUT;
|
|
329
|
-
eval(output);
|
|
330
|
-
|
|
331
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
332
|
-
});
|
|
333
|
-
|
|
334
|
-
test("Variant #12: Work with RGF enabled", async () => {
|
|
335
|
-
var output = await JsConfuser.obfuscate(
|
|
336
|
-
`
|
|
337
|
-
var outsideVar = "Correct Value";
|
|
338
|
-
|
|
339
|
-
function myFunction(){
|
|
340
|
-
return outsideVar;
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
TEST_OUTPUT = myFunction();
|
|
344
|
-
`,
|
|
345
|
-
{
|
|
346
|
-
target: "node",
|
|
347
|
-
flatten: true,
|
|
348
|
-
rgf: true,
|
|
349
|
-
}
|
|
350
|
-
);
|
|
351
|
-
|
|
352
|
-
// Ensure flatten applied
|
|
353
|
-
expect(output).toContain("_flat_myFunction");
|
|
354
|
-
|
|
355
|
-
// Ensure RGF applied
|
|
356
|
-
expect(output).toContain("new Function");
|
|
357
|
-
|
|
358
|
-
var TEST_OUTPUT;
|
|
359
|
-
eval(output);
|
|
360
|
-
|
|
361
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
362
|
-
});
|
|
363
|
-
|
|
364
|
-
test("Variant #13: Work with assignment expression in the return statement", async () => {
|
|
365
|
-
var output = await JsConfuser(
|
|
366
|
-
`
|
|
367
|
-
var outside;
|
|
368
|
-
|
|
369
|
-
function myFunction(){
|
|
370
|
-
return outside = "Correct Value"
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
myFunction(outside);
|
|
374
|
-
|
|
375
|
-
TEST_OUTPUT = outside;
|
|
376
|
-
|
|
377
|
-
`,
|
|
378
|
-
{ target: "node", flatten: true }
|
|
379
|
-
);
|
|
380
|
-
|
|
381
|
-
// Ensure flat was applied
|
|
382
|
-
expect(output).toContain("_flat_myFunction");
|
|
383
|
-
|
|
384
|
-
var TEST_OUTPUT;
|
|
385
|
-
eval(output);
|
|
386
|
-
|
|
387
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
388
|
-
});
|
|
389
|
-
|
|
390
|
-
test("Variant #14: Work with 'use strict' directive", async () => {
|
|
391
|
-
var output = await JsConfuser(
|
|
392
|
-
`
|
|
393
|
-
function myFunction(){
|
|
394
|
-
"use strict";
|
|
395
|
-
|
|
396
|
-
return "Correct Value";
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
TEST_OUTPUT = myFunction();
|
|
400
|
-
`,
|
|
401
|
-
{ target: "node", flatten: true }
|
|
402
|
-
);
|
|
403
|
-
|
|
404
|
-
// Ensure flat was applied
|
|
405
|
-
expect(output).toContain("_flat_myFunction");
|
|
406
|
-
|
|
407
|
-
var TEST_OUTPUT;
|
|
408
|
-
eval(output);
|
|
409
|
-
|
|
410
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
411
|
-
});
|
|
412
|
-
|
|
413
|
-
// https://github.com/MichaelXF/js-confuser/issues/89
|
|
414
|
-
test("Variant #15: Work with functions with invalid identifier names", async () => {
|
|
415
|
-
var output = await JsConfuser(
|
|
416
|
-
`
|
|
417
|
-
// Input
|
|
418
|
-
var object = {
|
|
419
|
-
"my-function": function () {
|
|
420
|
-
TEST_OUTPUT = "Success";
|
|
421
|
-
},
|
|
422
|
-
};
|
|
423
|
-
|
|
424
|
-
object["my-function"](); // "Success"
|
|
425
|
-
`,
|
|
426
|
-
{ target: "node", flatten: true }
|
|
427
|
-
);
|
|
428
|
-
|
|
429
|
-
var TEST_OUTPUT;
|
|
430
|
-
eval(output);
|
|
431
|
-
|
|
432
|
-
expect(TEST_OUTPUT).toStrictEqual("Success");
|
|
433
|
-
});
|
|
434
|
-
|
|
435
|
-
test("Variant #16: Multiple test", async () => {
|
|
436
|
-
var output = await JsConfuser(
|
|
437
|
-
`
|
|
438
|
-
"use strict";
|
|
439
|
-
|
|
440
|
-
function assertLegalInvocation(){
|
|
441
|
-
if(this !== undefined) throw new Error("Illegal Invocation");
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
(function (){
|
|
445
|
-
var requiredValue = {};
|
|
446
|
-
var value;
|
|
447
|
-
var counter = 0;
|
|
448
|
-
|
|
449
|
-
function getCorrectValueObject(requiredParameter){
|
|
450
|
-
function nestedFunction(){
|
|
451
|
-
var requiredCounterValue = 1;
|
|
452
|
-
if(requiredParameter === requiredValue) {
|
|
453
|
-
if(counter === requiredCounterValue) {
|
|
454
|
-
return {value: "Correct Value"};
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
return {value: "Incorrect Value"};
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
return nestedFunction();
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
function setValue(){
|
|
465
|
-
// Test update-expression
|
|
466
|
-
counter++;
|
|
467
|
-
|
|
468
|
-
// Test call-expression
|
|
469
|
-
assertLegalInvocation();
|
|
470
|
-
|
|
471
|
-
function nestedSetValue(){
|
|
472
|
-
// Test destructuring
|
|
473
|
-
({value} = getCorrectValueObject(requiredValue));
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
nestedSetValue()
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
function myFunction(myParameter1, myParameter2, myParameter3){
|
|
480
|
-
setValue();
|
|
481
|
-
|
|
482
|
-
myParameter1 = TEST_OUTPUT = value;
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
myFunction();
|
|
486
|
-
})();
|
|
487
|
-
`,
|
|
488
|
-
{ target: "node", flatten: true }
|
|
489
|
-
);
|
|
490
|
-
|
|
491
|
-
expect(output).toContain("_flat_getCorrectValue");
|
|
492
|
-
expect(output).toContain("_flat_setValue");
|
|
493
|
-
expect(output).toContain("_flat_myFunction");
|
|
494
|
-
|
|
495
|
-
var TEST_OUTPUT;
|
|
496
|
-
eval(output);
|
|
497
|
-
|
|
498
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
499
|
-
});
|
|
500
|
-
|
|
501
|
-
test("Variant #17: Don't apply to generator functions", async () => {
|
|
502
|
-
var output = await JsConfuser(
|
|
503
|
-
`
|
|
504
|
-
function* myGeneratorFunction(){
|
|
505
|
-
yield "Correct Value";
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
TEST_OUTPUT = (myGeneratorFunction()).next().value;
|
|
509
|
-
`,
|
|
510
|
-
{ target: "node", flatten: true }
|
|
511
|
-
);
|
|
512
|
-
|
|
513
|
-
expect(output).not.toContain("_flat_myGeneratorFunction");
|
|
514
|
-
|
|
515
|
-
var TEST_OUTPUT;
|
|
516
|
-
eval(output);
|
|
517
|
-
|
|
518
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
519
|
-
});
|
|
520
|
-
|
|
521
|
-
test("Variant #18: Redefined variable in nested scope", async () => {
|
|
522
|
-
var output = await JsConfuser(
|
|
523
|
-
`
|
|
524
|
-
(function (){
|
|
525
|
-
var outsideVar = "Incorrect Value 1";
|
|
526
|
-
function myFunction1(){
|
|
527
|
-
(()=>{
|
|
528
|
-
var outsideVar = "Correct Value 1";
|
|
529
|
-
TEST_OUTPUT_1 = outsideVar;
|
|
530
|
-
})();
|
|
531
|
-
};
|
|
532
|
-
|
|
533
|
-
myFunction1();
|
|
534
|
-
|
|
535
|
-
outsideVar = "Correct Value 2";
|
|
536
|
-
|
|
537
|
-
function myFunction2(){
|
|
538
|
-
(()=>{
|
|
539
|
-
var outsideVar = "Incorrect Value 2";
|
|
540
|
-
})();
|
|
541
|
-
TEST_OUTPUT_2 = outsideVar;
|
|
542
|
-
};
|
|
543
|
-
|
|
544
|
-
myFunction2();
|
|
545
|
-
})();
|
|
546
|
-
`,
|
|
547
|
-
{
|
|
548
|
-
target: "node",
|
|
549
|
-
flatten: true,
|
|
550
|
-
renameVariables: (x) => !x.includes("_flat_"),
|
|
551
|
-
}
|
|
552
|
-
);
|
|
553
|
-
|
|
554
|
-
expect(output).toContain("_flat_myFunction1");
|
|
555
|
-
expect(output).toContain("_flat_myFunction2");
|
|
556
|
-
|
|
557
|
-
var TEST_OUTPUT_1, TEST_OUTPUT_2;
|
|
558
|
-
eval(output);
|
|
559
|
-
|
|
560
|
-
expect(TEST_OUTPUT_1).toStrictEqual("Correct Value 1");
|
|
561
|
-
expect(TEST_OUTPUT_2).toStrictEqual("Correct Value 2");
|
|
562
|
-
});
|
|
563
|
-
|
|
564
|
-
test("Variant #19: Nested function declaration", async () => {
|
|
565
|
-
var output = await JsConfuser(
|
|
566
|
-
`
|
|
567
|
-
function myFunction(){
|
|
568
|
-
TEST_OUTPUT = nestedFunctionDeclaration();
|
|
569
|
-
|
|
570
|
-
function nestedFunctionDeclaration(){
|
|
571
|
-
return "Correct Value";
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
myFunction();
|
|
576
|
-
`,
|
|
577
|
-
{
|
|
578
|
-
target: "node",
|
|
579
|
-
flatten: true,
|
|
580
|
-
}
|
|
581
|
-
);
|
|
582
|
-
|
|
583
|
-
expect(output).toContain("_flat_myFunction");
|
|
584
|
-
|
|
585
|
-
var TEST_OUTPUT;
|
|
586
|
-
eval(output);
|
|
587
|
-
|
|
588
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
589
|
-
});
|
|
590
|
-
|
|
591
|
-
test("Variant #20: Don't apply to functions that use 'this' 'arguments' or 'eval'", async () => {
|
|
592
|
-
var output = await JsConfuser(
|
|
593
|
-
`
|
|
594
|
-
function myFunction(){
|
|
595
|
-
usesEval();
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
function usesThis(){
|
|
599
|
-
return this;
|
|
600
|
-
}
|
|
601
|
-
function usesArguments(){
|
|
602
|
-
return arguments;
|
|
603
|
-
}
|
|
604
|
-
function usesEval(){
|
|
605
|
-
eval("TEST_OUTPUT = 'Correct Value'");
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
myFunction();
|
|
609
|
-
`,
|
|
610
|
-
{
|
|
611
|
-
target: "node",
|
|
612
|
-
flatten: true,
|
|
613
|
-
}
|
|
614
|
-
);
|
|
615
|
-
|
|
616
|
-
expect(output).toContain("_flat_myFunction");
|
|
617
|
-
expect(output).not.toContain("_flat_usesThis");
|
|
618
|
-
expect(output).not.toContain("_flat_usesArguments");
|
|
619
|
-
expect(output).not.toContain("_flat_usesEval");
|
|
620
|
-
|
|
621
|
-
var TEST_OUTPUT;
|
|
622
|
-
eval(output);
|
|
623
|
-
|
|
624
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
625
|
-
});
|
|
626
|
-
|
|
627
|
-
test("Variant #21: Preserve function.length property", async () => {
|
|
628
|
-
var output = await JsConfuser(
|
|
629
|
-
`
|
|
630
|
-
function oneParameter(a){};
|
|
631
|
-
var twoParameters = function({a},{b,c},...d){};
|
|
632
|
-
function threeParameters(a,b,c,d = 1,{e},...f){};
|
|
633
|
-
|
|
634
|
-
TEST_OUTPUT = oneParameter.length + twoParameters.length + threeParameters.length;
|
|
635
|
-
`,
|
|
636
|
-
{
|
|
637
|
-
target: "node",
|
|
638
|
-
flatten: true,
|
|
639
|
-
}
|
|
640
|
-
);
|
|
641
|
-
|
|
642
|
-
expect(output).toContain("_flat_oneParameter");
|
|
643
|
-
expect(output).not.toContain("_flat_twoParameters");
|
|
644
|
-
expect(output).not.toContain("_flat_threeParameters");
|
|
645
|
-
|
|
646
|
-
var TEST_OUTPUT;
|
|
647
|
-
eval(output);
|
|
648
|
-
|
|
649
|
-
expect(TEST_OUTPUT).toStrictEqual(6);
|
|
650
|
-
});
|
|
651
|
-
|
|
652
|
-
test("Variant #22: Modify object properties", async () => {
|
|
653
|
-
var output = await JsConfuser(
|
|
654
|
-
`
|
|
655
|
-
var myObject = {};
|
|
656
|
-
|
|
657
|
-
function setProperty(property, value){
|
|
658
|
-
myObject[property] = value;
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
function getProperty(property){
|
|
662
|
-
return myObject[property];
|
|
663
|
-
}
|
|
664
|
-
|
|
665
|
-
setProperty("TEST_PROPERTY", "Correct Value");
|
|
666
|
-
TEST_OUTPUT = getProperty("TEST_PROPERTY");
|
|
667
|
-
`,
|
|
668
|
-
{ target: "node", flatten: true }
|
|
669
|
-
);
|
|
670
|
-
|
|
671
|
-
expect(output).toContain("_flat_setProperty");
|
|
672
|
-
expect(output).toContain("_flat_getProperty");
|
|
673
|
-
|
|
674
|
-
var TEST_OUTPUT;
|
|
675
|
-
|
|
676
|
-
eval(output);
|
|
677
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
678
|
-
});
|
|
679
|
-
|
|
680
|
-
test("Variant #23: Reference original function name", async () => {
|
|
681
|
-
var output = await JsConfuser(
|
|
682
|
-
`
|
|
683
|
-
(function (){
|
|
684
|
-
function myFunction(){
|
|
685
|
-
var valueToCheck = myFunction;
|
|
686
|
-
TEST_OUTPUT = typeof valueToCheck === "function";
|
|
687
|
-
}
|
|
688
|
-
|
|
689
|
-
myFunction();
|
|
690
|
-
})();
|
|
691
|
-
`,
|
|
692
|
-
{ target: "node", flatten: true }
|
|
693
|
-
);
|
|
694
|
-
|
|
695
|
-
expect(output).toContain("_flat_myFunction");
|
|
696
|
-
|
|
697
|
-
var TEST_OUTPUT;
|
|
698
|
-
|
|
699
|
-
eval(output);
|
|
700
|
-
expect(TEST_OUTPUT).toStrictEqual(true);
|
|
701
|
-
});
|
|
702
|
-
|
|
703
|
-
test("Variant #24: Typeof expression", async () => {
|
|
704
|
-
var output = await JsConfuser(
|
|
705
|
-
`
|
|
706
|
-
function myFunction(){
|
|
707
|
-
TEST_OUTPUT = typeof nonExistentVariable === "undefined";
|
|
708
|
-
}
|
|
709
|
-
|
|
710
|
-
myFunction();
|
|
711
|
-
`,
|
|
712
|
-
{ target: "node", flatten: true }
|
|
713
|
-
);
|
|
714
|
-
|
|
715
|
-
expect(output).toContain("_flat_myFunction");
|
|
716
|
-
|
|
717
|
-
var TEST_OUTPUT;
|
|
718
|
-
|
|
719
|
-
eval(output);
|
|
720
|
-
expect(TEST_OUTPUT).toStrictEqual(true);
|
|
721
|
-
});
|