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,575 +0,0 @@
|
|
|
1
|
-
import JsConfuser from "../../src/index";
|
|
2
|
-
|
|
3
|
-
it("should group variable declarations together", async () => {
|
|
4
|
-
var code = `
|
|
5
|
-
var a = 0;
|
|
6
|
-
var b = 1;
|
|
7
|
-
`;
|
|
8
|
-
|
|
9
|
-
var output = await JsConfuser(code, { target: "browser", minify: true });
|
|
10
|
-
|
|
11
|
-
expect(output).toContain("var a=0,b=1");
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
it("should remove block statements when not necessary", async () => {
|
|
15
|
-
var code = `
|
|
16
|
-
while(condition){
|
|
17
|
-
doStuff();
|
|
18
|
-
}
|
|
19
|
-
`;
|
|
20
|
-
|
|
21
|
-
var output = await JsConfuser(code, { target: "browser", minify: true });
|
|
22
|
-
|
|
23
|
-
expect(output).not.toContain("{");
|
|
24
|
-
expect(output).toContain("doStuff()");
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it("should shorten guaranteed returns", async () => {
|
|
28
|
-
var code = `
|
|
29
|
-
function TEST_FUNCTION(){
|
|
30
|
-
if ( condition ) {
|
|
31
|
-
return 1;
|
|
32
|
-
} else {
|
|
33
|
-
return 0;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
`;
|
|
37
|
-
|
|
38
|
-
var output = await JsConfuser(code, { target: "browser", minify: true });
|
|
39
|
-
|
|
40
|
-
expect(output).not.toContain("if");
|
|
41
|
-
expect(output).toContain("?");
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it("should shorten guaranteed assignment expressions", async () => {
|
|
45
|
-
var code = `
|
|
46
|
-
function TEST_FUNCTION(){
|
|
47
|
-
var value;
|
|
48
|
-
if ( condition ) {
|
|
49
|
-
value = 1;
|
|
50
|
-
} else {
|
|
51
|
-
value = 0;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
`;
|
|
55
|
-
|
|
56
|
-
var output = await JsConfuser(code, { target: "browser", minify: true });
|
|
57
|
-
|
|
58
|
-
expect(output).not.toContain("if");
|
|
59
|
-
expect(output).toContain("value=");
|
|
60
|
-
expect(output).toContain("?");
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it("should convert eligible functions to arrow functions", async () => {
|
|
64
|
-
var code = `
|
|
65
|
-
function FN(){
|
|
66
|
-
return 1;
|
|
67
|
-
}
|
|
68
|
-
input( FN() )
|
|
69
|
-
`;
|
|
70
|
-
|
|
71
|
-
var output = await JsConfuser(code, { target: "browser", minify: true });
|
|
72
|
-
|
|
73
|
-
expect(output).toContain("=>");
|
|
74
|
-
|
|
75
|
-
var value = "never_called",
|
|
76
|
-
input = (x) => (value = x);
|
|
77
|
-
|
|
78
|
-
eval(output);
|
|
79
|
-
|
|
80
|
-
expect(value).toStrictEqual(1);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it("should not convert lower functions to arrow functions", async () => {
|
|
84
|
-
var code = `
|
|
85
|
-
input( FN() )
|
|
86
|
-
function FN(){
|
|
87
|
-
return 1;
|
|
88
|
-
}
|
|
89
|
-
`;
|
|
90
|
-
|
|
91
|
-
var output = await JsConfuser(code, { target: "browser", minify: true });
|
|
92
|
-
|
|
93
|
-
expect(output).not.toContain("=>");
|
|
94
|
-
|
|
95
|
-
var value = "never_called",
|
|
96
|
-
input = (x) => (value = x);
|
|
97
|
-
|
|
98
|
-
eval(output);
|
|
99
|
-
|
|
100
|
-
expect(value).toStrictEqual(1);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it("should work when shortening nested if-statements", async () => {
|
|
104
|
-
var code = `
|
|
105
|
-
var a = false;
|
|
106
|
-
var b = true;
|
|
107
|
-
if( a ) {
|
|
108
|
-
if ( b ) {
|
|
109
|
-
|
|
110
|
-
}
|
|
111
|
-
} else {
|
|
112
|
-
input(10)
|
|
113
|
-
}
|
|
114
|
-
`;
|
|
115
|
-
|
|
116
|
-
var output = await JsConfuser(code, { target: "browser", minify: true });
|
|
117
|
-
|
|
118
|
-
expect(output).not.toContain("=>");
|
|
119
|
-
|
|
120
|
-
var value = "never_called",
|
|
121
|
-
input = (x) => (value = x);
|
|
122
|
-
|
|
123
|
-
eval(output);
|
|
124
|
-
|
|
125
|
-
expect(value).toStrictEqual(10);
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
test("Variant #8: Shorten simple array destructuring", async () => {
|
|
129
|
-
// Valid
|
|
130
|
-
var output = await JsConfuser(`var [x] = [1]`, {
|
|
131
|
-
target: "node",
|
|
132
|
-
minify: true,
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
expect(output).toContain("var x=1");
|
|
136
|
-
|
|
137
|
-
// Invalid
|
|
138
|
-
var output2 = await JsConfuser(`var [x, y] = [1]`, {
|
|
139
|
-
target: "node",
|
|
140
|
-
minify: true,
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
expect(output2).toContain("var [x,y]");
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
test("Variant #9: Shorten simple object destructuring", async () => {
|
|
147
|
-
// Valid
|
|
148
|
-
var output = await JsConfuser(`var {x} = {x: 1}`, {
|
|
149
|
-
target: "node",
|
|
150
|
-
minify: true,
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
expect(output).toContain("var x=1");
|
|
154
|
-
|
|
155
|
-
// Valid
|
|
156
|
-
var output2 = await JsConfuser(`var {['x']: y} = {x: 1}`, {
|
|
157
|
-
target: "node",
|
|
158
|
-
minify: true,
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
expect(output2).toContain("var y=1");
|
|
162
|
-
|
|
163
|
-
// Invalid
|
|
164
|
-
var output3 = await JsConfuser(`var {x,y} = {x:1}`, {
|
|
165
|
-
target: "node",
|
|
166
|
-
minify: true,
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
expect(output3).toContain("var {x:x,y:y}");
|
|
170
|
-
|
|
171
|
-
// Invalid
|
|
172
|
-
var output4 = await JsConfuser(`var {y} = {x:1}`, {
|
|
173
|
-
target: "node",
|
|
174
|
-
minify: true,
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
expect(output4).toContain("var {y:y}");
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
test("Variant #10: Shorten booleans", async () => {
|
|
181
|
-
// Valid
|
|
182
|
-
var output = await JsConfuser(`var x = true;`, {
|
|
183
|
-
target: "node",
|
|
184
|
-
minify: true,
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
expect(output).toContain("var x=!0");
|
|
188
|
-
|
|
189
|
-
// Valid
|
|
190
|
-
var output2 = await JsConfuser(`var x = false`, {
|
|
191
|
-
target: "node",
|
|
192
|
-
minify: true,
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
expect(output2).toContain("var x=!1");
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
test("Variant #11: Shorten 'undefined' to 'void 0'", async () => {
|
|
199
|
-
// Valid
|
|
200
|
-
var output = await JsConfuser(`x = undefined;`, {
|
|
201
|
-
target: "node",
|
|
202
|
-
minify: true,
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
expect(output).toContain("x=void 0");
|
|
206
|
-
|
|
207
|
-
// Valid
|
|
208
|
-
var output2 = await JsConfuser(`var x = {undefined: 1}`, {
|
|
209
|
-
target: "node",
|
|
210
|
-
minify: true,
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
expect(output2).toContain("var x={[void 0]:1}");
|
|
214
|
-
|
|
215
|
-
var output3 = await JsConfuser(
|
|
216
|
-
`try { var undefined; (undefined) = true } catch(e) {}`,
|
|
217
|
-
{
|
|
218
|
-
target: "node",
|
|
219
|
-
minify: true,
|
|
220
|
-
}
|
|
221
|
-
);
|
|
222
|
-
|
|
223
|
-
eval(output3);
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
test("Variant #11: Shorten 'Infinity' to 1/0", async () => {
|
|
227
|
-
// Valid
|
|
228
|
-
var output = await JsConfuser(`var x = Infinity;`, {
|
|
229
|
-
target: "node",
|
|
230
|
-
minify: true,
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
expect(output).toContain("var x=1/0");
|
|
234
|
-
|
|
235
|
-
// Valid
|
|
236
|
-
var output2 = await JsConfuser(`var x = {Infinity: 1}`, {
|
|
237
|
-
target: "node",
|
|
238
|
-
minify: true,
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
expect(output2).toContain("var x={[1/0]:1}");
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
test("Variant #12: Shorten '!false' to 'true'", async () => {
|
|
245
|
-
// Valid
|
|
246
|
-
var output = await JsConfuser(`var x = !false;`, {
|
|
247
|
-
target: "node",
|
|
248
|
-
minify: true,
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
expect(output).toContain("var x=true");
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
test("Variant #13: Shorten 'false ? a : b' to 'b'", async () => {
|
|
255
|
-
// Valid
|
|
256
|
-
var output = await JsConfuser(`var x = false ? 10 : 15;`, {
|
|
257
|
-
target: "node",
|
|
258
|
-
minify: true,
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
expect(output).toContain("var x=15");
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
test("Variant #14: Shorten 'var x = undefined' to 'var x'", async () => {
|
|
265
|
-
// Valid
|
|
266
|
-
var output = await JsConfuser(`var x = undefined`, {
|
|
267
|
-
target: "node",
|
|
268
|
-
minify: true,
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
expect(output).toContain("var x");
|
|
272
|
-
expect(output).not.toContain("var x=");
|
|
273
|
-
});
|
|
274
|
-
|
|
275
|
-
test("Variant #15: Removing implied 'return'", async () => {
|
|
276
|
-
// Valid
|
|
277
|
-
var output = await JsConfuser(
|
|
278
|
-
`
|
|
279
|
-
function MyFunction(){
|
|
280
|
-
var output = "Hello World";
|
|
281
|
-
console.log(output);
|
|
282
|
-
this; // Stop arrow function conversion
|
|
283
|
-
return;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
MyFunction();
|
|
287
|
-
`,
|
|
288
|
-
{ target: "node", minify: true }
|
|
289
|
-
);
|
|
290
|
-
|
|
291
|
-
expect(output).not.toContain("return");
|
|
292
|
-
|
|
293
|
-
// Invalid
|
|
294
|
-
// https://github.com/MichaelXF/js-confuser/issues/34
|
|
295
|
-
var output2 = await JsConfuser(
|
|
296
|
-
`
|
|
297
|
-
function greet(){
|
|
298
|
-
if(true){
|
|
299
|
-
console.log("return");
|
|
300
|
-
return;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
var output = "should not show!"; console.log(output);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
greet();
|
|
307
|
-
`,
|
|
308
|
-
{ target: "browser", minify: true }
|
|
309
|
-
);
|
|
310
|
-
|
|
311
|
-
expect(output2).toContain("return");
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
// https://github.com/MichaelXF/js-confuser/issues/43
|
|
315
|
-
test("Variant #16: Handle deconstructuring in for loop", async () => {
|
|
316
|
-
// Valid
|
|
317
|
-
var output = await JsConfuser(
|
|
318
|
-
`
|
|
319
|
-
for(const [a] of [[1]]) {
|
|
320
|
-
input(a);
|
|
321
|
-
}
|
|
322
|
-
`,
|
|
323
|
-
{ target: "node", minify: true }
|
|
324
|
-
);
|
|
325
|
-
|
|
326
|
-
var value;
|
|
327
|
-
function input(valueIn) {
|
|
328
|
-
value = valueIn;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
eval(output);
|
|
332
|
-
|
|
333
|
-
expect(value).toStrictEqual(1);
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
test("Variant #17: Remove unreachable code following a return statement", async () => {
|
|
337
|
-
var output = await JsConfuser(
|
|
338
|
-
`
|
|
339
|
-
function myFunction(){
|
|
340
|
-
return;
|
|
341
|
-
unreachableStmt;
|
|
342
|
-
}
|
|
343
|
-
`,
|
|
344
|
-
{ target: "node", minify: true }
|
|
345
|
-
);
|
|
346
|
-
|
|
347
|
-
expect(output).not.toContain("unreachableStmt");
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
test("Variant #18: Remove unreachable code following a continue or break statement", async () => {
|
|
351
|
-
var output = await JsConfuser(
|
|
352
|
-
`
|
|
353
|
-
for(var i =0; i < 10; i++){
|
|
354
|
-
continue;
|
|
355
|
-
unreachableStmt
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
while(true){
|
|
359
|
-
break;
|
|
360
|
-
unreachableStmt
|
|
361
|
-
}
|
|
362
|
-
`,
|
|
363
|
-
{ target: "node", minify: true }
|
|
364
|
-
);
|
|
365
|
-
|
|
366
|
-
expect(output).not.toContain("unreachableStmt");
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
test("Variant #19: Remove unreachable code following a throw statement", async () => {
|
|
370
|
-
var output = await JsConfuser(
|
|
371
|
-
`
|
|
372
|
-
throw new Error("No more code to run");
|
|
373
|
-
unreachableStmt;
|
|
374
|
-
`,
|
|
375
|
-
{ target: "node", minify: true }
|
|
376
|
-
);
|
|
377
|
-
|
|
378
|
-
expect(output).not.toContain("unreachableStmt");
|
|
379
|
-
});
|
|
380
|
-
|
|
381
|
-
// https://github.com/MichaelXF/js-confuser/issues/76
|
|
382
|
-
test("Variant #20: Properly handle objects with `, ^, [, ] as keys", async () => {
|
|
383
|
-
var output = await JsConfuser(
|
|
384
|
-
`
|
|
385
|
-
TEST_OBJECT = {
|
|
386
|
-
"\`": true,
|
|
387
|
-
"^": true,
|
|
388
|
-
"]": true,
|
|
389
|
-
"[": true
|
|
390
|
-
};
|
|
391
|
-
`,
|
|
392
|
-
{
|
|
393
|
-
target: "node",
|
|
394
|
-
minify: true,
|
|
395
|
-
}
|
|
396
|
-
);
|
|
397
|
-
|
|
398
|
-
var TEST_OBJECT;
|
|
399
|
-
eval(output);
|
|
400
|
-
|
|
401
|
-
expect(TEST_OBJECT).toStrictEqual({
|
|
402
|
-
"`": true,
|
|
403
|
-
"^": true,
|
|
404
|
-
"]": true,
|
|
405
|
-
"[": true,
|
|
406
|
-
});
|
|
407
|
-
});
|
|
408
|
-
|
|
409
|
-
// https://github.com/MichaelXF/js-confuser/issues/75
|
|
410
|
-
test("Variant #21: Properly handle Object constructor (Function Declaration)", async () => {
|
|
411
|
-
var output = await JsConfuser(
|
|
412
|
-
`
|
|
413
|
-
function MyClass() {};
|
|
414
|
-
|
|
415
|
-
var myObject = new MyClass();
|
|
416
|
-
|
|
417
|
-
TEST_OUTPUT = myObject instanceof MyClass;
|
|
418
|
-
`,
|
|
419
|
-
{ target: "node", minify: true }
|
|
420
|
-
);
|
|
421
|
-
|
|
422
|
-
var TEST_OUTPUT = false;
|
|
423
|
-
eval(output);
|
|
424
|
-
|
|
425
|
-
expect(TEST_OUTPUT).toStrictEqual(true);
|
|
426
|
-
});
|
|
427
|
-
|
|
428
|
-
test("Variant #22: Properly handle Object constructor (Function Expression)", async () => {
|
|
429
|
-
var output = await JsConfuser(
|
|
430
|
-
`
|
|
431
|
-
var MyClass = function() {};
|
|
432
|
-
|
|
433
|
-
var myObject = new MyClass();
|
|
434
|
-
|
|
435
|
-
TEST_OUTPUT = myObject instanceof MyClass;
|
|
436
|
-
`,
|
|
437
|
-
{ target: "node", minify: true }
|
|
438
|
-
);
|
|
439
|
-
|
|
440
|
-
var TEST_OUTPUT = false;
|
|
441
|
-
eval(output);
|
|
442
|
-
|
|
443
|
-
expect(TEST_OUTPUT).toStrictEqual(true);
|
|
444
|
-
});
|
|
445
|
-
|
|
446
|
-
test("Variant #23: Shorten property names and method names", async () => {
|
|
447
|
-
var output = await JsConfuser(
|
|
448
|
-
`
|
|
449
|
-
var myObject = { "myKey": "Correct Value" };
|
|
450
|
-
var myClass = class { ["myMethod"](){ return "Correct Value" } }
|
|
451
|
-
|
|
452
|
-
TEST_OUTPUT = myObject.myKey === (new myClass()).myMethod();
|
|
453
|
-
`,
|
|
454
|
-
{ target: "node", minify: true }
|
|
455
|
-
);
|
|
456
|
-
|
|
457
|
-
expect(output).not.toContain("'myKey'");
|
|
458
|
-
expect(output).not.toContain("'myMethod'");
|
|
459
|
-
|
|
460
|
-
var TEST_OUTPUT;
|
|
461
|
-
eval(output);
|
|
462
|
-
|
|
463
|
-
expect(TEST_OUTPUT).toStrictEqual(true);
|
|
464
|
-
});
|
|
465
|
-
|
|
466
|
-
test("Variant #24: Variable grouping in switch case", async () => {
|
|
467
|
-
var output = await JsConfuser(
|
|
468
|
-
`
|
|
469
|
-
switch(true){
|
|
470
|
-
case true:
|
|
471
|
-
var myVar1;
|
|
472
|
-
var myVar2;
|
|
473
|
-
var myVar3 = "Correct Value";
|
|
474
|
-
var myVar4;
|
|
475
|
-
|
|
476
|
-
TEST_OUTPUT = myVar3;
|
|
477
|
-
break;
|
|
478
|
-
}
|
|
479
|
-
`,
|
|
480
|
-
{ target: "node", minify: true }
|
|
481
|
-
);
|
|
482
|
-
|
|
483
|
-
// Ensure the variable declarations were grouped
|
|
484
|
-
expect(output).toContain("var myVar1,myVar2,myVar3");
|
|
485
|
-
|
|
486
|
-
var TEST_OUTPUT;
|
|
487
|
-
eval(output);
|
|
488
|
-
|
|
489
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
490
|
-
});
|
|
491
|
-
|
|
492
|
-
test("Variant #25: Don't break redefined function declaration", async () => {
|
|
493
|
-
var output = await JsConfuser(
|
|
494
|
-
`
|
|
495
|
-
function a(){ TEST_OUTPUT = 1 };
|
|
496
|
-
function a(){ TEST_OUTPUT = 2 };
|
|
497
|
-
function a(){ TEST_OUTPUT = 3 };
|
|
498
|
-
|
|
499
|
-
a();
|
|
500
|
-
`,
|
|
501
|
-
{ target: "node", minify: true }
|
|
502
|
-
);
|
|
503
|
-
|
|
504
|
-
var TEST_OUTPUT;
|
|
505
|
-
eval(output);
|
|
506
|
-
|
|
507
|
-
expect(TEST_OUTPUT).toStrictEqual(3);
|
|
508
|
-
});
|
|
509
|
-
|
|
510
|
-
test("Variant #26: Don't break nested redefined function declaration", async () => {
|
|
511
|
-
var output = await JsConfuser(
|
|
512
|
-
`
|
|
513
|
-
var a = 0;
|
|
514
|
-
if(true){
|
|
515
|
-
function a(){
|
|
516
|
-
TEST_OUTPUT = 1;
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
a();
|
|
521
|
-
`,
|
|
522
|
-
{ target: "node", minify: true }
|
|
523
|
-
);
|
|
524
|
-
|
|
525
|
-
var TEST_OUTPUT;
|
|
526
|
-
eval(output);
|
|
527
|
-
|
|
528
|
-
expect(TEST_OUTPUT).toStrictEqual(1);
|
|
529
|
-
});
|
|
530
|
-
|
|
531
|
-
// https://github.com/MichaelXF/js-confuser/issues/91
|
|
532
|
-
test("Variant #27: Preserve function.length property", async () => {
|
|
533
|
-
var output = await JsConfuser(
|
|
534
|
-
`
|
|
535
|
-
function oneParameter(a){};
|
|
536
|
-
var twoParameters = function({a},{b,c},...d){};
|
|
537
|
-
function threeParameters(a,b,c,d = 1,{e},...f){};
|
|
538
|
-
|
|
539
|
-
TEST_OUTPUT = oneParameter.length + twoParameters.length + threeParameters.length;
|
|
540
|
-
`,
|
|
541
|
-
{ target: "node", minify: true }
|
|
542
|
-
);
|
|
543
|
-
|
|
544
|
-
var TEST_OUTPUT;
|
|
545
|
-
eval(output);
|
|
546
|
-
|
|
547
|
-
expect(TEST_OUTPUT).toStrictEqual(6);
|
|
548
|
-
});
|
|
549
|
-
|
|
550
|
-
// https://github.com/MichaelXF/js-confuser/issues/125
|
|
551
|
-
test("Variant #28: Don't break destructuring assignment", async () => {
|
|
552
|
-
var output = await JsConfuser(
|
|
553
|
-
`
|
|
554
|
-
let objectSlice = [];
|
|
555
|
-
objectSlice.push({
|
|
556
|
-
a: 1,
|
|
557
|
-
b: 2,
|
|
558
|
-
c: 3,
|
|
559
|
-
})
|
|
560
|
-
for (let {
|
|
561
|
-
a,
|
|
562
|
-
b,
|
|
563
|
-
c
|
|
564
|
-
} of objectSlice) {
|
|
565
|
-
TEST_OUTPUT = a + b + c;
|
|
566
|
-
}
|
|
567
|
-
`,
|
|
568
|
-
{ target: "node", minify: true }
|
|
569
|
-
);
|
|
570
|
-
|
|
571
|
-
var TEST_OUTPUT;
|
|
572
|
-
eval(output);
|
|
573
|
-
|
|
574
|
-
expect(TEST_OUTPUT).toStrictEqual(6);
|
|
575
|
-
});
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import JsConfuser from "../../src/index";
|
|
2
|
-
|
|
3
|
-
it("should append logical expressions", async () => {
|
|
4
|
-
var code = `
|
|
5
|
-
|
|
6
|
-
var test = false;
|
|
7
|
-
if ( test ) {
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
`;
|
|
11
|
-
|
|
12
|
-
var output = await JsConfuser(code, {
|
|
13
|
-
target: "browser",
|
|
14
|
-
opaquePredicates: true,
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
expect(output).not.toContain("(test)");
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
// https://github.com/MichaelXF/js-confuser/issues/45
|
|
21
|
-
it("should work on default Switch cases", async ()=>{
|
|
22
|
-
var code = `
|
|
23
|
-
|
|
24
|
-
switch (0) {
|
|
25
|
-
default:
|
|
26
|
-
input(true);
|
|
27
|
-
}
|
|
28
|
-
`;
|
|
29
|
-
|
|
30
|
-
var output = await JsConfuser(code, {
|
|
31
|
-
target: "browser",
|
|
32
|
-
opaquePredicates: true,
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
var value;
|
|
36
|
-
function input(valueIn){
|
|
37
|
-
value = valueIn;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
eval(output);
|
|
41
|
-
|
|
42
|
-
expect(value).toStrictEqual(true);
|
|
43
|
-
})
|