js-confuser 1.5.8 → 1.6.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 (139) hide show
  1. package/.github/workflows/node.js.yml +2 -2
  2. package/CHANGELOG.md +69 -0
  3. package/README.md +143 -7
  4. package/dist/index.js +33 -4
  5. package/dist/obfuscator.js +30 -31
  6. package/dist/options.js +4 -5
  7. package/dist/order.js +4 -6
  8. package/dist/probability.js +2 -4
  9. package/dist/templates/bufferToString.js +13 -0
  10. package/dist/templates/crash.js +2 -2
  11. package/dist/templates/es5.js +18 -0
  12. package/dist/transforms/antiTooling.js +1 -1
  13. package/dist/transforms/calculator.js +77 -21
  14. package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +980 -367
  15. package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +8 -3
  16. package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +25 -26
  17. package/dist/transforms/deadCode.js +33 -25
  18. package/dist/transforms/dispatcher.js +7 -6
  19. package/dist/transforms/es5/antiClass.js +6 -2
  20. package/dist/transforms/es5/antiDestructuring.js +3 -1
  21. package/dist/transforms/es5/es5.js +31 -34
  22. package/dist/transforms/eval.js +11 -0
  23. package/dist/transforms/extraction/duplicateLiteralsRemoval.js +8 -5
  24. package/dist/transforms/extraction/objectExtraction.js +6 -1
  25. package/dist/transforms/finalizer.js +82 -0
  26. package/dist/transforms/flatten.js +82 -55
  27. package/dist/transforms/hexadecimalNumbers.js +34 -9
  28. package/dist/transforms/identifier/globalAnalysis.js +88 -0
  29. package/dist/transforms/identifier/globalConcealing.js +10 -83
  30. package/dist/transforms/identifier/movedDeclarations.js +2 -8
  31. package/dist/transforms/identifier/renameVariables.js +39 -27
  32. package/dist/transforms/identifier/variableAnalysis.js +58 -62
  33. package/dist/transforms/minify.js +80 -61
  34. package/dist/transforms/opaquePredicates.js +1 -1
  35. package/dist/transforms/preparation/preparation.js +2 -2
  36. package/dist/transforms/preparation.js +231 -0
  37. package/dist/transforms/renameLabels.js +1 -1
  38. package/dist/transforms/rgf.js +4 -5
  39. package/dist/transforms/stack.js +87 -26
  40. package/dist/transforms/string/encoding.js +150 -179
  41. package/dist/transforms/string/stringCompression.js +14 -15
  42. package/dist/transforms/string/stringConcealing.js +25 -8
  43. package/dist/transforms/string/stringEncoding.js +13 -24
  44. package/dist/transforms/transform.js +11 -18
  45. package/dist/traverse.js +24 -18
  46. package/dist/util/compare.js +2 -2
  47. package/dist/util/gen.js +15 -0
  48. package/dist/util/insert.js +31 -7
  49. package/dist/util/random.js +15 -0
  50. package/package.json +5 -5
  51. package/src/index.ts +57 -19
  52. package/src/obfuscator.ts +26 -29
  53. package/src/options.ts +17 -21
  54. package/src/order.ts +4 -8
  55. package/src/probability.ts +2 -3
  56. package/src/templates/bufferToString.ts +68 -0
  57. package/src/templates/crash.ts +5 -9
  58. package/src/templates/es5.ts +131 -0
  59. package/src/transforms/antiTooling.ts +1 -1
  60. package/src/transforms/calculator.ts +122 -59
  61. package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +1583 -571
  62. package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +18 -3
  63. package/src/transforms/deadCode.ts +383 -26
  64. package/src/transforms/dispatcher.ts +8 -6
  65. package/src/transforms/es5/antiClass.ts +10 -1
  66. package/src/transforms/es5/antiDestructuring.ts +3 -1
  67. package/src/transforms/es5/es5.ts +32 -77
  68. package/src/transforms/eval.ts +18 -0
  69. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +9 -6
  70. package/src/transforms/extraction/objectExtraction.ts +12 -5
  71. package/src/transforms/finalizer.ts +75 -0
  72. package/src/transforms/flatten.ts +194 -151
  73. package/src/transforms/identifier/globalAnalysis.ts +85 -0
  74. package/src/transforms/identifier/globalConcealing.ts +14 -103
  75. package/src/transforms/identifier/movedDeclarations.ts +4 -11
  76. package/src/transforms/identifier/renameVariables.ts +37 -30
  77. package/src/transforms/identifier/variableAnalysis.ts +66 -73
  78. package/src/transforms/minify.ts +116 -77
  79. package/src/transforms/opaquePredicates.ts +2 -2
  80. package/src/transforms/preparation.ts +238 -0
  81. package/src/transforms/renameLabels.ts +2 -2
  82. package/src/transforms/rgf.ts +6 -7
  83. package/src/transforms/stack.ts +97 -37
  84. package/src/transforms/string/encoding.ts +115 -212
  85. package/src/transforms/string/stringCompression.ts +27 -18
  86. package/src/transforms/string/stringConcealing.ts +41 -11
  87. package/src/transforms/string/stringEncoding.ts +18 -18
  88. package/src/transforms/transform.ts +15 -21
  89. package/src/traverse.ts +24 -12
  90. package/src/types.ts +11 -2
  91. package/src/util/compare.ts +2 -2
  92. package/src/util/gen.ts +21 -1
  93. package/src/util/insert.ts +49 -9
  94. package/src/util/random.ts +13 -0
  95. package/test/code/Cash.test.ts +1 -1
  96. package/test/code/Dynamic.test.ts +12 -10
  97. package/test/code/ES6.src.js +136 -0
  98. package/test/code/ES6.test.ts +28 -2
  99. package/test/code/NewFeatures.test.ts +19 -0
  100. package/test/index.test.ts +15 -2
  101. package/test/probability.test.ts +44 -0
  102. package/test/templates/template.test.ts +1 -1
  103. package/test/transforms/antiTooling.test.ts +52 -0
  104. package/test/transforms/calculator.test.ts +40 -0
  105. package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +713 -149
  106. package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +173 -0
  107. package/test/transforms/deadCode.test.ts +66 -15
  108. package/test/transforms/dispatcher.test.ts +44 -1
  109. package/test/transforms/es5/antiClass.test.ts +33 -0
  110. package/test/transforms/es5/antiDestructuring.test.ts +16 -0
  111. package/test/transforms/eval.test.ts +53 -0
  112. package/test/transforms/extraction/objectExtraction.test.ts +21 -0
  113. package/test/transforms/flatten.test.ts +195 -3
  114. package/test/transforms/identifier/movedDeclarations.test.ts +27 -0
  115. package/test/transforms/identifier/renameVariables.test.ts +108 -0
  116. package/test/transforms/lock/antiDebug.test.ts +2 -2
  117. package/test/transforms/minify.test.ts +151 -0
  118. package/test/transforms/preparation.test.ts +157 -0
  119. package/test/transforms/rgf.test.ts +56 -29
  120. package/test/transforms/stack.test.ts +91 -21
  121. package/test/transforms/string/stringCompression.test.ts +39 -0
  122. package/test/transforms/string/stringConcealing.test.ts +115 -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/compare.test.ts +23 -1
  127. package/src/transforms/controlFlowFlattening/choiceFlowObfuscation.ts +0 -87
  128. package/src/transforms/controlFlowFlattening/controlFlowObfuscation.ts +0 -203
  129. package/src/transforms/controlFlowFlattening/switchCaseObfuscation.ts +0 -130
  130. package/src/transforms/hexadecimalNumbers.ts +0 -31
  131. package/src/transforms/hideInitializingCode.ts +0 -432
  132. package/src/transforms/label.ts +0 -64
  133. package/src/transforms/preparation/nameConflicts.ts +0 -102
  134. package/src/transforms/preparation/preparation.ts +0 -176
  135. package/test/transforms/controlFlowFlattening/controlFlowObfuscation.test.ts +0 -101
  136. package/test/transforms/controlFlowFlattening/switchCaseObfuscation.test.ts +0 -120
  137. package/test/transforms/hideInitializingCode.test.ts +0 -336
  138. package/test/transforms/preparation/nameConflicts.test.ts +0 -52
  139. package/test/transforms/preparation/preparation.test.ts +0 -62
@@ -1,4 +1,5 @@
1
1
  import JsConfuser from "../../../src/index";
2
+ import { ObfuscateOptions } from "../../../src/options";
2
3
 
3
4
  test("Variant #1: Rename variables properly", async () => {
4
5
  var code = "var TEST_VARIABLE = 1;";
@@ -474,3 +475,110 @@ test("Variant #19: Don't break Import Declarations", async () => {
474
475
  "1cac63f39fd68d8c531f27b807610fb3d50f0fc3f186995767fb6316e7200a3e"
475
476
  );
476
477
  });
478
+
479
+ // https://github.com/MichaelXF/js-confuser/issues/80
480
+ test("Variant #20: Don't break code with var and let variables in same scope", async () => {
481
+ var output = await JsConfuser(
482
+ `
483
+ function log(param) {
484
+ let message = param;
485
+ var isWarning = false;
486
+ var isError = false;
487
+
488
+ TEST_OUTPUT = message;
489
+ };
490
+
491
+ log("Correct Value");
492
+ `,
493
+ {
494
+ target: "node",
495
+ renameVariables: true,
496
+ }
497
+ );
498
+
499
+ var TEST_OUTPUT;
500
+ eval(output);
501
+
502
+ expect(TEST_OUTPUT).toStrictEqual("Correct Value");
503
+ });
504
+
505
+ test.each(["hexadecimal", "mangled", "number", "zeroWidth"])(
506
+ "Variant #21: Work with custom identifierGenerator mode",
507
+ async (identifierGeneratorMode) => {
508
+ var output = await JsConfuser(
509
+ `
510
+ var myVar1 = "Correct Value";
511
+
512
+ TEST_OUTPUT = myVar1;
513
+ `,
514
+ {
515
+ target: "node",
516
+ renameVariables: true,
517
+ identifierGenerator:
518
+ identifierGeneratorMode as ObfuscateOptions["identifierGenerator"],
519
+ }
520
+ );
521
+
522
+ // Ensure 'myVar1' got renamed
523
+ expect(output).not.toContain("myVar1");
524
+
525
+ var TEST_OUTPUT;
526
+
527
+ eval(output);
528
+ expect(TEST_OUTPUT).toStrictEqual("Correct Value");
529
+ }
530
+ );
531
+
532
+ test("Variant #22: Don't rename variables prefixed with '__NO_JS_CONFUSER_RENAME__'", async () => {
533
+ var output = await JsConfuser(
534
+ `
535
+ var myValue = "Correct Value";
536
+
537
+ var __NO_JS_CONFUSER_RENAME__myVar4 = "Incorrect Value";
538
+
539
+ __NO_JS_CONFUSER_RENAME__myVar4 = myValue;
540
+
541
+ eval( "TEST_OUTPUT = __NO_JS_CONFUSER_RENAME__myVar4" );
542
+ `,
543
+ {
544
+ target: "node",
545
+ renameVariables: true,
546
+ }
547
+ );
548
+
549
+ // Ensure 'myValue' got renamed
550
+ expect(output).not.toContain("myValue");
551
+ // Ensure '__NO_JS_CONFUSER_RENAME__myVar4' was not renamed
552
+ expect(output).toContain("__NO_JS_CONFUSER_RENAME__myVar4");
553
+
554
+ // Test the code
555
+ var TEST_OUTPUT;
556
+
557
+ eval(output);
558
+ expect(TEST_OUTPUT).toStrictEqual("Correct Value");
559
+ });
560
+
561
+ test("Variant #23: Re-use previously generated names", async () => {
562
+ var output = await JsConfuser(
563
+ `
564
+ function log(message){
565
+ TEST_OUTPUT = message;
566
+ }
567
+
568
+ log("Correct Value");
569
+ `,
570
+ {
571
+ target: "node",
572
+ renameVariables: true,
573
+ identifierGenerator: "mangled",
574
+ }
575
+ );
576
+
577
+ expect(output).not.toContain("log");
578
+ expect(output).toContain("function a(a)");
579
+
580
+ var TEST_OUTPUT;
581
+ eval(output);
582
+
583
+ expect(TEST_OUTPUT).toStrictEqual("Correct Value");
584
+ });
@@ -23,7 +23,7 @@ it("add a background interval", async () => {
23
23
  });
24
24
 
25
25
  it("should place syntax-correct code", async () => {
26
- for (var i = 0; i < 50; i++) {
26
+ for (var i = 0; i < 25; i++) {
27
27
  var output = await JsConfuser.obfuscate(
28
28
  `
29
29
  /**
@@ -49,7 +49,7 @@ it("should place syntax-correct code", async () => {
49
49
  `,
50
50
  {
51
51
  compact: true,
52
- controlFlowFlattening: 0.25,
52
+ controlFlowFlattening: true,
53
53
  identifierGenerator: "randomized",
54
54
  lock: { antiDebug: true },
55
55
  minify: true,
@@ -269,6 +269,7 @@ test("Variant #15: Removing implied 'return'", async () => {
269
269
  function MyFunction(){
270
270
  var output = "Hello World";
271
271
  console.log(output);
272
+ this; // Stop arrow function conversion
272
273
  return;
273
274
  }
274
275
 
@@ -366,3 +367,153 @@ test("Variant #19: Remove unreachable code following a throw statement", async (
366
367
 
367
368
  expect(output).not.toContain("unreachableStmt");
368
369
  });
370
+
371
+ // https://github.com/MichaelXF/js-confuser/issues/76
372
+ test("Variant #20: Properly handle objects with `, ^, [, ] as keys", async () => {
373
+ var output = await JsConfuser(
374
+ `
375
+ TEST_OBJECT = {
376
+ "\`": true,
377
+ "^": true,
378
+ "]": true,
379
+ "[": true
380
+ };
381
+ `,
382
+ {
383
+ target: "node",
384
+ minify: true,
385
+ }
386
+ );
387
+
388
+ var TEST_OBJECT;
389
+ eval(output);
390
+
391
+ expect(TEST_OBJECT).toStrictEqual({
392
+ "`": true,
393
+ "^": true,
394
+ "]": true,
395
+ "[": true,
396
+ });
397
+ });
398
+
399
+ // https://github.com/MichaelXF/js-confuser/issues/75
400
+ test("Variant #21: Properly handle Object constructor (Function Declaration)", async () => {
401
+ var output = await JsConfuser(
402
+ `
403
+ function MyClass() {};
404
+
405
+ var myObject = new MyClass();
406
+
407
+ TEST_OUTPUT = myObject instanceof MyClass;
408
+ `,
409
+ { target: "node", minify: true }
410
+ );
411
+
412
+ var TEST_OUTPUT = false;
413
+ eval(output);
414
+
415
+ expect(TEST_OUTPUT).toStrictEqual(true);
416
+ });
417
+
418
+ test("Variant #22: Properly handle Object constructor (Function Expression)", async () => {
419
+ var output = await JsConfuser(
420
+ `
421
+ var MyClass = function() {};
422
+
423
+ var myObject = new MyClass();
424
+
425
+ TEST_OUTPUT = myObject instanceof MyClass;
426
+ `,
427
+ { target: "node", minify: true }
428
+ );
429
+
430
+ var TEST_OUTPUT = false;
431
+ eval(output);
432
+
433
+ expect(TEST_OUTPUT).toStrictEqual(true);
434
+ });
435
+
436
+ test("Variant #23: Shorten property names and method names", async () => {
437
+ var output = await JsConfuser(
438
+ `
439
+ var myObject = { "myKey": "Correct Value" };
440
+ var myClass = class { ["myMethod"](){ return "Correct Value" } }
441
+
442
+ TEST_OUTPUT = myObject.myKey === (new myClass()).myMethod();
443
+ `,
444
+ { target: "node", minify: true }
445
+ );
446
+
447
+ expect(output).not.toContain("'myKey'");
448
+ expect(output).not.toContain("'myMethod'");
449
+
450
+ var TEST_OUTPUT;
451
+ eval(output);
452
+
453
+ expect(TEST_OUTPUT).toStrictEqual(true);
454
+ });
455
+
456
+ test("Variant #24: Variable grouping in switch case", async () => {
457
+ var output = await JsConfuser(
458
+ `
459
+ switch(true){
460
+ case true:
461
+ var myVar1;
462
+ var myVar2;
463
+ var myVar3 = "Correct Value";
464
+ var myVar4;
465
+
466
+ TEST_OUTPUT = myVar3;
467
+ break;
468
+ }
469
+ `,
470
+ { target: "node", minify: true }
471
+ );
472
+
473
+ // Ensure the variable declarations were grouped
474
+ expect(output).toContain("var myVar1,myVar2,myVar3");
475
+
476
+ var TEST_OUTPUT;
477
+ eval(output);
478
+
479
+ expect(TEST_OUTPUT).toStrictEqual("Correct Value");
480
+ });
481
+
482
+ test("Variant #25: Don't break redefined function declaration", async () => {
483
+ var output = await JsConfuser(
484
+ `
485
+ function a(){ TEST_OUTPUT = 1 };
486
+ function a(){ TEST_OUTPUT = 2 };
487
+ function a(){ TEST_OUTPUT = 3 };
488
+
489
+ a();
490
+ `,
491
+ { target: "node", minify: true }
492
+ );
493
+
494
+ var TEST_OUTPUT;
495
+ eval(output);
496
+
497
+ expect(TEST_OUTPUT).toStrictEqual(3);
498
+ });
499
+
500
+ test("Variant #26: Don't break nested redefined function declaration", async () => {
501
+ var output = await JsConfuser(
502
+ `
503
+ var a = 0;
504
+ if(true){
505
+ function a(){
506
+ TEST_OUTPUT = 1;
507
+ }
508
+ }
509
+
510
+ a();
511
+ `,
512
+ { target: "node", minify: true }
513
+ );
514
+
515
+ var TEST_OUTPUT;
516
+ eval(output);
517
+
518
+ expect(TEST_OUTPUT).toStrictEqual(1);
519
+ });
@@ -0,0 +1,157 @@
1
+ import JsConfuser from "../../src/index";
2
+
3
+ test("Variant #1: Force Block Statements on If statements", async () => {
4
+ var output = await JsConfuser.obfuscate(
5
+ `
6
+ if ( a ) b();
7
+
8
+ if ( a ) {} else c()
9
+ `,
10
+ {
11
+ target: "node",
12
+ compact: true, // <- Something needs to be enabled
13
+ }
14
+ );
15
+
16
+ // Ensure parenthesis were added
17
+ expect(output).toContain("{b()}");
18
+ expect(output).toContain("{c()}");
19
+ });
20
+
21
+ test("Variant #2: Force Block Statements on Arrow functions", async () => {
22
+ var output = await JsConfuser.obfuscate(
23
+ `
24
+ TEST_OUTPUT = ()=>true;
25
+ `,
26
+ {
27
+ target: "node",
28
+ compact: true, // <- Something needs to be enabled
29
+ }
30
+ );
31
+
32
+ // Ensure parenthesis were added
33
+ expect(output).toContain("return");
34
+ expect(output).toContain("{");
35
+ expect(output).toContain("}");
36
+
37
+ // Ensure code still works
38
+ var TEST_OUTPUT;
39
+ eval(output);
40
+
41
+ expect(typeof TEST_OUTPUT).toStrictEqual("function");
42
+ expect(TEST_OUTPUT()).toStrictEqual(true);
43
+ });
44
+
45
+ test("Variant #3: Force Block Statements on For loops", async () => {
46
+ var output = await JsConfuser.obfuscate(
47
+ `
48
+ for(;;) forStatement();
49
+ for(a in b) forInStatement();
50
+ for(a of b) forOfStatement();
51
+ `,
52
+ {
53
+ target: "node",
54
+ compact: true, // <- Something needs to be enabled
55
+ }
56
+ );
57
+
58
+ // Ensure parenthesis were added
59
+ expect(output).toContain("{forStatement()}");
60
+ expect(output).toContain("{forInStatement()}");
61
+ expect(output).toContain("{forOfStatement()}");
62
+ });
63
+
64
+ test("Variant #4: Force Block Statements on While loops/With statement", async () => {
65
+ var output = await JsConfuser.obfuscate(
66
+ `
67
+ while(1) whileStatement();
68
+ with(a) withStatement();
69
+ `,
70
+ {
71
+ target: "node",
72
+ compact: true, // <- Something needs to be enabled
73
+ }
74
+ );
75
+
76
+ // Ensure parenthesis were added
77
+ expect(output).toContain("{whileStatement()}");
78
+ expect(output).toContain("{withStatement()}");
79
+ });
80
+
81
+ test("Variant #5: Force object accessors to use strings instead", async () => {
82
+ var output = await JsConfuser.obfuscate(
83
+ `
84
+ console.log("Hello World")
85
+ `,
86
+ {
87
+ target: "node",
88
+ compact: true, // <- Something needs to be enabled
89
+ }
90
+ );
91
+
92
+ // Ensure the member expression got changed to a string
93
+ expect(output).toContain("console['log']");
94
+ });
95
+
96
+ test("Variant #6: Force object property keys to use strings instead", async () => {
97
+ var output = await JsConfuser.obfuscate(
98
+ `
99
+ var myObject = {
100
+ myKey: 1
101
+ }
102
+ `,
103
+ {
104
+ target: "node",
105
+ compact: true, // <- Something needs to be enabled
106
+ }
107
+ );
108
+
109
+ // Ensure key got changed to a string
110
+ expect(output).toContain("'myKey'");
111
+ });
112
+
113
+ test("Variant #7: Force Variable declarations to be expanded", async () => {
114
+ var output = await JsConfuser.obfuscate(
115
+ `
116
+ var myVar1, myVar2, myVar3;
117
+
118
+ switch(true){
119
+ case true:
120
+ var mySwitchVar1, mySwitchVar2, mySwitchVar3;
121
+ break;
122
+ }
123
+
124
+ {
125
+ var myBlockVar1;
126
+ var myBlockVar2;
127
+ var myBlockVar3;
128
+ }
129
+
130
+ if(true) var myIfVar1, myIfVar2, myIfVar3;
131
+ `,
132
+ {
133
+ target: "node",
134
+ compact: true, // <- Something needs to be enabled
135
+ }
136
+ );
137
+
138
+ // Ensure the variable declarations got changed
139
+ expect(output).toContain("var myVar1;");
140
+ expect(output).toContain("var myVar2;");
141
+ expect(output).toContain("var myVar3;");
142
+
143
+ // Ensure the switch declarations got changed
144
+ expect(output).toContain("var mySwitchVar1;");
145
+ expect(output).toContain("var mySwitchVar2;");
146
+ expect(output).toContain("var mySwitchVar3;");
147
+
148
+ // Ensure the block declarations got changed
149
+ expect(output).toContain("var myBlockVar1;");
150
+ expect(output).toContain("var myBlockVar2;");
151
+ expect(output).toContain("var myBlockVar3");
152
+
153
+ // Ensure the if-statement declarations got changed
154
+ expect(output).toContain("var myIfVar1;");
155
+ expect(output).toContain("var myIfVar2;");
156
+ expect(output).toContain("var myIfVar3");
157
+ });
@@ -126,35 +126,6 @@ describe("RGF", () => {
126
126
  expect(value).toStrictEqual("Hello World");
127
127
  });
128
128
 
129
- it("should work with hideInitializingCode enabled", async () => {
130
- var output = await JsConfuser.obfuscate(
131
- `
132
- function abc(x, y){
133
- return x + y;
134
- }
135
-
136
- var result = abc(10, 50);
137
- input(console.log, result)
138
- `,
139
- {
140
- target: "node",
141
- identifierGenerator: "randomized",
142
- hideInitializingCode: true,
143
- rgf: true,
144
- compact: false,
145
- renameVariables: true,
146
- }
147
- );
148
-
149
- var value = "never_called";
150
- function input(_, valueIn) {
151
- value = valueIn;
152
- }
153
-
154
- eval(output);
155
- expect(value).toStrictEqual(60);
156
- });
157
-
158
129
  // https://github.com/MichaelXF/js-confuser/issues/64
159
130
  it("should work on Arrow Functions", async () => {
160
131
  var output = await JsConfuser.obfuscate(
@@ -288,6 +259,62 @@ input(console.log, result)
288
259
 
289
260
  expect(output).not.toContain("new Function");
290
261
  });
262
+
263
+ it("should work with Control Flow Flattening and Duplicate Literals Removal enabled", async () => {
264
+ var output = await JsConfuser.obfuscate(
265
+ `
266
+ var x = [1,1,1,1,1,1,1,1,1,1];
267
+
268
+ function myFunction(){
269
+ return 1;
270
+ };
271
+
272
+ input( myFunction() ); // 1
273
+ `,
274
+ {
275
+ target: "node",
276
+ controlFlowFlattening: true,
277
+ duplicateLiteralsRemoval: true,
278
+ rgf: true,
279
+ }
280
+ );
281
+
282
+ var value = "never_called";
283
+ function input(valueIn) {
284
+ value = valueIn;
285
+ }
286
+
287
+ eval(output);
288
+
289
+ expect(value).toStrictEqual(1);
290
+ });
291
+
292
+ it("should work with String Encoding enabled", async () => {
293
+ var output = await JsConfuser.obfuscate(
294
+ `
295
+ function myFunction(){
296
+ var val1 = "\\x43\\x6F\\x72\\x72\\x65\\x63\\x74\\x20\\x56\\x61\\x6C\\x75\\x65"; // "Correct Value"
297
+ var val2 = "Correct Value";
298
+ return val1 === val2;
299
+ }
300
+
301
+ TEST_OUTPUT = myFunction(); // true
302
+ `,
303
+ {
304
+ target: "node",
305
+ rgf: true,
306
+ stringEncoding: true,
307
+ }
308
+ );
309
+
310
+ // Ensure RGF applied
311
+ expect(output).toContain("new Function");
312
+
313
+ var TEST_OUTPUT;
314
+ eval(output);
315
+
316
+ expect(TEST_OUTPUT).toStrictEqual(true);
317
+ });
291
318
  });
292
319
 
293
320
  describe("RGF with the 'all' mode", () => {