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.
Files changed (143) hide show
  1. package/.github/workflows/node.js.yml +2 -2
  2. package/CHANGELOG.md +55 -0
  3. package/README.md +346 -165
  4. package/dist/constants.js +6 -2
  5. package/dist/index.js +9 -21
  6. package/dist/obfuscator.js +19 -31
  7. package/dist/options.js +5 -5
  8. package/dist/order.js +1 -3
  9. package/dist/presets.js +6 -7
  10. package/dist/probability.js +2 -4
  11. package/dist/templates/bufferToString.js +13 -0
  12. package/dist/templates/crash.js +3 -3
  13. package/dist/templates/es5.js +18 -0
  14. package/dist/templates/functionLength.js +16 -0
  15. package/dist/transforms/calculator.js +77 -21
  16. package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +980 -367
  17. package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +4 -1
  18. package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +25 -26
  19. package/dist/transforms/deadCode.js +33 -25
  20. package/dist/transforms/dispatcher.js +8 -4
  21. package/dist/transforms/es5/antiDestructuring.js +2 -0
  22. package/dist/transforms/es5/es5.js +31 -34
  23. package/dist/transforms/extraction/duplicateLiteralsRemoval.js +92 -58
  24. package/dist/transforms/finalizer.js +82 -0
  25. package/dist/transforms/flatten.js +229 -148
  26. package/dist/transforms/identifier/globalAnalysis.js +88 -0
  27. package/dist/transforms/identifier/globalConcealing.js +10 -83
  28. package/dist/transforms/identifier/movedDeclarations.js +35 -88
  29. package/dist/transforms/identifier/renameVariables.js +124 -59
  30. package/dist/transforms/identifier/variableAnalysis.js +58 -62
  31. package/dist/transforms/lock/lock.js +0 -37
  32. package/dist/transforms/minify.js +60 -57
  33. package/dist/transforms/opaquePredicates.js +1 -1
  34. package/dist/transforms/preparation/preparation.js +2 -2
  35. package/dist/transforms/preparation.js +231 -0
  36. package/dist/transforms/renameLabels.js +1 -1
  37. package/dist/transforms/rgf.js +139 -247
  38. package/dist/transforms/stack.js +128 -26
  39. package/dist/transforms/string/encoding.js +150 -179
  40. package/dist/transforms/string/stringCompression.js +14 -15
  41. package/dist/transforms/string/stringConcealing.js +25 -8
  42. package/dist/transforms/string/stringEncoding.js +13 -24
  43. package/dist/transforms/transform.js +12 -19
  44. package/dist/traverse.js +24 -10
  45. package/dist/util/gen.js +17 -1
  46. package/dist/util/identifiers.js +37 -3
  47. package/dist/util/insert.js +35 -4
  48. package/dist/util/random.js +15 -0
  49. package/docs/ControlFlowFlattening.md +595 -0
  50. package/{Countermeasures.md → docs/Countermeasures.md} +1 -15
  51. package/{Integrity.md → docs/Integrity.md} +2 -2
  52. package/docs/RGF.md +419 -0
  53. package/package.json +5 -5
  54. package/src/constants.ts +3 -0
  55. package/src/index.ts +2 -2
  56. package/src/obfuscator.ts +19 -31
  57. package/src/options.ts +14 -103
  58. package/src/order.ts +1 -5
  59. package/src/presets.ts +6 -7
  60. package/src/probability.ts +2 -3
  61. package/src/templates/bufferToString.ts +68 -0
  62. package/src/templates/crash.ts +15 -19
  63. package/src/templates/es5.ts +131 -0
  64. package/src/templates/functionLength.ts +14 -0
  65. package/src/transforms/calculator.ts +122 -59
  66. package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +1583 -571
  67. package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +4 -1
  68. package/src/transforms/deadCode.ts +383 -26
  69. package/src/transforms/dispatcher.ts +9 -4
  70. package/src/transforms/es5/antiDestructuring.ts +2 -0
  71. package/src/transforms/es5/es5.ts +32 -77
  72. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +133 -129
  73. package/src/transforms/{hexadecimalNumbers.ts → finalizer.ts} +29 -13
  74. package/src/transforms/flatten.ts +357 -300
  75. package/src/transforms/identifier/globalAnalysis.ts +85 -0
  76. package/src/transforms/identifier/globalConcealing.ts +14 -103
  77. package/src/transforms/identifier/movedDeclarations.ts +49 -102
  78. package/src/transforms/identifier/renameVariables.ts +149 -78
  79. package/src/transforms/identifier/variableAnalysis.ts +66 -73
  80. package/src/transforms/lock/lock.ts +1 -42
  81. package/src/transforms/minify.ts +91 -75
  82. package/src/transforms/opaquePredicates.ts +2 -2
  83. package/src/transforms/preparation.ts +238 -0
  84. package/src/transforms/renameLabels.ts +2 -2
  85. package/src/transforms/rgf.ts +213 -405
  86. package/src/transforms/stack.ts +156 -36
  87. package/src/transforms/string/encoding.ts +115 -212
  88. package/src/transforms/string/stringCompression.ts +27 -18
  89. package/src/transforms/string/stringConcealing.ts +39 -9
  90. package/src/transforms/string/stringEncoding.ts +18 -18
  91. package/src/transforms/transform.ts +21 -23
  92. package/src/traverse.ts +23 -4
  93. package/src/types.ts +2 -1
  94. package/src/util/gen.ts +28 -3
  95. package/src/util/identifiers.ts +43 -2
  96. package/src/util/insert.ts +38 -3
  97. package/src/util/random.ts +13 -0
  98. package/test/code/Cash.test.ts +1 -1
  99. package/test/code/Dynamic.test.ts +12 -10
  100. package/test/code/ES6.src.js +146 -0
  101. package/test/code/ES6.test.ts +28 -2
  102. package/test/index.test.ts +2 -1
  103. package/test/probability.test.ts +44 -0
  104. package/test/templates/template.test.ts +1 -1
  105. package/test/transforms/antiTooling.test.ts +22 -0
  106. package/test/transforms/calculator.test.ts +40 -0
  107. package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +702 -160
  108. package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +173 -0
  109. package/test/transforms/deadCode.test.ts +66 -15
  110. package/test/transforms/dispatcher.test.ts +20 -1
  111. package/test/transforms/es5/antiDestructuring.test.ts +16 -0
  112. package/test/transforms/flatten.test.ts +399 -86
  113. package/test/transforms/identifier/movedDeclarations.test.ts +63 -8
  114. package/test/transforms/identifier/renameVariables.test.ts +119 -0
  115. package/test/transforms/lock/antiDebug.test.ts +2 -2
  116. package/test/transforms/lock/lock.test.ts +1 -48
  117. package/test/transforms/minify.test.ts +104 -0
  118. package/test/transforms/preparation.test.ts +157 -0
  119. package/test/transforms/rgf.test.ts +261 -381
  120. package/test/transforms/stack.test.ts +143 -21
  121. package/test/transforms/string/stringCompression.test.ts +39 -0
  122. package/test/transforms/string/stringConcealing.test.ts +82 -0
  123. package/test/transforms/string/stringEncoding.test.ts +53 -2
  124. package/test/transforms/transform.test.ts +66 -0
  125. package/test/traverse.test.ts +139 -0
  126. package/test/util/identifiers.test.ts +113 -1
  127. package/test/util/insert.test.ts +57 -3
  128. package/src/transforms/controlFlowFlattening/choiceFlowObfuscation.ts +0 -87
  129. package/src/transforms/controlFlowFlattening/controlFlowObfuscation.ts +0 -203
  130. package/src/transforms/controlFlowFlattening/switchCaseObfuscation.ts +0 -130
  131. package/src/transforms/eval.ts +0 -89
  132. package/src/transforms/hideInitializingCode.ts +0 -432
  133. package/src/transforms/identifier/nameRecycling.ts +0 -280
  134. package/src/transforms/label.ts +0 -64
  135. package/src/transforms/preparation/nameConflicts.ts +0 -102
  136. package/src/transforms/preparation/preparation.ts +0 -176
  137. package/test/transforms/controlFlowFlattening/controlFlowObfuscation.test.ts +0 -101
  138. package/test/transforms/controlFlowFlattening/switchCaseObfuscation.test.ts +0 -120
  139. package/test/transforms/eval.test.ts +0 -131
  140. package/test/transforms/hideInitializingCode.test.ts +0 -336
  141. package/test/transforms/identifier/nameRecycling.test.ts +0 -205
  142. package/test/transforms/preparation/nameConflicts.test.ts +0 -52
  143. 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
- it("should execute properly", async () => {
3
+ test("Variant #1: Execute properly", async () => {
4
4
  var code = `
5
- var array = [];
6
-
7
- array.push(1);
8
- array.push(2);
9
- array.push(3);
10
- array.push(4);
11
- array.push(5);
12
- array.push(6);
13
- array.push(7);
14
- array.push(8);
15
- array.push(9);
16
- array.push(10);
17
-
18
- input(array);
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
+ });