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,192 +0,0 @@
|
|
|
1
|
-
import { criticalFunctionTag } from "../../../src/constants";
|
|
2
|
-
import JsConfuser from "../../../src/index";
|
|
3
|
-
|
|
4
|
-
// Enable Control Flow Flattening's 'Expression Obfuscation' but skips all CFF switch transformations
|
|
5
|
-
function fakeEnabled() {
|
|
6
|
-
return false;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
test("Variant #1: Join expressions in a sequence expression", async () => {
|
|
10
|
-
var output = await JsConfuser(
|
|
11
|
-
`
|
|
12
|
-
TEST_OUTPUT=0;
|
|
13
|
-
TEST_OUTPUT++;
|
|
14
|
-
`,
|
|
15
|
-
{ target: "node", controlFlowFlattening: fakeEnabled }
|
|
16
|
-
);
|
|
17
|
-
|
|
18
|
-
expect(output).toContain("TEST_OUTPUT=0,TEST_OUTPUT++");
|
|
19
|
-
|
|
20
|
-
var TEST_OUTPUT;
|
|
21
|
-
eval(output);
|
|
22
|
-
|
|
23
|
-
expect(TEST_OUTPUT).toStrictEqual(1);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
test("Variant #2: If Statement", async () => {
|
|
27
|
-
var output = await JsConfuser(
|
|
28
|
-
`
|
|
29
|
-
TEST_OUTPUT=0;
|
|
30
|
-
if(true){
|
|
31
|
-
TEST_OUTPUT++;
|
|
32
|
-
}
|
|
33
|
-
`,
|
|
34
|
-
{ target: "node", controlFlowFlattening: fakeEnabled }
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
expect(output).toContain("TEST_OUTPUT=0,true");
|
|
38
|
-
|
|
39
|
-
var TEST_OUTPUT;
|
|
40
|
-
eval(output);
|
|
41
|
-
|
|
42
|
-
expect(TEST_OUTPUT).toStrictEqual(1);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
test("Variant #3: ForStatement (Variable Declaration initializer)", async () => {
|
|
46
|
-
var output = await JsConfuser(
|
|
47
|
-
`
|
|
48
|
-
TEST_OUTPUT=0;
|
|
49
|
-
for(var i =0; i < 10; i++){
|
|
50
|
-
TEST_OUTPUT++;
|
|
51
|
-
}
|
|
52
|
-
`,
|
|
53
|
-
{ target: "node", controlFlowFlattening: fakeEnabled }
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
expect(output).toContain("TEST_OUTPUT=0,0");
|
|
57
|
-
|
|
58
|
-
var TEST_OUTPUT;
|
|
59
|
-
eval(output);
|
|
60
|
-
|
|
61
|
-
expect(TEST_OUTPUT).toStrictEqual(10);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
test("Variant #4: ForStatement (Assignment expression initializer)", async () => {
|
|
65
|
-
var output = await JsConfuser(
|
|
66
|
-
`
|
|
67
|
-
TEST_OUTPUT=0;
|
|
68
|
-
for(i = 0; i < 10; i++){
|
|
69
|
-
TEST_OUTPUT++;
|
|
70
|
-
}
|
|
71
|
-
`,
|
|
72
|
-
{ target: "node", controlFlowFlattening: fakeEnabled }
|
|
73
|
-
);
|
|
74
|
-
|
|
75
|
-
expect(output).toContain("TEST_OUTPUT=0,0");
|
|
76
|
-
|
|
77
|
-
var TEST_OUTPUT, i;
|
|
78
|
-
eval(output);
|
|
79
|
-
|
|
80
|
-
expect(TEST_OUTPUT).toStrictEqual(10);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
test("Variant #5: Return statement", async () => {
|
|
84
|
-
var output = await JsConfuser(
|
|
85
|
-
`
|
|
86
|
-
function fn(){
|
|
87
|
-
TEST_OUTPUT = 10;
|
|
88
|
-
return "Value";
|
|
89
|
-
}
|
|
90
|
-
fn();
|
|
91
|
-
`,
|
|
92
|
-
{ target: "node", controlFlowFlattening: fakeEnabled }
|
|
93
|
-
);
|
|
94
|
-
|
|
95
|
-
expect(output).toContain("TEST_OUTPUT=10,'Value'");
|
|
96
|
-
|
|
97
|
-
var TEST_OUTPUT;
|
|
98
|
-
eval(output);
|
|
99
|
-
|
|
100
|
-
expect(TEST_OUTPUT).toStrictEqual(10);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
test("Variant #6: Return statement (no argument)", async () => {
|
|
104
|
-
var output = await JsConfuser(
|
|
105
|
-
`
|
|
106
|
-
function fn(){
|
|
107
|
-
TEST_OUTPUT = 10;
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
fn();
|
|
111
|
-
`,
|
|
112
|
-
{ target: "node", controlFlowFlattening: fakeEnabled }
|
|
113
|
-
);
|
|
114
|
-
|
|
115
|
-
expect(output).toContain("TEST_OUTPUT=10,undefined");
|
|
116
|
-
|
|
117
|
-
var TEST_OUTPUT;
|
|
118
|
-
eval(output);
|
|
119
|
-
|
|
120
|
-
expect(TEST_OUTPUT).toStrictEqual(10);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
test("Variant #7: Throw statement", async () => {
|
|
124
|
-
var output = await JsConfuser(
|
|
125
|
-
`
|
|
126
|
-
function fn(){
|
|
127
|
-
TEST_OUTPUT = "Correct Value";
|
|
128
|
-
throw new Error("My Error")
|
|
129
|
-
}
|
|
130
|
-
try {
|
|
131
|
-
fn();
|
|
132
|
-
} catch(e){
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
`,
|
|
136
|
-
{ target: "node", controlFlowFlattening: fakeEnabled }
|
|
137
|
-
);
|
|
138
|
-
|
|
139
|
-
expect(output).toContain("TEST_OUTPUT='Correct Value',new Error");
|
|
140
|
-
|
|
141
|
-
var TEST_OUTPUT;
|
|
142
|
-
eval(output);
|
|
143
|
-
|
|
144
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
test("Variant #8: Variable declaration", async () => {
|
|
148
|
-
var output = await JsConfuser(
|
|
149
|
-
`
|
|
150
|
-
TEST_OUTPUT = "Correct Value";
|
|
151
|
-
var x = 1, y = 2;
|
|
152
|
-
`,
|
|
153
|
-
{ target: "node", controlFlowFlattening: fakeEnabled }
|
|
154
|
-
);
|
|
155
|
-
|
|
156
|
-
expect(output).toContain("(TEST_OUTPUT='Correct Value'");
|
|
157
|
-
|
|
158
|
-
var TEST_OUTPUT;
|
|
159
|
-
eval(output);
|
|
160
|
-
|
|
161
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
test("Variant #9: Variable declaration (no initializer)", async () => {
|
|
165
|
-
var output = await JsConfuser(
|
|
166
|
-
`
|
|
167
|
-
TEST_OUTPUT = "Correct Value";
|
|
168
|
-
var x,y;
|
|
169
|
-
`,
|
|
170
|
-
{ target: "node", controlFlowFlattening: fakeEnabled }
|
|
171
|
-
);
|
|
172
|
-
|
|
173
|
-
expect(output).toContain(`(TEST_OUTPUT='Correct Value',undefined)`);
|
|
174
|
-
|
|
175
|
-
var TEST_OUTPUT;
|
|
176
|
-
eval(output);
|
|
177
|
-
|
|
178
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
test("Variant #10: Use function call", async () => {
|
|
182
|
-
var output = await JsConfuser(
|
|
183
|
-
`
|
|
184
|
-
TEST_OUTPUT = "Correct Value";
|
|
185
|
-
var x,y;
|
|
186
|
-
`,
|
|
187
|
-
{ target: "node", controlFlowFlattening: fakeEnabled }
|
|
188
|
-
);
|
|
189
|
-
|
|
190
|
-
expect(output).toContain("function");
|
|
191
|
-
expect(output).toContain(criticalFunctionTag);
|
|
192
|
-
});
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import JsConfuser from "../../src/index";
|
|
2
|
-
|
|
3
|
-
test("Variant #1: Execute properly", async () => {
|
|
4
|
-
var code = `
|
|
5
|
-
function myFunction(){
|
|
6
|
-
var array = [];
|
|
7
|
-
|
|
8
|
-
array.push(1);
|
|
9
|
-
array.push(2);
|
|
10
|
-
array.push(3);
|
|
11
|
-
array.push(4);
|
|
12
|
-
array.push(5);
|
|
13
|
-
array.push(6);
|
|
14
|
-
array.push(7);
|
|
15
|
-
array.push(8);
|
|
16
|
-
array.push(9);
|
|
17
|
-
array.push(10);
|
|
18
|
-
|
|
19
|
-
input(array);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
myFunction();
|
|
23
|
-
`;
|
|
24
|
-
|
|
25
|
-
var output = await JsConfuser(code, {
|
|
26
|
-
target: "browser",
|
|
27
|
-
deadCode: true,
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
// Ensure Dead code was added
|
|
31
|
-
expect(output).toContain("if");
|
|
32
|
-
|
|
33
|
-
var value = "never_called";
|
|
34
|
-
function input(valueIn) {
|
|
35
|
-
value = valueIn;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
eval(output);
|
|
39
|
-
|
|
40
|
-
expect(value).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
test("Variant #2: Preserve 'use strict' directive", async () => {
|
|
44
|
-
var code = `
|
|
45
|
-
'use strict';
|
|
46
|
-
function myFunction(){
|
|
47
|
-
var array = [];
|
|
48
|
-
|
|
49
|
-
array.push(1);
|
|
50
|
-
array.push(2);
|
|
51
|
-
array.push(3);
|
|
52
|
-
array.push(4);
|
|
53
|
-
array.push(5);
|
|
54
|
-
array.push(6);
|
|
55
|
-
array.push(7);
|
|
56
|
-
array.push(8);
|
|
57
|
-
array.push(9);
|
|
58
|
-
array.push(10);
|
|
59
|
-
|
|
60
|
-
input(array);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
myFunction();
|
|
64
|
-
`;
|
|
65
|
-
|
|
66
|
-
var output = await JsConfuser(code, {
|
|
67
|
-
target: "browser",
|
|
68
|
-
deadCode: true,
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
// Ensure 'use strict' was preversed
|
|
72
|
-
expect(output.startsWith("'use strict'")).toStrictEqual(true);
|
|
73
|
-
|
|
74
|
-
// Ensure Dead code was added
|
|
75
|
-
expect(output).toContain("if");
|
|
76
|
-
|
|
77
|
-
var value = "never_called";
|
|
78
|
-
function input(valueIn) {
|
|
79
|
-
value = valueIn;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
eval(output);
|
|
83
|
-
|
|
84
|
-
expect(value).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
|
85
|
-
});
|
|
@@ -1,457 +0,0 @@
|
|
|
1
|
-
import JsConfuser from "../../src/index";
|
|
2
|
-
|
|
3
|
-
it("should middleman function calls", async () => {
|
|
4
|
-
var code = `
|
|
5
|
-
|
|
6
|
-
function TEST_FUNCTION(arg){
|
|
7
|
-
input(10);
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
TEST_FUNCTION(10);
|
|
11
|
-
`;
|
|
12
|
-
|
|
13
|
-
var output = await JsConfuser(code, { target: "browser", dispatcher: true });
|
|
14
|
-
|
|
15
|
-
function input(x) {
|
|
16
|
-
expect(x).toStrictEqual(10);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
expect(output).not.toContain("function TEST_FUNCTION(");
|
|
20
|
-
eval(output);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it("should not middleman functions relying on arguments identifier", async () => {
|
|
24
|
-
var code = `
|
|
25
|
-
|
|
26
|
-
function TEST_FUNCTION(){
|
|
27
|
-
var arg = arguments[0];
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
TEST_FUNCTION(10);
|
|
31
|
-
`;
|
|
32
|
-
|
|
33
|
-
var output = await JsConfuser(code, { target: "browser", dispatcher: true });
|
|
34
|
-
|
|
35
|
-
expect(output).toContain("function TEST_FUNCTION(");
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it("should not middleman functions relying on this identifier", async () => {
|
|
39
|
-
var code = `
|
|
40
|
-
|
|
41
|
-
function TEST_FUNCTION(){
|
|
42
|
-
this.key = 1;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
TEST_FUNCTION(10);
|
|
46
|
-
`;
|
|
47
|
-
|
|
48
|
-
var output = await JsConfuser(code, { target: "browser", dispatcher: true });
|
|
49
|
-
|
|
50
|
-
expect(output).toContain("function TEST_FUNCTION(");
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it("should work with nested functions", async () => {
|
|
54
|
-
var code = `
|
|
55
|
-
|
|
56
|
-
function TEST_FUNCTION(){
|
|
57
|
-
function TEST_NESTED_FUNCTION(){
|
|
58
|
-
input(10)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
TEST_NESTED_FUNCTION()
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
TEST_FUNCTION();
|
|
65
|
-
`;
|
|
66
|
-
|
|
67
|
-
var output = await JsConfuser(code, { target: "browser", dispatcher: true });
|
|
68
|
-
function input(x) {
|
|
69
|
-
expect(x).toStrictEqual(10);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
expect(output).not.toContain("function TEST_FUNCTION(");
|
|
73
|
-
eval(output);
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
it("should work with nested functions and parameters", async () => {
|
|
77
|
-
var code = `
|
|
78
|
-
|
|
79
|
-
function TEST_FUNCTION(x){
|
|
80
|
-
function TEST_NESTED_FUNCTION(y){
|
|
81
|
-
input(y)
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
TEST_NESTED_FUNCTION(x)
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
TEST_FUNCTION(10);
|
|
88
|
-
`;
|
|
89
|
-
|
|
90
|
-
var output = await JsConfuser(code, { target: "browser", dispatcher: true });
|
|
91
|
-
function input(x) {
|
|
92
|
-
expect(x).toStrictEqual(10);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
expect(output).not.toContain("function TEST_FUNCTION(");
|
|
96
|
-
eval(output);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it("should work with nested functions and return values", async () => {
|
|
100
|
-
var code = `
|
|
101
|
-
|
|
102
|
-
function TEST_FUNCTION(){
|
|
103
|
-
function TEST_NESTED_FUNCTION(){
|
|
104
|
-
return 10;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
return TEST_NESTED_FUNCTION()
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
input(TEST_FUNCTION());
|
|
111
|
-
`;
|
|
112
|
-
|
|
113
|
-
var output = await JsConfuser(code, { target: "browser", dispatcher: true });
|
|
114
|
-
function input(x) {
|
|
115
|
-
expect(x).toStrictEqual(10);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
expect(output).not.toContain("function TEST_FUNCTION(");
|
|
119
|
-
eval(output);
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
it("should work with nested and sibling functions and return values", async () => {
|
|
123
|
-
var code = `
|
|
124
|
-
|
|
125
|
-
function TEST_FUNCTION_2(){
|
|
126
|
-
function TEST_NESTED_FUNCTION(){
|
|
127
|
-
return 10;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return TEST_NESTED_FUNCTION()
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
function TEST_FUNCTION(){
|
|
134
|
-
return TEST_FUNCTION_2();
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
input(TEST_FUNCTION());
|
|
138
|
-
`;
|
|
139
|
-
|
|
140
|
-
var output = await JsConfuser(code, { target: "browser", dispatcher: true });
|
|
141
|
-
function input(x) {
|
|
142
|
-
expect(x).toStrictEqual(10);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
expect(output).not.toContain("function TEST_FUNCTION(");
|
|
146
|
-
eval(output);
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
it("should work with referencing the function itself", async () => {
|
|
150
|
-
var code = `
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
function TEST_FUNCTION(x){
|
|
155
|
-
return x;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
var fn = TEST_FUNCTION;
|
|
159
|
-
|
|
160
|
-
input(fn(10));
|
|
161
|
-
`;
|
|
162
|
-
|
|
163
|
-
var output = await JsConfuser(code, { target: "browser", dispatcher: true });
|
|
164
|
-
function input(x) {
|
|
165
|
-
expect(x).toStrictEqual(10);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
expect(output).not.toContain("function TEST_FUNCTION(");
|
|
169
|
-
eval(output);
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
it("should work with the spread operator on arguments", async () => {
|
|
173
|
-
var code = `
|
|
174
|
-
|
|
175
|
-
function TEST_FUNCTION(x, y, z){
|
|
176
|
-
return x + y + z;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
input(TEST_FUNCTION(...[2, 10, 8]));
|
|
180
|
-
`;
|
|
181
|
-
|
|
182
|
-
var output = await JsConfuser(code, { target: "browser", dispatcher: true });
|
|
183
|
-
function input(x) {
|
|
184
|
-
expect(x).toStrictEqual(20);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
expect(output).not.toContain("function TEST_FUNCTION(");
|
|
188
|
-
eval(output);
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
it("should work with the spread operator on parameters", async () => {
|
|
192
|
-
var code = `
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
function TEST_FUNCTION(...a){
|
|
197
|
-
return a[0] + a[1] + a[2];
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
input(TEST_FUNCTION(2, 10, 8));
|
|
201
|
-
`;
|
|
202
|
-
|
|
203
|
-
var output = await JsConfuser(code, { target: "browser", dispatcher: true });
|
|
204
|
-
function input(x) {
|
|
205
|
-
expect(x).toStrictEqual(20);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
expect(output).not.toContain("function TEST_FUNCTION(");
|
|
209
|
-
eval(output);
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
it("should work with the spread operator on both arguments and parameters", async () => {
|
|
213
|
-
var code = `
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
function TEST_FUNCTION(...a){
|
|
217
|
-
return a[0] + a[1] + a[2];
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
input(TEST_FUNCTION(...[2, 10, 8]));
|
|
221
|
-
`;
|
|
222
|
-
|
|
223
|
-
var output = await JsConfuser(code, { target: "browser", dispatcher: true });
|
|
224
|
-
function input(x) {
|
|
225
|
-
expect(x).toStrictEqual(20);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
expect(output).not.toContain("function TEST_FUNCTION(");
|
|
229
|
-
eval(output);
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
it("should work with Stack", async () => {
|
|
233
|
-
var code = `
|
|
234
|
-
|
|
235
|
-
function TEST_FUNCTION_2(){
|
|
236
|
-
function TEST_NESTED_FUNCTION(){
|
|
237
|
-
return 10;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
return TEST_NESTED_FUNCTION()
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
function TEST_FUNCTION(){
|
|
244
|
-
var fn = TEST_FUNCTION_2;
|
|
245
|
-
return fn();
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
input(TEST_FUNCTION());
|
|
249
|
-
`;
|
|
250
|
-
|
|
251
|
-
var output = await JsConfuser(code, {
|
|
252
|
-
target: "browser",
|
|
253
|
-
dispatcher: true,
|
|
254
|
-
stack: true,
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
var value = "never_called";
|
|
258
|
-
function input(valueIn) {
|
|
259
|
-
value = valueIn;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
expect(output).not.toContain("function TEST_FUNCTION(");
|
|
263
|
-
eval(output);
|
|
264
|
-
|
|
265
|
-
expect(value).toStrictEqual(10);
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
it("should work with Control Flow Flattening", async () => {
|
|
269
|
-
var code = `
|
|
270
|
-
|
|
271
|
-
function TEST_FUNCTION_2(){
|
|
272
|
-
function TEST_NESTED_FUNCTION(){
|
|
273
|
-
return 10;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
return TEST_NESTED_FUNCTION()
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
function TEST_FUNCTION(){
|
|
280
|
-
var fn = TEST_FUNCTION_2;
|
|
281
|
-
return fn();
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
input(TEST_FUNCTION());
|
|
285
|
-
`;
|
|
286
|
-
|
|
287
|
-
var output = await JsConfuser(code, {
|
|
288
|
-
target: "browser",
|
|
289
|
-
dispatcher: true,
|
|
290
|
-
controlFlowFlattening: true,
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
var value = "never_called";
|
|
294
|
-
function input(valueIn) {
|
|
295
|
-
value = valueIn;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
expect(output).not.toContain("function TEST_FUNCTION(");
|
|
299
|
-
eval(output);
|
|
300
|
-
|
|
301
|
-
expect(value).toStrictEqual(10);
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
// https://github.com/MichaelXF/js-confuser/issues/26
|
|
305
|
-
it("should apply to every level of the code", async () => {
|
|
306
|
-
var code = `
|
|
307
|
-
function OUTER(){
|
|
308
|
-
function INNER(){
|
|
309
|
-
return 100;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
return INNER();
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
input(OUTER());
|
|
316
|
-
`;
|
|
317
|
-
|
|
318
|
-
var output = await JsConfuser(code, { target: "node", dispatcher: true });
|
|
319
|
-
|
|
320
|
-
expect(output).not.toContain("OUTER");
|
|
321
|
-
expect(output).not.toContain("INNER");
|
|
322
|
-
|
|
323
|
-
var value = "never_called";
|
|
324
|
-
function input(valueIn) {
|
|
325
|
-
value = valueIn;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
eval(output);
|
|
329
|
-
|
|
330
|
-
expect(value).toStrictEqual(100);
|
|
331
|
-
});
|
|
332
|
-
|
|
333
|
-
// https://github.com/MichaelXF/js-confuser/issues/77
|
|
334
|
-
it("should work with code that uses toString() function", async () => {
|
|
335
|
-
var output = await JsConfuser(
|
|
336
|
-
`
|
|
337
|
-
function myFunction(){
|
|
338
|
-
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
TEST_OUTPUT = toString();
|
|
342
|
-
`,
|
|
343
|
-
{
|
|
344
|
-
target: "node",
|
|
345
|
-
dispatcher: true,
|
|
346
|
-
}
|
|
347
|
-
);
|
|
348
|
-
|
|
349
|
-
var toString = () => "Correct Value";
|
|
350
|
-
var TEST_OUTPUT;
|
|
351
|
-
|
|
352
|
-
eval(output);
|
|
353
|
-
|
|
354
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
355
|
-
});
|
|
356
|
-
|
|
357
|
-
test("Variant #16: Don't change functions that use 'eval'", async () => {
|
|
358
|
-
var output = await JsConfuser(
|
|
359
|
-
`
|
|
360
|
-
function myEvalFunction(){
|
|
361
|
-
return eval("1+1");
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
TEST_OUTPUT = myEvalFunction();
|
|
365
|
-
`,
|
|
366
|
-
{ target: "node", dispatcher: true }
|
|
367
|
-
);
|
|
368
|
-
|
|
369
|
-
expect(output).not.toContain("dispatcher");
|
|
370
|
-
|
|
371
|
-
var TEST_OUTPUT;
|
|
372
|
-
eval(output);
|
|
373
|
-
|
|
374
|
-
expect(TEST_OUTPUT).toStrictEqual(2);
|
|
375
|
-
});
|
|
376
|
-
|
|
377
|
-
// https://github.com/MichaelXF/js-confuser/issues/103
|
|
378
|
-
test("Variant #17: Don't break default parameter, function expression", async () => {
|
|
379
|
-
var output = await JsConfuser(
|
|
380
|
-
`
|
|
381
|
-
var X = "Correct Value";
|
|
382
|
-
|
|
383
|
-
function printX(
|
|
384
|
-
getX = function () {
|
|
385
|
-
return X;
|
|
386
|
-
}
|
|
387
|
-
) {
|
|
388
|
-
var X = "Incorrect Value";
|
|
389
|
-
|
|
390
|
-
TEST_OUTPUT = getX();
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
printX();
|
|
394
|
-
`,
|
|
395
|
-
{ target: "node", dispatcher: true }
|
|
396
|
-
);
|
|
397
|
-
|
|
398
|
-
var TEST_OUTPUT;
|
|
399
|
-
eval(output);
|
|
400
|
-
|
|
401
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
402
|
-
});
|
|
403
|
-
|
|
404
|
-
test("Variant #18: Preserve function.length property", async () => {
|
|
405
|
-
var output = await JsConfuser(
|
|
406
|
-
`
|
|
407
|
-
function myFunction1(){
|
|
408
|
-
// Function.length = 0
|
|
409
|
-
}
|
|
410
|
-
function myFunction2(a, b, c, d = "") {
|
|
411
|
-
// Function.length = 3
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
myFunction1();
|
|
415
|
-
myFunction2();
|
|
416
|
-
TEST_OUTPUT_1 = myFunction1.length;
|
|
417
|
-
TEST_OUTPUT_2 = myFunction2.length;
|
|
418
|
-
|
|
419
|
-
`,
|
|
420
|
-
{ target: "node", dispatcher: true }
|
|
421
|
-
);
|
|
422
|
-
|
|
423
|
-
expect(output).toContain("dispatcher_0");
|
|
424
|
-
|
|
425
|
-
var TEST_OUTPUT_1, TEST_OUTPUT_2;
|
|
426
|
-
eval(output);
|
|
427
|
-
|
|
428
|
-
expect(TEST_OUTPUT_1).toStrictEqual(0);
|
|
429
|
-
expect(TEST_OUTPUT_2).toStrictEqual(3);
|
|
430
|
-
});
|
|
431
|
-
|
|
432
|
-
test("Variant #19: Lexically bound variables", async () => {
|
|
433
|
-
var output = await JsConfuser(
|
|
434
|
-
`
|
|
435
|
-
switch (true) {
|
|
436
|
-
case true:
|
|
437
|
-
let message = "Hello World";
|
|
438
|
-
|
|
439
|
-
function logMessage() {
|
|
440
|
-
TEST_OUTPUT = message;
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
logMessage();
|
|
444
|
-
}
|
|
445
|
-
`,
|
|
446
|
-
{
|
|
447
|
-
target: "node",
|
|
448
|
-
dispatcher: true,
|
|
449
|
-
}
|
|
450
|
-
);
|
|
451
|
-
|
|
452
|
-
var TEST_OUTPUT;
|
|
453
|
-
|
|
454
|
-
eval(output);
|
|
455
|
-
|
|
456
|
-
expect(TEST_OUTPUT).toStrictEqual("Hello World");
|
|
457
|
-
});
|