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,135 +0,0 @@
|
|
|
1
|
-
import JsConfuser from "../../src/index";
|
|
2
|
-
|
|
3
|
-
it("should result in the same order", async () => {
|
|
4
|
-
var code = `
|
|
5
|
-
var TEST_ARRAY = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
|
6
|
-
|
|
7
|
-
input(TEST_ARRAY);
|
|
8
|
-
`;
|
|
9
|
-
|
|
10
|
-
var output = await JsConfuser(code, {
|
|
11
|
-
target: "browser",
|
|
12
|
-
shuffle: true,
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
var value;
|
|
16
|
-
function input(valueIn) {
|
|
17
|
-
value = valueIn;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
eval(output);
|
|
21
|
-
|
|
22
|
-
expect(value).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
|
23
|
-
});
|
|
24
|
-
it("should properly shuffle arrays within expressions", async () => {
|
|
25
|
-
var code = `
|
|
26
|
-
input([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
|
27
|
-
`;
|
|
28
|
-
|
|
29
|
-
var output = await JsConfuser(code, {
|
|
30
|
-
target: "browser",
|
|
31
|
-
shuffle: true,
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
var value;
|
|
35
|
-
function input(valueIn) {
|
|
36
|
-
value = valueIn;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
eval(output);
|
|
40
|
-
|
|
41
|
-
expect(value).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it("should shuffle arrays based on hash and unshuffle correctly", async () => {
|
|
45
|
-
var code = `input([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);`;
|
|
46
|
-
|
|
47
|
-
for (var i = 0; i < 20; i++) {
|
|
48
|
-
var output = await JsConfuser(code, {
|
|
49
|
-
target: "node",
|
|
50
|
-
shuffle: "hash",
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
var value;
|
|
54
|
-
function input(valueIn) {
|
|
55
|
-
value = valueIn;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
eval(output);
|
|
59
|
-
|
|
60
|
-
expect(value).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it("should shuffle arrays based on hash and unshuffle incorrect if changed", async () => {
|
|
65
|
-
var code = `input([1, 2, 3, 4, 5]);`;
|
|
66
|
-
|
|
67
|
-
var different = false;
|
|
68
|
-
for (var i = 0; i < 20; i++) {
|
|
69
|
-
var output = await JsConfuser(code, {
|
|
70
|
-
target: "node",
|
|
71
|
-
shuffle: "hash",
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
output =
|
|
75
|
-
output.split("[")[0] + "[" + output.split("[")[1].replace("5", "6");
|
|
76
|
-
|
|
77
|
-
var value;
|
|
78
|
-
function input(valueIn) {
|
|
79
|
-
value = valueIn;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
eval(output);
|
|
83
|
-
expect(value).toHaveLength(5);
|
|
84
|
-
expect(typeof value[0] === "number").toStrictEqual(true);
|
|
85
|
-
if (value[0] !== 1) {
|
|
86
|
-
different = true;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
expect(different).toStrictEqual(true);
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
// https://github.com/MichaelXF/js-confuser/issues/48
|
|
94
|
-
it("Should properly apply to const variables", async () => {
|
|
95
|
-
var code = `
|
|
96
|
-
const TEST_ARRAY = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
|
97
|
-
|
|
98
|
-
input(TEST_ARRAY);
|
|
99
|
-
`;
|
|
100
|
-
|
|
101
|
-
var output = await JsConfuser(code, {
|
|
102
|
-
target: "browser",
|
|
103
|
-
shuffle: true,
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
expect(output).toContain("TEST_ARRAY=function");
|
|
107
|
-
|
|
108
|
-
var value;
|
|
109
|
-
function input(valueIn) {
|
|
110
|
-
value = valueIn;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
eval(output);
|
|
114
|
-
|
|
115
|
-
expect(value).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
// https://github.com/MichaelXF/js-confuser/issues/53
|
|
119
|
-
it("Should not use common variable names like x", async () => {
|
|
120
|
-
var code = `
|
|
121
|
-
let x = -999;
|
|
122
|
-
let a = [1, 2, 3, 4, 5, 6];
|
|
123
|
-
|
|
124
|
-
VALUE = a;
|
|
125
|
-
`;
|
|
126
|
-
|
|
127
|
-
var output = await JsConfuser(code, {
|
|
128
|
-
target: "browser",
|
|
129
|
-
shuffle: true,
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
var VALUE;
|
|
133
|
-
eval(output);
|
|
134
|
-
expect(VALUE).toEqual([1, 2, 3, 4, 5, 6]);
|
|
135
|
-
});
|
|
@@ -1,573 +0,0 @@
|
|
|
1
|
-
import JsConfuser from "../../src/index";
|
|
2
|
-
|
|
3
|
-
test("Variant #1: Replace all variables with array indexes (single variable)", async () => {
|
|
4
|
-
var output = await JsConfuser(
|
|
5
|
-
`
|
|
6
|
-
function TEST_FUNCTION(){
|
|
7
|
-
var TEST_VARIABLE = 1;
|
|
8
|
-
|
|
9
|
-
input(TEST_VARIABLE)
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
TEST_FUNCTION()
|
|
13
|
-
`,
|
|
14
|
-
{
|
|
15
|
-
target: "node",
|
|
16
|
-
stack: true,
|
|
17
|
-
}
|
|
18
|
-
);
|
|
19
|
-
|
|
20
|
-
expect(output).not.toContain("TEST_VARIABLE");
|
|
21
|
-
|
|
22
|
-
var value = "never_called",
|
|
23
|
-
input = (x) => (value = x);
|
|
24
|
-
|
|
25
|
-
eval(output);
|
|
26
|
-
expect(value).toStrictEqual(1);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
test("Variant #2: Replace all variables with array indexes (multiple variables)", async () => {
|
|
30
|
-
var output = await JsConfuser(
|
|
31
|
-
`
|
|
32
|
-
function TEST_FUNCTION(){
|
|
33
|
-
var TEST_VARIABLE_1 = 5;
|
|
34
|
-
var TEST_VARIABLE_2 = 10;
|
|
35
|
-
|
|
36
|
-
input(TEST_VARIABLE_1 + TEST_VARIABLE_2)
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
TEST_FUNCTION()
|
|
40
|
-
`,
|
|
41
|
-
{
|
|
42
|
-
target: "node",
|
|
43
|
-
stack: true,
|
|
44
|
-
}
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
expect(output).not.toContain("TEST_VARIABLE");
|
|
48
|
-
|
|
49
|
-
var value = "never_called",
|
|
50
|
-
input = (x) => (value = x);
|
|
51
|
-
|
|
52
|
-
eval(output);
|
|
53
|
-
expect(value).toStrictEqual(15);
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
test("Variant #3: Replace all variables with array indexes (uninitialized variable are made undefined)", async () => {
|
|
57
|
-
var output = await JsConfuser(
|
|
58
|
-
`
|
|
59
|
-
function TEST_FUNCTION(){
|
|
60
|
-
var TEST_VARIABLE;
|
|
61
|
-
|
|
62
|
-
input(TEST_VARIABLE)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
TEST_FUNCTION()
|
|
66
|
-
`,
|
|
67
|
-
{
|
|
68
|
-
target: "node",
|
|
69
|
-
stack: true,
|
|
70
|
-
}
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
expect(output).not.toContain("TEST_VARIABLE");
|
|
74
|
-
|
|
75
|
-
var value = "never_called",
|
|
76
|
-
input = (x) => (value = x);
|
|
77
|
-
|
|
78
|
-
eval(output);
|
|
79
|
-
expect(value).toStrictEqual(undefined);
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
test("Variant #4: Replace all variables with array indexes (parameters)", async () => {
|
|
83
|
-
var output = await JsConfuser(
|
|
84
|
-
`
|
|
85
|
-
function TEST_FUNCTION(TEST_VARIABLE_1, TEST_VARIABLE_2){
|
|
86
|
-
|
|
87
|
-
input(TEST_VARIABLE_1 + TEST_VARIABLE_2)
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
TEST_FUNCTION(50, 25)
|
|
91
|
-
`,
|
|
92
|
-
{
|
|
93
|
-
target: "node",
|
|
94
|
-
stack: true,
|
|
95
|
-
}
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
expect(output).not.toContain("TEST_VARIABLE");
|
|
99
|
-
expect(output).toContain("...");
|
|
100
|
-
|
|
101
|
-
var value = "never_called",
|
|
102
|
-
input = (x) => (value = x);
|
|
103
|
-
|
|
104
|
-
eval(output);
|
|
105
|
-
expect(value).toStrictEqual(75);
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
test("Variant #5: Replace all variables with array indexes (nested function)", async () => {
|
|
109
|
-
var output = await JsConfuser(
|
|
110
|
-
`
|
|
111
|
-
function TEST_FUNCTION(){
|
|
112
|
-
|
|
113
|
-
var answer = TEST_NESTED_FUNCTION();
|
|
114
|
-
input(answer)
|
|
115
|
-
function TEST_NESTED_FUNCTION(){
|
|
116
|
-
return 65;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
TEST_FUNCTION()
|
|
121
|
-
`,
|
|
122
|
-
{
|
|
123
|
-
target: "node",
|
|
124
|
-
stack: true,
|
|
125
|
-
}
|
|
126
|
-
);
|
|
127
|
-
|
|
128
|
-
expect(output).toContain("TEST_NESTED_FUNCTION");
|
|
129
|
-
expect(output).toContain("...");
|
|
130
|
-
|
|
131
|
-
var value = "never_called",
|
|
132
|
-
input = (x) => (value = x);
|
|
133
|
-
|
|
134
|
-
eval(output);
|
|
135
|
-
expect(value).toStrictEqual(65);
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
test("Variant #6: Replace all variables with array indexes (nested class)", async () => {
|
|
139
|
-
var output = await JsConfuser(
|
|
140
|
-
`
|
|
141
|
-
function TEST_FUNCTION(){
|
|
142
|
-
|
|
143
|
-
class TEST_CLASS {
|
|
144
|
-
constructor(){
|
|
145
|
-
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
getValue(){
|
|
149
|
-
return "Value"
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
var instance = new TEST_CLASS();
|
|
154
|
-
input(instance.getValue());
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
TEST_FUNCTION()
|
|
158
|
-
`,
|
|
159
|
-
{
|
|
160
|
-
target: "node",
|
|
161
|
-
stack: true,
|
|
162
|
-
}
|
|
163
|
-
);
|
|
164
|
-
|
|
165
|
-
expect(output).toContain("TEST_CLASS");
|
|
166
|
-
expect(output).toContain("class");
|
|
167
|
-
expect(output).toContain("...");
|
|
168
|
-
|
|
169
|
-
var value = "never_called",
|
|
170
|
-
input = (x) => (value = x);
|
|
171
|
-
|
|
172
|
-
eval(output);
|
|
173
|
-
expect(value).toStrictEqual("Value");
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
test("Variant #7: Replace variables defined within the function, and not run if any changes can be made", async () => {
|
|
177
|
-
var output = await JsConfuser(
|
|
178
|
-
`
|
|
179
|
-
var TEST_VARIABLE = 0;
|
|
180
|
-
function TEST_FUNCTION(){
|
|
181
|
-
|
|
182
|
-
TEST_VARIABLE;
|
|
183
|
-
}
|
|
184
|
-
`,
|
|
185
|
-
{
|
|
186
|
-
target: "node",
|
|
187
|
-
stack: true,
|
|
188
|
-
}
|
|
189
|
-
);
|
|
190
|
-
|
|
191
|
-
expect(output).toContain("TEST_VARIABLE");
|
|
192
|
-
expect(output).not.toContain("...");
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
test("Variant #8: Work even when differing amount of arguments passed in", async () => {
|
|
196
|
-
var output = await JsConfuser(
|
|
197
|
-
`
|
|
198
|
-
function add3(var_x, var_y, var_z){
|
|
199
|
-
return var_x + var_y;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
input(add3(10, 15), add3(10, 15, 30))
|
|
203
|
-
`,
|
|
204
|
-
{
|
|
205
|
-
target: "node",
|
|
206
|
-
stack: true,
|
|
207
|
-
}
|
|
208
|
-
);
|
|
209
|
-
|
|
210
|
-
expect(output).not.toContain("var_x");
|
|
211
|
-
|
|
212
|
-
var value = "never_called",
|
|
213
|
-
input = (x) => (value = x);
|
|
214
|
-
|
|
215
|
-
eval(output);
|
|
216
|
-
expect(value).toStrictEqual(25);
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
test("Variant #9: Replace all variables with array indexes (middle indexes use array[index] syntax)", async () => {
|
|
220
|
-
var output = await JsConfuser(
|
|
221
|
-
`
|
|
222
|
-
function TEST_FUNCTION(){
|
|
223
|
-
var TEST_VARIABLE_1 = 1;
|
|
224
|
-
var TEST_VARIABLE_2 = 2;
|
|
225
|
-
var TEST_VARIABLE_3 = 3;
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
TEST_VARIABLE_2 = "Updated";
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
input(TEST_VARIABLE_2)
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
TEST_FUNCTION()
|
|
235
|
-
`,
|
|
236
|
-
{
|
|
237
|
-
target: "node",
|
|
238
|
-
stack: true,
|
|
239
|
-
}
|
|
240
|
-
);
|
|
241
|
-
|
|
242
|
-
expect(output).not.toContain("TEST_VARIABLE");
|
|
243
|
-
expect(output).toContain("]='Updated'");
|
|
244
|
-
|
|
245
|
-
var value = "never_called",
|
|
246
|
-
input = (x) => (value = x);
|
|
247
|
-
|
|
248
|
-
eval(output);
|
|
249
|
-
expect(value).toStrictEqual("Updated");
|
|
250
|
-
});
|
|
251
|
-
|
|
252
|
-
test("Variant #10: Guess execution order correctly (CallExpression, arguments run before callee)", async () => {
|
|
253
|
-
var output = await JsConfuser(
|
|
254
|
-
`
|
|
255
|
-
function TEST_FUNCTION(a,b){
|
|
256
|
-
var TEST_NESTED_FUNCTION = (x,y)=>{
|
|
257
|
-
input(x + y)
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
TEST_NESTED_FUNCTION(a,b)
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
TEST_FUNCTION(10, 15)
|
|
264
|
-
`,
|
|
265
|
-
{
|
|
266
|
-
target: "node",
|
|
267
|
-
stack: true,
|
|
268
|
-
}
|
|
269
|
-
);
|
|
270
|
-
|
|
271
|
-
expect(output).not.toContain("TEST_NESTED_FUNCTION");
|
|
272
|
-
|
|
273
|
-
var value = "never_called",
|
|
274
|
-
input = (x) => (value = x);
|
|
275
|
-
|
|
276
|
-
eval(output);
|
|
277
|
-
expect(value).toStrictEqual(25);
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
test("Variant #11: Guess execution order correctly (AssignmentExpression, right side executes first)", async () => {
|
|
281
|
-
var output = await JsConfuser(
|
|
282
|
-
`
|
|
283
|
-
function TEST_FUNCTION(a,b){
|
|
284
|
-
|
|
285
|
-
var _C;
|
|
286
|
-
_C = a + b;
|
|
287
|
-
input(_C)
|
|
288
|
-
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
TEST_FUNCTION(10, 15)
|
|
292
|
-
`,
|
|
293
|
-
{
|
|
294
|
-
target: "node",
|
|
295
|
-
stack: true,
|
|
296
|
-
}
|
|
297
|
-
);
|
|
298
|
-
|
|
299
|
-
expect(output).not.toContain("_C=");
|
|
300
|
-
|
|
301
|
-
var value = "never_called",
|
|
302
|
-
input = (x) => (value = x);
|
|
303
|
-
|
|
304
|
-
eval(output);
|
|
305
|
-
expect(value).toStrictEqual(25);
|
|
306
|
-
});
|
|
307
|
-
|
|
308
|
-
test("Variant #12: Should not entangle floats or NaN", async () => {
|
|
309
|
-
var output = await JsConfuser(
|
|
310
|
-
`
|
|
311
|
-
function TEST_FUNCTION(){
|
|
312
|
-
|
|
313
|
-
var a = NaN;
|
|
314
|
-
input(10.01 + 15.01)
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
TEST_FUNCTION()
|
|
318
|
-
`,
|
|
319
|
-
{
|
|
320
|
-
target: "node",
|
|
321
|
-
stack: true,
|
|
322
|
-
}
|
|
323
|
-
);
|
|
324
|
-
|
|
325
|
-
expect(output).toContain("10.01");
|
|
326
|
-
expect(output).toContain("15.01");
|
|
327
|
-
expect(output).toContain("NaN");
|
|
328
|
-
|
|
329
|
-
var value = "never_called";
|
|
330
|
-
function input(valueIn) {
|
|
331
|
-
value = valueIn;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
eval(output);
|
|
335
|
-
expect(value).toStrictEqual(25.02);
|
|
336
|
-
});
|
|
337
|
-
|
|
338
|
-
test("Variant #13: Correctly entangle property keys", async () => {
|
|
339
|
-
var output = await JsConfuser(
|
|
340
|
-
`
|
|
341
|
-
function TEST_FUNCTION(){
|
|
342
|
-
|
|
343
|
-
// filler expressions
|
|
344
|
-
var var1 = 0;
|
|
345
|
-
var var2 = 0;
|
|
346
|
-
var var3 = 0;
|
|
347
|
-
var var4 = 0;
|
|
348
|
-
var var5 = 0;
|
|
349
|
-
|
|
350
|
-
var obj = {
|
|
351
|
-
10: 10,
|
|
352
|
-
9: 9,
|
|
353
|
-
8: 8,
|
|
354
|
-
7: 7,
|
|
355
|
-
6: 6,
|
|
356
|
-
5: 5,
|
|
357
|
-
4: 4,
|
|
358
|
-
3: 3,
|
|
359
|
-
2: 2,
|
|
360
|
-
1: 1,
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
var ten = obj["5"] + obj["3"] + obj["2"];
|
|
364
|
-
|
|
365
|
-
input(ten);
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
TEST_FUNCTION()
|
|
369
|
-
`,
|
|
370
|
-
{
|
|
371
|
-
target: "node",
|
|
372
|
-
stack: true,
|
|
373
|
-
}
|
|
374
|
-
);
|
|
375
|
-
|
|
376
|
-
var value = "never_called";
|
|
377
|
-
function input(valueIn) {
|
|
378
|
-
value = valueIn;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
eval(output);
|
|
382
|
-
expect(value).toStrictEqual(10);
|
|
383
|
-
});
|
|
384
|
-
|
|
385
|
-
test("Variant #14: Correctly entangle method definition keys", async () => {
|
|
386
|
-
var output = await JsConfuser(
|
|
387
|
-
`
|
|
388
|
-
function TEST_FUNCTION(){
|
|
389
|
-
|
|
390
|
-
// filler expressions
|
|
391
|
-
var var1 = 0;
|
|
392
|
-
var var2 = 0;
|
|
393
|
-
var var3 = 0;
|
|
394
|
-
var var4 = 0;
|
|
395
|
-
var var5 = 0;
|
|
396
|
-
|
|
397
|
-
class TEST_CLASS {
|
|
398
|
-
10(){
|
|
399
|
-
return 10;
|
|
400
|
-
}
|
|
401
|
-
9(){
|
|
402
|
-
return 9;
|
|
403
|
-
}
|
|
404
|
-
8(){
|
|
405
|
-
return 8;
|
|
406
|
-
}
|
|
407
|
-
7(){
|
|
408
|
-
return 7;
|
|
409
|
-
}
|
|
410
|
-
6(){
|
|
411
|
-
return 6;
|
|
412
|
-
}
|
|
413
|
-
5(){
|
|
414
|
-
return 5;
|
|
415
|
-
}
|
|
416
|
-
4(){
|
|
417
|
-
return 4;
|
|
418
|
-
}
|
|
419
|
-
3(){
|
|
420
|
-
return 3;
|
|
421
|
-
}
|
|
422
|
-
2(){
|
|
423
|
-
return 2;
|
|
424
|
-
}
|
|
425
|
-
1(){
|
|
426
|
-
return 2;
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
var obj = new TEST_CLASS();
|
|
431
|
-
var ten = obj["5"]() + obj["3"]() + obj["2"]();
|
|
432
|
-
|
|
433
|
-
input(ten)
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
TEST_FUNCTION()
|
|
437
|
-
`,
|
|
438
|
-
{
|
|
439
|
-
target: "node",
|
|
440
|
-
stack: true,
|
|
441
|
-
}
|
|
442
|
-
);
|
|
443
|
-
|
|
444
|
-
var value = "never_called";
|
|
445
|
-
function input(valueIn) {
|
|
446
|
-
value = valueIn;
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
eval(output);
|
|
450
|
-
expect(value).toStrictEqual(10);
|
|
451
|
-
});
|
|
452
|
-
|
|
453
|
-
test("Variant #15: Function with 'use strict' directive", async () => {
|
|
454
|
-
var output = await JsConfuser(
|
|
455
|
-
`
|
|
456
|
-
function useStrictFunction(){
|
|
457
|
-
'use strict';
|
|
458
|
-
|
|
459
|
-
function fun(){
|
|
460
|
-
return this;
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
var necessaryDeclarationForStackToApply;
|
|
464
|
-
|
|
465
|
-
TEST_OUTPUT = fun() === undefined; // true
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
useStrictFunction();
|
|
469
|
-
`,
|
|
470
|
-
{ target: "node", stack: true }
|
|
471
|
-
);
|
|
472
|
-
|
|
473
|
-
// Stack will not apply to functions with 'use strict' directive
|
|
474
|
-
expect(output).not.toContain("_stack");
|
|
475
|
-
|
|
476
|
-
var TEST_OUTPUT;
|
|
477
|
-
eval(output);
|
|
478
|
-
|
|
479
|
-
expect(TEST_OUTPUT).toStrictEqual(true);
|
|
480
|
-
});
|
|
481
|
-
|
|
482
|
-
test("Variant #16: Function with 'this'", async () => {
|
|
483
|
-
var output = await JsConfuser(
|
|
484
|
-
`
|
|
485
|
-
'use strict';
|
|
486
|
-
function stackFunction(){
|
|
487
|
-
var necessaryDeclarationForStackToApply;
|
|
488
|
-
|
|
489
|
-
function thisFunctionDeclaration(){
|
|
490
|
-
return this;
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
var thisFunctionExpression1 = function(){
|
|
494
|
-
return this;
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
var thisFunctionExpression2;
|
|
498
|
-
|
|
499
|
-
thisFunctionExpression2 = function(){
|
|
500
|
-
return this;
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
return thisFunctionDeclaration() || thisFunctionExpression1() || thisFunctionExpression2();
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
TEST_OUTPUT = stackFunction() === undefined;
|
|
507
|
-
`,
|
|
508
|
-
{ target: "node", stack: true }
|
|
509
|
-
);
|
|
510
|
-
|
|
511
|
-
// Ensure stack applied
|
|
512
|
-
expect(output).toContain("_stack");
|
|
513
|
-
|
|
514
|
-
// Ensure 'thisFunction' was not changed by stack due to using 'this' keyword
|
|
515
|
-
expect(output).toContain("function thisFunction");
|
|
516
|
-
|
|
517
|
-
var TEST_OUTPUT;
|
|
518
|
-
eval(output);
|
|
519
|
-
|
|
520
|
-
expect(TEST_OUTPUT).toStrictEqual(true);
|
|
521
|
-
});
|
|
522
|
-
|
|
523
|
-
// https://github.com/MichaelXF/js-confuser/issues/88
|
|
524
|
-
test("Variant #17: Syncing arguments parameter", async () => {
|
|
525
|
-
var output = await JsConfuser(
|
|
526
|
-
`
|
|
527
|
-
var TEST_OUTPUT;
|
|
528
|
-
|
|
529
|
-
function syncingArguments(parameter) {
|
|
530
|
-
arguments[0] = "Correct Value";
|
|
531
|
-
TEST_OUTPUT = parameter;
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
syncingArguments("Incorrect Value");
|
|
535
|
-
`,
|
|
536
|
-
{ target: "node", stack: true }
|
|
537
|
-
);
|
|
538
|
-
|
|
539
|
-
function evalNoStrictMode(evalCode) {
|
|
540
|
-
var fn = new Function(evalCode + ";return TEST_OUTPUT");
|
|
541
|
-
return fn();
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
var TEST_OUTPUT = evalNoStrictMode(output);
|
|
545
|
-
|
|
546
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
547
|
-
});
|
|
548
|
-
|
|
549
|
-
test("Variant #18: Preserve function.length property", async () => {
|
|
550
|
-
var output = await JsConfuser(
|
|
551
|
-
`
|
|
552
|
-
function oneParameter(a){
|
|
553
|
-
var _ = 1;
|
|
554
|
-
};
|
|
555
|
-
var twoParameters = function(a,b){
|
|
556
|
-
var _ = 1;
|
|
557
|
-
};
|
|
558
|
-
var myObject = {
|
|
559
|
-
threeParameters(a,b,c){
|
|
560
|
-
var _ = 1;
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
TEST_OUTPUT = oneParameter.length + twoParameters.length + myObject.threeParameters.length;
|
|
565
|
-
`,
|
|
566
|
-
{ target: "node", stack: true }
|
|
567
|
-
);
|
|
568
|
-
|
|
569
|
-
var TEST_OUTPUT;
|
|
570
|
-
eval(output);
|
|
571
|
-
|
|
572
|
-
expect(TEST_OUTPUT).toStrictEqual(6);
|
|
573
|
-
});
|