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.
Files changed (263) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +6 -4
  2. package/.github/workflows/node.js.yml +1 -1
  3. package/CHANGELOG.md +105 -0
  4. package/Migration.md +57 -0
  5. package/README.md +23 -913
  6. package/dist/constants.js +69 -13
  7. package/dist/index.js +108 -152
  8. package/dist/obfuscator.js +316 -118
  9. package/dist/options.js +1 -109
  10. package/dist/order.js +30 -30
  11. package/dist/presets.js +47 -45
  12. package/dist/probability.js +25 -32
  13. package/dist/templates/bufferToStringTemplate.js +9 -0
  14. package/dist/templates/deadCodeTemplates.js +9 -0
  15. package/dist/templates/getGlobalTemplate.js +19 -0
  16. package/dist/templates/integrityTemplate.js +30 -0
  17. package/dist/templates/setFunctionLengthTemplate.js +9 -0
  18. package/dist/templates/stringCompressionTemplate.js +10 -0
  19. package/dist/templates/tamperProtectionTemplates.js +21 -0
  20. package/dist/templates/template.js +213 -93
  21. package/dist/transforms/astScrambler.js +100 -0
  22. package/dist/transforms/calculator.js +70 -127
  23. package/dist/transforms/controlFlowFlattening.js +1182 -0
  24. package/dist/transforms/deadCode.js +62 -577
  25. package/dist/transforms/dispatcher.js +300 -309
  26. package/dist/transforms/extraction/duplicateLiteralsRemoval.js +88 -189
  27. package/dist/transforms/extraction/objectExtraction.js +131 -215
  28. package/dist/transforms/finalizer.js +56 -59
  29. package/dist/transforms/flatten.js +275 -276
  30. package/dist/transforms/functionOutlining.js +230 -0
  31. package/dist/transforms/identifier/globalConcealing.js +217 -103
  32. package/dist/transforms/identifier/movedDeclarations.js +167 -91
  33. package/dist/transforms/identifier/renameVariables.js +240 -187
  34. package/dist/transforms/lock/integrity.js +61 -184
  35. package/dist/transforms/lock/lock.js +263 -303
  36. package/dist/transforms/minify.js +431 -436
  37. package/dist/transforms/opaquePredicates.js +65 -118
  38. package/dist/transforms/pack.js +160 -0
  39. package/dist/transforms/plugin.js +179 -0
  40. package/dist/transforms/preparation.js +263 -163
  41. package/dist/transforms/renameLabels.js +132 -56
  42. package/dist/transforms/rgf.js +142 -240
  43. package/dist/transforms/shuffle.js +52 -145
  44. package/dist/transforms/string/encoding.js +45 -173
  45. package/dist/transforms/string/stringCompression.js +81 -126
  46. package/dist/transforms/string/stringConcealing.js +189 -224
  47. package/dist/transforms/string/stringEncoding.js +32 -40
  48. package/dist/transforms/string/stringSplitting.js +54 -55
  49. package/dist/transforms/variableMasking.js +232 -0
  50. package/dist/utils/ControlObject.js +125 -0
  51. package/dist/utils/IntGen.js +46 -0
  52. package/dist/utils/NameGen.js +106 -0
  53. package/dist/utils/ast-utils.js +560 -0
  54. package/dist/utils/function-utils.js +56 -0
  55. package/dist/utils/gen-utils.js +48 -0
  56. package/dist/utils/node.js +77 -0
  57. package/dist/utils/object-utils.js +21 -0
  58. package/dist/utils/random-utils.js +91 -0
  59. package/dist/utils/static-utils.js +64 -0
  60. package/dist/validateOptions.js +122 -0
  61. package/index.d.ts +1 -17
  62. package/package.json +27 -22
  63. package/src/constants.ts +139 -77
  64. package/src/index.ts +70 -163
  65. package/src/obfuscationResult.ts +43 -0
  66. package/src/obfuscator.ts +328 -135
  67. package/src/options.ts +154 -623
  68. package/src/order.ts +14 -14
  69. package/src/presets.ts +39 -34
  70. package/src/probability.ts +21 -36
  71. package/src/templates/{bufferToString.ts → bufferToStringTemplate.ts} +5 -54
  72. package/src/templates/deadCodeTemplates.ts +1185 -0
  73. package/src/templates/getGlobalTemplate.ts +72 -0
  74. package/src/templates/integrityTemplate.ts +69 -0
  75. package/src/templates/setFunctionLengthTemplate.ts +11 -0
  76. package/src/templates/stringCompressionTemplate.ts +42 -0
  77. package/src/templates/tamperProtectionTemplates.ts +116 -0
  78. package/src/templates/template.ts +183 -92
  79. package/src/transforms/astScrambler.ts +99 -0
  80. package/src/transforms/calculator.ts +96 -224
  81. package/src/transforms/controlFlowFlattening.ts +1594 -0
  82. package/src/transforms/deadCode.ts +85 -628
  83. package/src/transforms/dispatcher.ts +431 -636
  84. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +147 -299
  85. package/src/transforms/extraction/objectExtraction.ts +160 -333
  86. package/src/transforms/finalizer.ts +63 -64
  87. package/src/transforms/flatten.ts +439 -557
  88. package/src/transforms/functionOutlining.ts +225 -0
  89. package/src/transforms/identifier/globalConcealing.ts +261 -189
  90. package/src/transforms/identifier/movedDeclarations.ts +228 -142
  91. package/src/transforms/identifier/renameVariables.ts +252 -258
  92. package/src/transforms/lock/integrity.ts +84 -260
  93. package/src/transforms/lock/lock.ts +342 -491
  94. package/src/transforms/minify.ts +523 -663
  95. package/src/transforms/opaquePredicates.ts +90 -229
  96. package/src/transforms/pack.ts +195 -0
  97. package/src/transforms/plugin.ts +185 -0
  98. package/src/transforms/preparation.ts +337 -215
  99. package/src/transforms/renameLabels.ts +176 -77
  100. package/src/transforms/rgf.ts +293 -386
  101. package/src/transforms/shuffle.ts +80 -254
  102. package/src/transforms/string/encoding.ts +26 -129
  103. package/src/transforms/string/stringCompression.ts +118 -236
  104. package/src/transforms/string/stringConcealing.ts +255 -339
  105. package/src/transforms/string/stringEncoding.ts +28 -47
  106. package/src/transforms/string/stringSplitting.ts +61 -75
  107. package/src/transforms/variableMasking.ts +257 -0
  108. package/src/utils/ControlObject.ts +141 -0
  109. package/src/utils/IntGen.ts +33 -0
  110. package/src/utils/NameGen.ts +106 -0
  111. package/src/utils/ast-utils.ts +667 -0
  112. package/src/utils/function-utils.ts +50 -0
  113. package/src/utils/gen-utils.ts +48 -0
  114. package/src/utils/node.ts +78 -0
  115. package/src/utils/object-utils.ts +21 -0
  116. package/src/utils/random-utils.ts +79 -0
  117. package/src/utils/static-utils.ts +66 -0
  118. package/src/validateOptions.ts +256 -0
  119. package/tsconfig.json +13 -8
  120. package/babel.config.js +0 -12
  121. package/dev.js +0 -8
  122. package/dist/compiler.js +0 -34
  123. package/dist/parser.js +0 -59
  124. package/dist/precedence.js +0 -66
  125. package/dist/templates/bufferToString.js +0 -108
  126. package/dist/templates/crash.js +0 -59
  127. package/dist/templates/es5.js +0 -137
  128. package/dist/templates/functionLength.js +0 -34
  129. package/dist/templates/globals.js +0 -9
  130. package/dist/transforms/antiTooling.js +0 -88
  131. package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +0 -1281
  132. package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +0 -131
  133. package/dist/transforms/es5/antiClass.js +0 -164
  134. package/dist/transforms/es5/antiDestructuring.js +0 -193
  135. package/dist/transforms/es5/antiES6Object.js +0 -185
  136. package/dist/transforms/es5/antiSpreadOperator.js +0 -35
  137. package/dist/transforms/es5/antiTemplate.js +0 -66
  138. package/dist/transforms/es5/es5.js +0 -123
  139. package/dist/transforms/extraction/classExtraction.js +0 -83
  140. package/dist/transforms/identifier/globalAnalysis.js +0 -70
  141. package/dist/transforms/identifier/variableAnalysis.js +0 -104
  142. package/dist/transforms/lock/antiDebug.js +0 -76
  143. package/dist/transforms/stack.js +0 -343
  144. package/dist/transforms/transform.js +0 -350
  145. package/dist/traverse.js +0 -110
  146. package/dist/util/compare.js +0 -145
  147. package/dist/util/gen.js +0 -564
  148. package/dist/util/guard.js +0 -9
  149. package/dist/util/identifiers.js +0 -355
  150. package/dist/util/insert.js +0 -362
  151. package/dist/util/math.js +0 -19
  152. package/dist/util/object.js +0 -40
  153. package/dist/util/random.js +0 -130
  154. package/dist/util/scope.js +0 -20
  155. package/docs/ControlFlowFlattening.md +0 -595
  156. package/docs/Countermeasures.md +0 -63
  157. package/docs/ES5.md +0 -197
  158. package/docs/Integrity.md +0 -75
  159. package/docs/RGF.md +0 -419
  160. package/samples/example.js +0 -15
  161. package/samples/high.js +0 -1
  162. package/samples/input.js +0 -3
  163. package/samples/javascriptobfuscator.com.js +0 -8
  164. package/samples/jscrambler_advanced.js +0 -1894
  165. package/samples/jscrambler_light.js +0 -1134
  166. package/samples/low.js +0 -1
  167. package/samples/medium.js +0 -1
  168. package/samples/obfuscator.io.js +0 -1686
  169. package/samples/preemptive.com.js +0 -16
  170. package/src/compiler.ts +0 -35
  171. package/src/parser.ts +0 -49
  172. package/src/precedence.ts +0 -61
  173. package/src/templates/crash.ts +0 -55
  174. package/src/templates/es5.ts +0 -131
  175. package/src/templates/functionLength.ts +0 -32
  176. package/src/templates/globals.ts +0 -3
  177. package/src/transforms/antiTooling.ts +0 -102
  178. package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +0 -2146
  179. package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +0 -179
  180. package/src/transforms/es5/antiClass.ts +0 -272
  181. package/src/transforms/es5/antiDestructuring.ts +0 -294
  182. package/src/transforms/es5/antiES6Object.ts +0 -267
  183. package/src/transforms/es5/antiSpreadOperator.ts +0 -56
  184. package/src/transforms/es5/antiTemplate.ts +0 -98
  185. package/src/transforms/es5/es5.ts +0 -149
  186. package/src/transforms/extraction/classExtraction.ts +0 -168
  187. package/src/transforms/identifier/globalAnalysis.ts +0 -85
  188. package/src/transforms/identifier/variableAnalysis.ts +0 -118
  189. package/src/transforms/lock/antiDebug.ts +0 -112
  190. package/src/transforms/stack.ts +0 -551
  191. package/src/transforms/transform.ts +0 -453
  192. package/src/traverse.ts +0 -120
  193. package/src/types.ts +0 -131
  194. package/src/util/compare.ts +0 -181
  195. package/src/util/gen.ts +0 -651
  196. package/src/util/guard.ts +0 -7
  197. package/src/util/identifiers.ts +0 -494
  198. package/src/util/insert.ts +0 -419
  199. package/src/util/math.ts +0 -15
  200. package/src/util/object.ts +0 -39
  201. package/src/util/random.ts +0 -141
  202. package/src/util/scope.ts +0 -21
  203. package/test/code/Cash.src.js +0 -1011
  204. package/test/code/Cash.test.ts +0 -49
  205. package/test/code/Dynamic.src.js +0 -118
  206. package/test/code/Dynamic.test.ts +0 -49
  207. package/test/code/ES6.src.js +0 -235
  208. package/test/code/ES6.test.ts +0 -42
  209. package/test/code/NewFeatures.test.ts +0 -19
  210. package/test/code/StrictMode.src.js +0 -65
  211. package/test/code/StrictMode.test.js +0 -37
  212. package/test/compare.test.ts +0 -104
  213. package/test/index.test.ts +0 -249
  214. package/test/options.test.ts +0 -132
  215. package/test/presets.test.ts +0 -22
  216. package/test/probability.test.ts +0 -44
  217. package/test/templates/template.test.ts +0 -14
  218. package/test/transforms/antiTooling.test.ts +0 -52
  219. package/test/transforms/calculator.test.ts +0 -78
  220. package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +0 -1274
  221. package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +0 -192
  222. package/test/transforms/deadCode.test.ts +0 -85
  223. package/test/transforms/dispatcher.test.ts +0 -457
  224. package/test/transforms/es5/antiClass.test.ts +0 -427
  225. package/test/transforms/es5/antiDestructuring.test.ts +0 -157
  226. package/test/transforms/es5/antiES6Object.test.ts +0 -245
  227. package/test/transforms/es5/antiTemplate.test.ts +0 -116
  228. package/test/transforms/es5/es5.test.ts +0 -110
  229. package/test/transforms/extraction/classExtraction.test.ts +0 -86
  230. package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +0 -200
  231. package/test/transforms/extraction/objectExtraction.test.ts +0 -491
  232. package/test/transforms/flatten.test.ts +0 -721
  233. package/test/transforms/hexadecimalNumbers.test.ts +0 -62
  234. package/test/transforms/identifier/globalConcealing.test.ts +0 -72
  235. package/test/transforms/identifier/movedDeclarations.test.ts +0 -275
  236. package/test/transforms/identifier/renameVariables.test.ts +0 -621
  237. package/test/transforms/lock/antiDebug.test.ts +0 -66
  238. package/test/transforms/lock/browserLock.test.ts +0 -129
  239. package/test/transforms/lock/countermeasures.test.ts +0 -100
  240. package/test/transforms/lock/integrity.test.ts +0 -161
  241. package/test/transforms/lock/lock.test.ts +0 -204
  242. package/test/transforms/lock/osLock.test.ts +0 -312
  243. package/test/transforms/lock/selfDefending.test.ts +0 -68
  244. package/test/transforms/minify.test.ts +0 -575
  245. package/test/transforms/opaquePredicates.test.ts +0 -43
  246. package/test/transforms/preparation.test.ts +0 -157
  247. package/test/transforms/renameLabels.test.ts +0 -95
  248. package/test/transforms/rgf.test.ts +0 -378
  249. package/test/transforms/shuffle.test.ts +0 -135
  250. package/test/transforms/stack.test.ts +0 -573
  251. package/test/transforms/string/stringCompression.test.ts +0 -120
  252. package/test/transforms/string/stringConcealing.test.ts +0 -299
  253. package/test/transforms/string/stringEncoding.test.ts +0 -95
  254. package/test/transforms/string/stringSplitting.test.ts +0 -135
  255. package/test/transforms/transform.test.ts +0 -66
  256. package/test/traverse.test.ts +0 -139
  257. package/test/util/compare.test.ts +0 -34
  258. package/test/util/gen.test.ts +0 -121
  259. package/test/util/identifiers.test.ts +0 -253
  260. package/test/util/insert.test.ts +0 -142
  261. package/test/util/math.test.ts +0 -5
  262. package/test/util/random.test.ts +0 -71
  263. /package/dist/{types.js → obfuscationResult.js} +0 -0
@@ -1,49 +0,0 @@
1
- import { readFileSync, writeFileSync } from "fs";
2
- import { join } from "path";
3
- import JsConfuser from "../../src/index";
4
-
5
- var CASH_JS = readFileSync(join(__dirname, "./Cash.src.js"), "utf-8");
6
-
7
- test("Variant #1: Cash.js on High Preset (Strict Mode)", async () => {
8
- var output = await JsConfuser(CASH_JS, {
9
- target: "browser",
10
- preset: "high",
11
- });
12
-
13
- // Make the required document variables for initialization
14
- var document = {
15
- documentElement: {},
16
- createElement: () => {
17
- return { style: {} };
18
- },
19
- } as any as Document;
20
- var window = {
21
- document,
22
- Array,
23
- Object,
24
- Symbol,
25
- Number,
26
- parseInt,
27
- JSON,
28
- setTimeout,
29
- encodeURIComponent,
30
- RegExp,
31
- String,
32
- $: false,
33
- } as any;
34
- window.window = window;
35
- global.window = window;
36
-
37
- try {
38
- eval(output);
39
- } catch (e) {
40
- console.error(e);
41
- writeFileSync("dev.output.js", output, {
42
- encoding: "utf-8",
43
- });
44
-
45
- expect(true).toStrictEqual(false);
46
- }
47
-
48
- expect(window).toHaveProperty("cash");
49
- });
@@ -1,118 +0,0 @@
1
- function MyFunction() {
2
- var fillerVar1;
3
- var fillerVar2;
4
- var fillerVar3;
5
- var fillerVar4;
6
- var fillerVar5;
7
-
8
- // Filler keys for testing for syntax errors
9
- class TEST_CLASS {
10
- // Tests Stack
11
- 10() {
12
- return 10;
13
- }
14
- 9() {
15
- return 9;
16
- }
17
- 8() {
18
- return 8;
19
- }
20
- 7() {
21
- return 7;
22
- }
23
- 6() {
24
- return 6;
25
- }
26
- 5() {
27
- return 5;
28
- }
29
- 4() {
30
- return 4;
31
- }
32
- 3() {
33
- return 3;
34
- }
35
- 2() {
36
- return 2;
37
- }
38
- 1() {
39
- return 2;
40
- }
41
-
42
- // Tests String Concealing
43
- MyMethod1() {
44
- return 1;
45
- }
46
- MyMethod2() {
47
- return 2;
48
- }
49
- MyMethod3() {
50
- return 3;
51
- }
52
- MyMethod4() {
53
- return 4;
54
- }
55
- MyMethod5() {
56
- return 5;
57
- }
58
- MyMethod6() {
59
- return 6;
60
- }
61
- MyMethod7() {
62
- return 7;
63
- }
64
- MyMethod8() {
65
- return 8;
66
- }
67
- MyMethod9() {
68
- return 9;
69
- }
70
- MyMethod10() {
71
- return 10;
72
- }
73
- }
74
-
75
- var a = (function (cbRunner, obj) {
76
- var num1;
77
- var num2 = get30();
78
- var num3 = 8;
79
-
80
- num1 = obj["1700"];
81
-
82
- var _num4 = 1000;
83
- var _num5 = 1001;
84
- var _num6 = 1002;
85
-
86
- var decimal = 0.1738;
87
-
88
- cbRunner(() => {
89
- return num1 + num2 + num3 + decimal;
90
- });
91
- var _num7 = 1003;
92
-
93
- function get30() {
94
- return 30;
95
- }
96
- })(
97
- function (cb) {
98
- input(cb());
99
- },
100
- {
101
- 1700: 1700,
102
-
103
- // Filler keys for testing for syntax errors
104
- 10: 10,
105
- 9: 9,
106
- 8: 8,
107
- 7: 7,
108
- 6: 6,
109
- 5: 5,
110
- 4: 4,
111
- 3: 3,
112
- 2: 2,
113
- 1: 1,
114
- }
115
- );
116
- }
117
-
118
- MyFunction();
@@ -1,49 +0,0 @@
1
- import { readFileSync, writeFileSync } from "fs";
2
- import { join } from "path";
3
- import JsConfuser from "../../src/index";
4
- import { ObfuscateOptions } from "../../src/options";
5
-
6
- var SOURCE_JS = readFileSync(join(__dirname, "./Dynamic.src.js"), "utf-8");
7
-
8
- test.concurrent("Variant #1: Dynamic.src.js on High Preset", async () => {
9
- // `input` is an embedded variable, therefore globalConcealing must be turned off
10
- var output = await JsConfuser(SOURCE_JS, {
11
- target: "browser",
12
- preset: "high",
13
- globalConcealing: false,
14
- });
15
-
16
- var value = "never_called";
17
- function input(x) {
18
- value = x;
19
- }
20
-
21
- eval(output);
22
-
23
- expect(value).toStrictEqual(1738.1738);
24
- });
25
-
26
- test.concurrent("Variant #2: Dynamic.src.js on 2x High Preset", async () => {
27
- var options: ObfuscateOptions = {
28
- target: "node",
29
- preset: "high",
30
- globalConcealing: false,
31
- };
32
-
33
- var output = await JsConfuser(SOURCE_JS, options);
34
-
35
- // writeFileSync("./dev.error.1.js", output, "utf-8");
36
-
37
- var doublyObfuscated = await JsConfuser(output, options);
38
-
39
- // writeFileSync("./dev.error.2.js", doublyObfuscated, "utf-8");
40
-
41
- var value = "never_called";
42
- function input(x) {
43
- value = x;
44
- }
45
-
46
- eval(doublyObfuscated);
47
-
48
- expect(value).toStrictEqual(1738.1738);
49
- });
@@ -1,235 +0,0 @@
1
- "use strict";
2
-
3
- // Variant #1 Using `let`
4
- let myVariable = 1;
5
-
6
- expect(myVariable).toStrictEqual(1);
7
-
8
- // Variant #2 Destructing variable from object (ObjectPattern)
9
- let { key } = { key: 2 };
10
-
11
- expect(key).toStrictEqual(2);
12
-
13
- // Variant #3 Destructing variable and using differing output name (ObjectPattern)
14
- let { key: customName } = { key: 3 };
15
-
16
- expect(customName).toStrictEqual(3);
17
-
18
- // Variant #4 Destructing variable from array (ArrayPattern)
19
- let [element] = [4];
20
-
21
- expect(element).toStrictEqual(4);
22
-
23
- // Variant #5 Destructing computed property from nested pattern
24
- let [{ ["key"]: deeplyNestedKey }] = [{ key: 5 }];
25
-
26
- expect(deeplyNestedKey).toStrictEqual(5);
27
-
28
- // Variant #6 Make sure arrow functions work
29
- const arrowFn = () => 6;
30
-
31
- expect(arrowFn()).toStrictEqual(6);
32
-
33
- // Variant #7 Make sure inline methods on object work
34
- let es6Object = {
35
- method() {
36
- return 7;
37
- },
38
- };
39
-
40
- expect(es6Object.method()).toStrictEqual(7);
41
-
42
- // Variant #8 Make sure getters on object work
43
- es6Object = {
44
- get getter() {
45
- return 8;
46
- },
47
- };
48
-
49
- expect(es6Object.getter).toStrictEqual(8);
50
-
51
- // Variant #9 Make sure getters with computed properties work
52
- let customKey = "myGetter";
53
- es6Object = {
54
- get [customKey]() {
55
- return 9;
56
- },
57
- };
58
-
59
- expect(es6Object.myGetter).toStrictEqual(9);
60
-
61
- // Variant #10 Make sure constructor method works
62
- var value;
63
- class MyClass {
64
- constructor(x) {
65
- value = x;
66
- }
67
- }
68
-
69
- var myInstance = new MyClass(10);
70
- expect(value).toStrictEqual(10);
71
-
72
- // Variant #11 Make sure for-loop initializers work
73
- var sum = 0;
74
- for (var x of [3, 3, 5]) {
75
- sum += x;
76
- }
77
- expect(sum).toStrictEqual(11);
78
-
79
- // Variant #12 More complex for-loop initializer
80
- var outside = 12;
81
- for (
82
- var myFunction = function () {
83
- return outside;
84
- };
85
- false;
86
-
87
- ) {}
88
-
89
- var TEST_OUTPUT = myFunction();
90
-
91
- expect(TEST_OUTPUT).toStrictEqual(12);
92
-
93
- function noLexicalVariables() {
94
- // Variant #13 For-in statement
95
- var object = { 100: true, "-87": true, 1000: false };
96
- var sumOfKeys = 0;
97
- for (var propertyName in object) {
98
- if (object[propertyName] === true) {
99
- sumOfKeys += parseInt(propertyName);
100
- }
101
- }
102
-
103
- expect(sumOfKeys).toStrictEqual(13);
104
-
105
- // Variant #14 For-of statement
106
- var values = [10, 20, 30, 40, -86];
107
- var sumOfValues = 0;
108
- for (var value of values) {
109
- sumOfValues += value;
110
- }
111
-
112
- expect(sumOfValues).toStrictEqual(14);
113
- }
114
-
115
- noLexicalVariables();
116
-
117
- function useStrictFunction() {
118
- "use strict";
119
-
120
- function testThis() {
121
- // Ensure 'this' behaves like strict mode
122
- function fun() {
123
- return this;
124
- }
125
-
126
- expect(fun() === undefined).toStrictEqual(true);
127
- expect(fun.call(2) === 2).toStrictEqual(true);
128
- expect(fun.apply(null) === null).toStrictEqual(true);
129
- expect(fun.call(undefined) === undefined).toStrictEqual(true);
130
- expect(fun.bind(true)() === true).toStrictEqual(true);
131
- }
132
-
133
- testThis();
134
-
135
- function testArguments() {
136
- // Ensure arguments behaves like strict-mode
137
- expect(() => useStrictFunction.arguments).toThrow();
138
- expect(() => useStrictFunction.caller).toThrow();
139
- expect(() => arguments.callee).toThrow();
140
- }
141
-
142
- testArguments();
143
-
144
- function testEval() {
145
- var __NO_JS_CONFUSER_RENAME__myOuterVariable = "Initial Value";
146
-
147
- // Eval will not leak names
148
- eval("var __NO_JS_CONFUSER_RENAME__myOuterVariable = 'Incorrect Value';");
149
-
150
- expect(__NO_JS_CONFUSER_RENAME__myOuterVariable).toStrictEqual(
151
- "Initial Value"
152
- );
153
- }
154
-
155
- testEval();
156
- }
157
-
158
- useStrictFunction();
159
-
160
- function labeledBreaksAndContinues() {
161
- var flag = true;
162
-
163
- label_1: for (var i = 0; i < 20; i++) {
164
- b: switch (i) {
165
- case 15:
166
- c: do {
167
- if (i !== 15) {
168
- break c;
169
- }
170
- flag = true;
171
-
172
- break label_1;
173
-
174
- var fillerVar1;
175
- var fillerVar2;
176
- var fillerVar3;
177
- } while (i == 15);
178
-
179
- break;
180
-
181
- case 10:
182
- continue label_1;
183
-
184
- default:
185
- flag = false;
186
- break b;
187
- }
188
-
189
- var fillerVar1;
190
- var fillerVar2;
191
- var fillerVar3;
192
- }
193
-
194
- var fillerVar1;
195
- var fillerVar2;
196
- var fillerVar3;
197
-
198
- if (flag) {
199
- return i;
200
- }
201
- }
202
-
203
- var variant15 = labeledBreaksAndContinues();
204
- expect(variant15).toStrictEqual(15);
205
-
206
- // Variant #16: Function.length property
207
- var variant16 = function (
208
- n1,
209
- n2,
210
- n3,
211
- n4,
212
- n5,
213
- n6,
214
- n7,
215
- n8,
216
- n9,
217
- n10,
218
- n11,
219
- n12,
220
- n13,
221
- n14,
222
- n15,
223
- n16
224
- ) {
225
- var _ = true;
226
- };
227
-
228
- expect(variant16.length).toStrictEqual(16);
229
-
230
- // Set 'ranAllTest' to TRUE
231
- ranAllTest = true;
232
-
233
- function countermeasures() {
234
- throw new Error("Countermeasures function called.");
235
- }
@@ -1,42 +0,0 @@
1
- import { readFileSync, writeFileSync } from "fs";
2
- import { join } from "path";
3
- import JsConfuser from "../../src/index";
4
-
5
- var ES6_JS = readFileSync(join(__dirname, "./ES6.src.js"), "utf-8");
6
-
7
- test.concurrent("Variant #1: ES6 code on High Preset", async () => {
8
- var output = await JsConfuser(ES6_JS, {
9
- target: "node",
10
- preset: "high",
11
- });
12
-
13
- // Ensure 'use strict' directive is preserved
14
- expect(output.startsWith("'use strict'")).toStrictEqual(true);
15
-
16
- var ranAllTest = false;
17
- eval(output);
18
-
19
- // 'ranAllTest' is set to TRUE by the evaluated code
20
- expect(ranAllTest).toStrictEqual(true);
21
- });
22
-
23
- test.concurrent(
24
- "Variant #2: ES6 code on High Preset + RGF + Self Defending",
25
- async () => {
26
- var output = await JsConfuser(ES6_JS, {
27
- target: "node",
28
- preset: "high",
29
- rgf: true,
30
- lock: {
31
- selfDefending: true,
32
- countermeasures: "countermeasures",
33
- },
34
- });
35
-
36
- var ranAllTest = false;
37
- eval(output);
38
-
39
- // 'ranAllTest' is set to TRUE by the evaluated code
40
- expect(ranAllTest).toStrictEqual(true);
41
- }
42
- );
@@ -1,19 +0,0 @@
1
- import JsConfuser from "../../src/index";
2
-
3
- // https://github.com/MichaelXF/js-confuser/issues/79
4
- test("Variant #1: Support BigInt Literals (1n)", async () => {
5
- var code = `
6
- TEST_OUTPUT = 1n;
7
- `;
8
-
9
- var output = await JsConfuser(code, {
10
- target: "node",
11
- renameVariables: true,
12
- });
13
-
14
- var TEST_OUTPUT;
15
- eval(output);
16
-
17
- expect(typeof TEST_OUTPUT).toStrictEqual("bigint");
18
- expect(TEST_OUTPUT).toStrictEqual(1n);
19
- });
@@ -1,65 +0,0 @@
1
- "use strict";
2
-
3
- function TestStrictMode() {
4
- "use strict";
5
-
6
- var isStrictMode = () => {
7
- try {
8
- undefined = true;
9
- } catch (E) {
10
- return true;
11
- }
12
- return false;
13
- };
14
-
15
- // filler code to make transformations more likely to affect this function
16
- var x, y, z;
17
- var string1 = "Hello World";
18
- var string2 = "use strict";
19
-
20
- var chars = string2.split("");
21
- var count = 0;
22
- for (var char of chars) {
23
- count++;
24
- }
25
-
26
- expect(count).toStrictEqual(10);
27
-
28
- // This function should be in strict mode
29
- expect(isStrictMode()).toStrictEqual(true);
30
- }
31
-
32
- var isStrictMode = () => {
33
- try {
34
- undefined = true;
35
- } catch (E) {
36
- return true;
37
- }
38
- return false;
39
- };
40
-
41
- // Global level should be in strict mode
42
- expect(isStrictMode()).toStrictEqual(true);
43
- TestStrictMode();
44
-
45
- // Direct vs. Indirect eval usage
46
- var evalString = `
47
- var isStrictMode = () => {
48
- try {
49
- undefined = true;
50
- } catch (E) {
51
- return true;
52
- }
53
- return false;
54
- };
55
-
56
- isStrictMode();`;
57
-
58
- // Direct eval -> Preserve global strict-mode
59
- var directEvalResult = eval(evalString);
60
- expect(directEvalResult).toStrictEqual(true);
61
-
62
- // Indirect eval -> Does not inherit context strict-mode
63
- var _eval_ = eval;
64
- var indirectEvalResult = _eval_(evalString);
65
- expect(indirectEvalResult).toStrictEqual(false);
@@ -1,37 +0,0 @@
1
- import { readFileSync, writeFileSync } from "fs";
2
- import { join } from "path";
3
- import JsConfuser from "../../src/index";
4
-
5
- var StrictMode_JS = readFileSync(
6
- join(__dirname, "./StrictMode.src.js"),
7
- "utf-8"
8
- );
9
-
10
- test("Variant #1: StrictMode on High Preset", async () => {
11
- var output = await JsConfuser(StrictMode_JS, {
12
- target: "node",
13
- preset: "high",
14
- });
15
-
16
- //writeFileSync("./dev.output.js", output);
17
-
18
- eval(output);
19
- });
20
-
21
- test("Variant #2: StrictMode on 2x High Preset", async () => {
22
- var output = await JsConfuser(StrictMode_JS, {
23
- target: "node",
24
- preset: "high",
25
- });
26
-
27
- //writeFileSync("./dev.output1.js", output);
28
-
29
- var output2 = await JsConfuser(output, {
30
- target: "node",
31
- preset: "high",
32
- });
33
-
34
- //writeFileSync("./dev.output2.js", output2);
35
-
36
- eval(output2);
37
- });
@@ -1,104 +0,0 @@
1
- import Template from "../src/templates/template";
2
- import { isIndependent } from "../src/util/compare";
3
- import {
4
- ArrayExpression,
5
- FunctionExpression,
6
- Identifier,
7
- Literal,
8
- } from "../src/util/gen";
9
-
10
- describe("isIndependent", () => {
11
- it("should return true for literals", () => {
12
- expect(isIndependent(Literal("String"), [])).toStrictEqual(true);
13
- });
14
-
15
- it("should return false for identifiers", () => {
16
- expect(
17
- isIndependent(Identifier("variable"), [{ type: "Program" }])
18
- ).toStrictEqual(false);
19
- });
20
-
21
- it("should return true for reserved identifiers (undefined, NaN, etc)", () => {
22
- expect(
23
- isIndependent(Identifier("undefined"), [{ type: "Program" }])
24
- ).toStrictEqual(true);
25
- });
26
-
27
- it("should return true for arrays of literals", () => {
28
- expect(
29
- isIndependent(ArrayExpression([Literal("String")]), [])
30
- ).toStrictEqual(true);
31
- });
32
-
33
- it("should return false for arrays with identifiers", () => {
34
- expect(
35
- isIndependent(
36
- ArrayExpression([Literal("String"), Identifier("variable")]),
37
- []
38
- )
39
- ).toStrictEqual(false);
40
- });
41
-
42
- it("should return false for everything else", () => {
43
- expect(isIndependent(FunctionExpression([], []), [])).toStrictEqual(false);
44
- });
45
-
46
- it("various cases", () => {
47
- expect(
48
- isIndependent(
49
- Template(`({
50
- x: 1,
51
- y: 2,
52
- z: 3,
53
- })`).single().expression,
54
- []
55
- )
56
- ).toStrictEqual(true);
57
-
58
- expect(
59
- isIndependent(
60
- Template(`({
61
- x: 1,
62
- y: 2,
63
- z: [3,4,5,6,7,"My String",undefined,null,NaN],
64
- })`).single().expression,
65
- []
66
- )
67
- ).toStrictEqual(true);
68
-
69
- expect(
70
- isIndependent(
71
- Template(`({
72
- x: 1,
73
- y: 2,
74
- z: 3,
75
- _: function(){return value}
76
- })`).single().expression,
77
- []
78
- )
79
- ).toStrictEqual(false);
80
-
81
- expect(
82
- isIndependent(
83
- Template(`({
84
- x: 1,
85
- y: 2,
86
- z: 3,
87
- _: [value]
88
- })`).single().expression,
89
- []
90
- )
91
- ).toStrictEqual(false);
92
-
93
- expect(
94
- isIndependent(
95
- Template(`([
96
- {
97
- x: value
98
- }
99
- ])`).single().expression,
100
- []
101
- )
102
- ).toStrictEqual(false);
103
- });
104
- });