js-confuser 1.5.9 → 1.7.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/workflows/node.js.yml +2 -2
- package/CHANGELOG.md +55 -0
- package/README.md +346 -165
- package/dist/constants.js +6 -2
- package/dist/index.js +9 -21
- package/dist/obfuscator.js +19 -31
- package/dist/options.js +5 -5
- package/dist/order.js +1 -3
- package/dist/presets.js +6 -7
- package/dist/probability.js +2 -4
- package/dist/templates/bufferToString.js +13 -0
- package/dist/templates/crash.js +3 -3
- package/dist/templates/es5.js +18 -0
- package/dist/templates/functionLength.js +16 -0
- package/dist/transforms/calculator.js +77 -21
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +980 -367
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +4 -1
- package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +25 -26
- package/dist/transforms/deadCode.js +33 -25
- package/dist/transforms/dispatcher.js +8 -4
- package/dist/transforms/es5/antiDestructuring.js +2 -0
- package/dist/transforms/es5/es5.js +31 -34
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +92 -58
- package/dist/transforms/finalizer.js +82 -0
- package/dist/transforms/flatten.js +229 -148
- package/dist/transforms/identifier/globalAnalysis.js +88 -0
- package/dist/transforms/identifier/globalConcealing.js +10 -83
- package/dist/transforms/identifier/movedDeclarations.js +35 -88
- package/dist/transforms/identifier/renameVariables.js +124 -59
- package/dist/transforms/identifier/variableAnalysis.js +58 -62
- package/dist/transforms/lock/lock.js +0 -37
- package/dist/transforms/minify.js +60 -57
- package/dist/transforms/opaquePredicates.js +1 -1
- package/dist/transforms/preparation/preparation.js +2 -2
- package/dist/transforms/preparation.js +231 -0
- package/dist/transforms/renameLabels.js +1 -1
- package/dist/transforms/rgf.js +139 -247
- package/dist/transforms/stack.js +128 -26
- package/dist/transforms/string/encoding.js +150 -179
- package/dist/transforms/string/stringCompression.js +14 -15
- package/dist/transforms/string/stringConcealing.js +25 -8
- package/dist/transforms/string/stringEncoding.js +13 -24
- package/dist/transforms/transform.js +12 -19
- package/dist/traverse.js +24 -10
- package/dist/util/gen.js +17 -1
- package/dist/util/identifiers.js +37 -3
- package/dist/util/insert.js +35 -4
- package/dist/util/random.js +15 -0
- package/docs/ControlFlowFlattening.md +595 -0
- package/{Countermeasures.md → docs/Countermeasures.md} +1 -15
- package/{Integrity.md → docs/Integrity.md} +2 -2
- package/docs/RGF.md +419 -0
- package/package.json +5 -5
- package/src/constants.ts +3 -0
- package/src/index.ts +2 -2
- package/src/obfuscator.ts +19 -31
- package/src/options.ts +14 -103
- package/src/order.ts +1 -5
- package/src/presets.ts +6 -7
- package/src/probability.ts +2 -3
- package/src/templates/bufferToString.ts +68 -0
- package/src/templates/crash.ts +15 -19
- package/src/templates/es5.ts +131 -0
- package/src/templates/functionLength.ts +14 -0
- package/src/transforms/calculator.ts +122 -59
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +1583 -571
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +4 -1
- package/src/transforms/deadCode.ts +383 -26
- package/src/transforms/dispatcher.ts +9 -4
- package/src/transforms/es5/antiDestructuring.ts +2 -0
- package/src/transforms/es5/es5.ts +32 -77
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +133 -129
- package/src/transforms/{hexadecimalNumbers.ts → finalizer.ts} +29 -13
- package/src/transforms/flatten.ts +357 -300
- package/src/transforms/identifier/globalAnalysis.ts +85 -0
- package/src/transforms/identifier/globalConcealing.ts +14 -103
- package/src/transforms/identifier/movedDeclarations.ts +49 -102
- package/src/transforms/identifier/renameVariables.ts +149 -78
- package/src/transforms/identifier/variableAnalysis.ts +66 -73
- package/src/transforms/lock/lock.ts +1 -42
- package/src/transforms/minify.ts +91 -75
- package/src/transforms/opaquePredicates.ts +2 -2
- package/src/transforms/preparation.ts +238 -0
- package/src/transforms/renameLabels.ts +2 -2
- package/src/transforms/rgf.ts +213 -405
- package/src/transforms/stack.ts +156 -36
- package/src/transforms/string/encoding.ts +115 -212
- package/src/transforms/string/stringCompression.ts +27 -18
- package/src/transforms/string/stringConcealing.ts +39 -9
- package/src/transforms/string/stringEncoding.ts +18 -18
- package/src/transforms/transform.ts +21 -23
- package/src/traverse.ts +23 -4
- package/src/types.ts +2 -1
- package/src/util/gen.ts +28 -3
- package/src/util/identifiers.ts +43 -2
- package/src/util/insert.ts +38 -3
- package/src/util/random.ts +13 -0
- package/test/code/Cash.test.ts +1 -1
- package/test/code/Dynamic.test.ts +12 -10
- package/test/code/ES6.src.js +146 -0
- package/test/code/ES6.test.ts +28 -2
- package/test/index.test.ts +2 -1
- package/test/probability.test.ts +44 -0
- package/test/templates/template.test.ts +1 -1
- package/test/transforms/antiTooling.test.ts +22 -0
- package/test/transforms/calculator.test.ts +40 -0
- package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +702 -160
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +173 -0
- package/test/transforms/deadCode.test.ts +66 -15
- package/test/transforms/dispatcher.test.ts +20 -1
- package/test/transforms/es5/antiDestructuring.test.ts +16 -0
- package/test/transforms/flatten.test.ts +399 -86
- package/test/transforms/identifier/movedDeclarations.test.ts +63 -8
- package/test/transforms/identifier/renameVariables.test.ts +119 -0
- package/test/transforms/lock/antiDebug.test.ts +2 -2
- package/test/transforms/lock/lock.test.ts +1 -48
- package/test/transforms/minify.test.ts +104 -0
- package/test/transforms/preparation.test.ts +157 -0
- package/test/transforms/rgf.test.ts +261 -381
- package/test/transforms/stack.test.ts +143 -21
- package/test/transforms/string/stringCompression.test.ts +39 -0
- package/test/transforms/string/stringConcealing.test.ts +82 -0
- package/test/transforms/string/stringEncoding.test.ts +53 -2
- package/test/transforms/transform.test.ts +66 -0
- package/test/traverse.test.ts +139 -0
- package/test/util/identifiers.test.ts +113 -1
- package/test/util/insert.test.ts +57 -3
- package/src/transforms/controlFlowFlattening/choiceFlowObfuscation.ts +0 -87
- package/src/transforms/controlFlowFlattening/controlFlowObfuscation.ts +0 -203
- package/src/transforms/controlFlowFlattening/switchCaseObfuscation.ts +0 -130
- package/src/transforms/eval.ts +0 -89
- package/src/transforms/hideInitializingCode.ts +0 -432
- package/src/transforms/identifier/nameRecycling.ts +0 -280
- package/src/transforms/label.ts +0 -64
- package/src/transforms/preparation/nameConflicts.ts +0 -102
- package/src/transforms/preparation/preparation.ts +0 -176
- package/test/transforms/controlFlowFlattening/controlFlowObfuscation.test.ts +0 -101
- package/test/transforms/controlFlowFlattening/switchCaseObfuscation.test.ts +0 -120
- package/test/transforms/eval.test.ts +0 -131
- package/test/transforms/hideInitializingCode.test.ts +0 -336
- package/test/transforms/identifier/nameRecycling.test.ts +0 -205
- package/test/transforms/preparation/nameConflicts.test.ts +0 -52
- package/test/transforms/preparation/preparation.test.ts +0 -62
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import JsConfuser from "../../../src/index";
|
|
2
|
+
|
|
3
|
+
test("Variant #1: Join expressions in a sequence expression", async () => {
|
|
4
|
+
var output = await JsConfuser(
|
|
5
|
+
`
|
|
6
|
+
TEST_OUTPUT=0;
|
|
7
|
+
TEST_OUTPUT++;
|
|
8
|
+
`,
|
|
9
|
+
{ target: "node", controlFlowFlattening: true }
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
expect(output).toContain("(TEST_OUTPUT=0,TEST_OUTPUT++");
|
|
13
|
+
|
|
14
|
+
var TEST_OUTPUT;
|
|
15
|
+
eval(output);
|
|
16
|
+
|
|
17
|
+
expect(TEST_OUTPUT).toStrictEqual(1);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test("Variant #2: If Statement", async () => {
|
|
21
|
+
var output = await JsConfuser(
|
|
22
|
+
`
|
|
23
|
+
TEST_OUTPUT=0;
|
|
24
|
+
if(true){
|
|
25
|
+
TEST_OUTPUT++;
|
|
26
|
+
}
|
|
27
|
+
`,
|
|
28
|
+
{ target: "node", controlFlowFlattening: true }
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
expect(output).toContain("if(TEST_OUTPUT=0,true)");
|
|
32
|
+
|
|
33
|
+
var TEST_OUTPUT;
|
|
34
|
+
eval(output);
|
|
35
|
+
|
|
36
|
+
expect(TEST_OUTPUT).toStrictEqual(1);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("Variant #3: ForStatement (Variable Declaration initializer)", async () => {
|
|
40
|
+
var output = await JsConfuser(
|
|
41
|
+
`
|
|
42
|
+
TEST_OUTPUT=0;
|
|
43
|
+
for(var i =0; i < 10; i++){
|
|
44
|
+
TEST_OUTPUT++;
|
|
45
|
+
}
|
|
46
|
+
`,
|
|
47
|
+
{ target: "node", controlFlowFlattening: true }
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
expect(output).toContain("for(var i=(TEST_OUTPUT=0,0)");
|
|
51
|
+
|
|
52
|
+
var TEST_OUTPUT;
|
|
53
|
+
eval(output);
|
|
54
|
+
|
|
55
|
+
expect(TEST_OUTPUT).toStrictEqual(10);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test("Variant #4: ForStatement (Assignment expression initializer)", async () => {
|
|
59
|
+
var output = await JsConfuser(
|
|
60
|
+
`
|
|
61
|
+
TEST_OUTPUT=0;
|
|
62
|
+
for(i = 0; i < 10; i++){
|
|
63
|
+
TEST_OUTPUT++;
|
|
64
|
+
}
|
|
65
|
+
`,
|
|
66
|
+
{ target: "node", controlFlowFlattening: true }
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
expect(output).toContain("for(i=(TEST_OUTPUT=0,0)");
|
|
70
|
+
|
|
71
|
+
var TEST_OUTPUT, i;
|
|
72
|
+
eval(output);
|
|
73
|
+
|
|
74
|
+
expect(TEST_OUTPUT).toStrictEqual(10);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("Variant #5: Return statement", async () => {
|
|
78
|
+
var output = await JsConfuser(
|
|
79
|
+
`
|
|
80
|
+
function fn(){
|
|
81
|
+
TEST_OUTPUT = 10;
|
|
82
|
+
return "Value";
|
|
83
|
+
}
|
|
84
|
+
fn();
|
|
85
|
+
`,
|
|
86
|
+
{ target: "node", controlFlowFlattening: true }
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
expect(output).toContain("return TEST_OUTPUT=10,'Value'}");
|
|
90
|
+
|
|
91
|
+
var TEST_OUTPUT;
|
|
92
|
+
eval(output);
|
|
93
|
+
|
|
94
|
+
expect(TEST_OUTPUT).toStrictEqual(10);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test("Variant #6: Return statement (no argument)", async () => {
|
|
98
|
+
var output = await JsConfuser(
|
|
99
|
+
`
|
|
100
|
+
function fn(){
|
|
101
|
+
TEST_OUTPUT = 10;
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
fn();
|
|
105
|
+
`,
|
|
106
|
+
{ target: "node", controlFlowFlattening: true }
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
expect(output).toContain("return TEST_OUTPUT=10,undefined}");
|
|
110
|
+
|
|
111
|
+
var TEST_OUTPUT;
|
|
112
|
+
eval(output);
|
|
113
|
+
|
|
114
|
+
expect(TEST_OUTPUT).toStrictEqual(10);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test("Variant #7: Throw statement", async () => {
|
|
118
|
+
var output = await JsConfuser(
|
|
119
|
+
`
|
|
120
|
+
function fn(){
|
|
121
|
+
TEST_OUTPUT = "Correct Value";
|
|
122
|
+
throw new Error("My Error")
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
fn();
|
|
126
|
+
} catch(e){
|
|
127
|
+
|
|
128
|
+
}
|
|
129
|
+
`,
|
|
130
|
+
{ target: "node", controlFlowFlattening: true }
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
expect(output).toContain("throw TEST_OUTPUT='Correct Value',new Error");
|
|
134
|
+
|
|
135
|
+
var TEST_OUTPUT;
|
|
136
|
+
eval(output);
|
|
137
|
+
|
|
138
|
+
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
test("Variant #8: Variable declaration", async () => {
|
|
142
|
+
var output = await JsConfuser(
|
|
143
|
+
`
|
|
144
|
+
TEST_OUTPUT = "Correct Value";
|
|
145
|
+
var x = 1, y = 2;
|
|
146
|
+
`,
|
|
147
|
+
{ target: "node", controlFlowFlattening: true }
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
expect(output).toContain("var x=(TEST_OUTPUT='Correct Value',1)");
|
|
151
|
+
|
|
152
|
+
var TEST_OUTPUT;
|
|
153
|
+
eval(output);
|
|
154
|
+
|
|
155
|
+
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
test("Variant #9: Variable declaration (no initializer)", async () => {
|
|
159
|
+
var output = await JsConfuser(
|
|
160
|
+
`
|
|
161
|
+
TEST_OUTPUT = "Correct Value";
|
|
162
|
+
var x,y;
|
|
163
|
+
`,
|
|
164
|
+
{ target: "node", controlFlowFlattening: true }
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
expect(output).toContain("var x=(TEST_OUTPUT='Correct Value',undefined)");
|
|
168
|
+
|
|
169
|
+
var TEST_OUTPUT;
|
|
170
|
+
eval(output);
|
|
171
|
+
|
|
172
|
+
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
173
|
+
});
|
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
import JsConfuser from "../../src/index";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
test("Variant #1: Execute properly", async () => {
|
|
4
4
|
var code = `
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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();
|
|
19
23
|
`;
|
|
20
24
|
|
|
21
25
|
var output = await JsConfuser(code, {
|
|
@@ -23,6 +27,53 @@ it("should execute properly", async () => {
|
|
|
23
27
|
deadCode: true,
|
|
24
28
|
});
|
|
25
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
|
+
|
|
26
77
|
var value = "never_called";
|
|
27
78
|
function input(valueIn) {
|
|
28
79
|
value = valueIn;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { isObject } from "util";
|
|
2
1
|
import JsConfuser from "../../src/index";
|
|
3
2
|
|
|
4
3
|
it("should middleman function calls", async () => {
|
|
@@ -354,3 +353,23 @@ it("should work with code that uses toString() function", async () => {
|
|
|
354
353
|
|
|
355
354
|
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
356
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
|
+
});
|
|
@@ -139,3 +139,19 @@ it("should fix destructuring inside the try...catch clause", async () => {
|
|
|
139
139
|
|
|
140
140
|
expect(TEST_VARIABLE).toStrictEqual(100);
|
|
141
141
|
});
|
|
142
|
+
|
|
143
|
+
it("should fix destructuring member expressions", async () => {
|
|
144
|
+
var code = `
|
|
145
|
+
var myObject = { nested: {} };
|
|
146
|
+
[myObject.key1, myObject["key2"], myObject.nested.key3] = [1, 2, 3];
|
|
147
|
+
|
|
148
|
+
TEST_VARIABLE = [myObject.key1, myObject.key2, myObject.nested.key3];
|
|
149
|
+
`;
|
|
150
|
+
|
|
151
|
+
var output = await JsConfuser(code, { target: "node", es5: true });
|
|
152
|
+
|
|
153
|
+
var TEST_VARIABLE;
|
|
154
|
+
eval(output);
|
|
155
|
+
|
|
156
|
+
expect(TEST_VARIABLE).toStrictEqual([1, 2, 3]);
|
|
157
|
+
});
|