js-confuser 1.7.1 → 1.7.3

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 (153) hide show
  1. package/.github/workflows/node.js.yml +1 -1
  2. package/CHANGELOG.md +73 -0
  3. package/README.md +32 -31
  4. package/dist/compiler.js +2 -8
  5. package/dist/constants.js +22 -10
  6. package/dist/index.js +15 -30
  7. package/dist/obfuscator.js +15 -62
  8. package/dist/options.js +33 -40
  9. package/dist/order.js +4 -7
  10. package/dist/parser.js +5 -13
  11. package/dist/precedence.js +6 -8
  12. package/dist/presets.js +4 -6
  13. package/dist/probability.js +13 -24
  14. package/dist/templates/bufferToString.js +121 -5
  15. package/dist/templates/core.js +35 -0
  16. package/dist/templates/crash.js +22 -11
  17. package/dist/templates/es5.js +125 -6
  18. package/dist/templates/functionLength.js +24 -6
  19. package/dist/templates/globals.js +9 -0
  20. package/dist/templates/template.js +189 -43
  21. package/dist/transforms/antiTooling.js +26 -22
  22. package/dist/transforms/calculator.js +19 -55
  23. package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +242 -333
  24. package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +46 -25
  25. package/dist/transforms/deadCode.js +542 -31
  26. package/dist/transforms/dispatcher.js +112 -112
  27. package/dist/transforms/es5/antiClass.js +70 -44
  28. package/dist/transforms/es5/antiDestructuring.js +14 -38
  29. package/dist/transforms/es5/antiES6Object.js +39 -48
  30. package/dist/transforms/es5/antiSpreadOperator.js +5 -14
  31. package/dist/transforms/es5/antiTemplate.js +10 -19
  32. package/dist/transforms/es5/es5.js +7 -40
  33. package/dist/transforms/extraction/classExtraction.js +83 -0
  34. package/dist/transforms/extraction/duplicateLiteralsRemoval.js +41 -80
  35. package/dist/transforms/extraction/objectExtraction.js +24 -56
  36. package/dist/transforms/finalizer.js +6 -20
  37. package/dist/transforms/flatten.js +51 -99
  38. package/dist/transforms/identifier/globalAnalysis.js +21 -26
  39. package/dist/transforms/identifier/globalConcealing.js +72 -56
  40. package/dist/transforms/identifier/movedDeclarations.js +66 -38
  41. package/dist/transforms/identifier/renameVariables.js +36 -68
  42. package/dist/transforms/identifier/variableAnalysis.js +21 -48
  43. package/dist/transforms/lock/antiDebug.js +20 -25
  44. package/dist/transforms/lock/integrity.js +53 -52
  45. package/dist/transforms/lock/lock.js +161 -126
  46. package/dist/transforms/minify.js +77 -108
  47. package/dist/transforms/opaquePredicates.js +12 -49
  48. package/dist/transforms/preparation.js +28 -49
  49. package/dist/transforms/renameLabels.js +5 -22
  50. package/dist/transforms/rgf.js +125 -72
  51. package/dist/transforms/shuffle.js +42 -47
  52. package/dist/transforms/stack.js +41 -98
  53. package/dist/transforms/string/encoding.js +76 -27
  54. package/dist/transforms/string/stringCompression.js +75 -68
  55. package/dist/transforms/string/stringConcealing.js +127 -135
  56. package/dist/transforms/string/stringEncoding.js +6 -26
  57. package/dist/transforms/string/stringSplitting.js +5 -30
  58. package/dist/transforms/transform.js +76 -104
  59. package/dist/traverse.js +11 -18
  60. package/dist/util/compare.js +27 -29
  61. package/dist/util/gen.js +32 -86
  62. package/dist/util/guard.js +5 -1
  63. package/dist/util/identifiers.js +9 -72
  64. package/dist/util/insert.js +27 -77
  65. package/dist/util/math.js +0 -3
  66. package/dist/util/object.js +3 -7
  67. package/dist/util/random.js +31 -36
  68. package/dist/util/scope.js +6 -3
  69. package/docs/Countermeasures.md +13 -6
  70. package/docs/Integrity.md +35 -28
  71. package/docs/RGF.md +6 -1
  72. package/docs/RenameVariables.md +116 -0
  73. package/docs/TamperProtection.md +100 -0
  74. package/docs/Template.md +117 -0
  75. package/package.json +3 -3
  76. package/src/constants.ts +17 -0
  77. package/src/index.ts +7 -5
  78. package/src/options.ts +60 -7
  79. package/src/order.ts +2 -2
  80. package/src/templates/bufferToString.ts +79 -11
  81. package/src/templates/core.ts +29 -0
  82. package/src/templates/crash.ts +6 -38
  83. package/src/templates/es5.ts +1 -1
  84. package/src/templates/functionLength.ts +21 -3
  85. package/src/templates/globals.ts +3 -0
  86. package/src/templates/template.ts +205 -46
  87. package/src/transforms/antiTooling.ts +33 -11
  88. package/src/transforms/calculator.ts +4 -2
  89. package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +12 -5
  90. package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +46 -10
  91. package/src/transforms/deadCode.ts +74 -42
  92. package/src/transforms/dispatcher.ts +99 -73
  93. package/src/transforms/es5/antiClass.ts +25 -12
  94. package/src/transforms/es5/antiDestructuring.ts +1 -1
  95. package/src/transforms/es5/antiES6Object.ts +2 -2
  96. package/src/transforms/es5/antiTemplate.ts +1 -1
  97. package/src/transforms/extraction/classExtraction.ts +168 -0
  98. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +11 -16
  99. package/src/transforms/extraction/objectExtraction.ts +4 -15
  100. package/src/transforms/flatten.ts +20 -5
  101. package/src/transforms/identifier/globalAnalysis.ts +18 -1
  102. package/src/transforms/identifier/globalConcealing.ts +119 -72
  103. package/src/transforms/identifier/movedDeclarations.ts +90 -24
  104. package/src/transforms/identifier/renameVariables.ts +16 -1
  105. package/src/transforms/lock/antiDebug.ts +2 -2
  106. package/src/transforms/lock/integrity.ts +13 -11
  107. package/src/transforms/lock/lock.ts +122 -30
  108. package/src/transforms/minify.ts +28 -13
  109. package/src/transforms/opaquePredicates.ts +2 -2
  110. package/src/transforms/preparation.ts +16 -0
  111. package/src/transforms/rgf.ts +139 -12
  112. package/src/transforms/shuffle.ts +3 -3
  113. package/src/transforms/stack.ts +19 -4
  114. package/src/transforms/string/encoding.ts +88 -51
  115. package/src/transforms/string/stringCompression.ts +86 -17
  116. package/src/transforms/string/stringConcealing.ts +148 -118
  117. package/src/transforms/string/stringEncoding.ts +1 -2
  118. package/src/transforms/string/stringSplitting.ts +1 -2
  119. package/src/transforms/transform.ts +63 -46
  120. package/src/types.ts +2 -0
  121. package/src/util/compare.ts +39 -5
  122. package/src/util/gen.ts +10 -3
  123. package/src/util/guard.ts +10 -0
  124. package/src/util/insert.ts +17 -0
  125. package/src/util/random.ts +81 -1
  126. package/src/util/scope.ts +14 -2
  127. package/test/code/Cash.test.ts +94 -5
  128. package/test/code/StrictMode.src.js +65 -0
  129. package/test/code/StrictMode.test.js +37 -0
  130. package/test/compare.test.ts +62 -2
  131. package/test/options.test.ts +129 -55
  132. package/test/templates/template.test.ts +211 -1
  133. package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +37 -18
  134. package/test/transforms/dispatcher.test.ts +55 -0
  135. package/test/transforms/extraction/classExtraction.test.ts +86 -0
  136. package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +8 -0
  137. package/test/transforms/extraction/objectExtraction.test.ts +2 -0
  138. package/test/transforms/identifier/globalConcealing.test.ts +89 -0
  139. package/test/transforms/identifier/movedDeclarations.test.ts +61 -0
  140. package/test/transforms/identifier/renameVariables.test.ts +75 -1
  141. package/test/transforms/lock/tamperProtection.test.ts +336 -0
  142. package/test/transforms/minify.test.ts +37 -0
  143. package/test/transforms/rgf.test.ts +50 -0
  144. package/dist/transforms/controlFlowFlattening/choiceFlowObfuscation.js +0 -62
  145. package/dist/transforms/controlFlowFlattening/controlFlowObfuscation.js +0 -159
  146. package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +0 -106
  147. package/dist/transforms/eval.js +0 -84
  148. package/dist/transforms/hexadecimalNumbers.js +0 -63
  149. package/dist/transforms/hideInitializingCode.js +0 -270
  150. package/dist/transforms/identifier/nameRecycling.js +0 -218
  151. package/dist/transforms/label.js +0 -67
  152. package/dist/transforms/preparation/nameConflicts.js +0 -116
  153. package/dist/transforms/preparation/preparation.js +0 -188
@@ -15,7 +15,7 @@ jobs:
15
15
 
16
16
  strategy:
17
17
  matrix:
18
- node-version: [14.15, 16.10, 18.0]
18
+ node-version: [14.15, 16.10, 18.0, 20.16]
19
19
  # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
20
20
 
21
21
  steps:
package/CHANGELOG.md CHANGED
@@ -1,3 +1,76 @@
1
+ # `1.7.3`
2
+ Tamper Protection
3
+
4
+ ### `Tamper Protection`
5
+
6
+ Tamper Protection safeguards the runtime behavior from being altered by JavaScript pitfalls.
7
+
8
+ [Learn more here.](/docs/TamperProtection.md)
9
+
10
+ ---
11
+
12
+ - Rename Variables improvements:
13
+
14
+ - A new exposed function, `__JS_CONFUSER_VAR__`, can be used to access renamed variables. [Learn more here](/docs/RenameVariables.md).
15
+
16
+
17
+ ```js
18
+ // Input
19
+ var name = "John Doe";
20
+ eval("console.log(" + __JS_CONFUSER_VAR__(name) + ")");
21
+
22
+ // Output
23
+ var CA1HU0 = 'John Doe';
24
+ eval('console.log(' + 'CA1HU0' + ')');
25
+ ```
26
+
27
+ - Improved the `Zero Width` identifier generator (Thanks @doctor8296!)
28
+
29
+ - Pad the `String Concealing` array with more fake strings
30
+
31
+ - Improve `String Compression`
32
+
33
+ - New Web UI sneak peak: https://new--confuser.netlify.app/
34
+
35
+
36
+ # `1.7.2`
37
+ Updates
38
+
39
+ - `Anti Tooling` & `Expression Obfuscation` improvements
40
+ - - No longer expanded by [webcrack](https://github.com/j4k0xb/webcrack), [synchrony](https://github.com/relative/synchrony) & [REstringer](https://github.com/PerimeterX/restringer)
41
+
42
+ - `String Concealing` improvements
43
+ - - Randomizes the charset for each obfuscation
44
+ - - Place multiple decryption functions throughout the code
45
+ - - These changes aim to defeat [JSConfuser-String-Decryptor](https://github.com/0v41n/JSConfuser-String-Decryptor) and any other RegEx-based decoders
46
+
47
+ - `Moved Declarations` improvements
48
+ - - Now moves some variables as unused parameters on certain functions
49
+
50
+ - `RGF` improvements
51
+ - - More likely to transform functions containing functions
52
+
53
+ - Fixed [#96](https://github.com/MichaelXF/js-confuser/issues/96)
54
+ - - Removed hardcoded limits on `String Concealing`, `String Compression`, and `Duplicate Literals Removal`
55
+
56
+ - Fixed [#106](https://github.com/MichaelXF/js-confuser/issues/106)
57
+ - - Final fix with const variables for `Object Extraction`
58
+
59
+ - Fixed [#131](https://github.com/MichaelXF/js-confuser/issues/131)
60
+ - - __dirname is no longer changed by `Global Concealing`
61
+
62
+ **New Option**
63
+
64
+ ### `preserveFunctionLength`
65
+ - Modified functions will retain the correct `function.length` property. (`true/false`)
66
+ Enabled by default.
67
+
68
+ Minor improvements
69
+ - Preserve `function.length`
70
+ - Preserve Strict Mode behaviors
71
+ - Preserve indirect vs. direct [`eval`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) use
72
+
73
+
1
74
  # `1.7.1`
2
75
  Updates
3
76
 
package/README.md CHANGED
@@ -131,6 +131,8 @@ Converts output to ES5-compatible code. (`true/false`)
131
131
 
132
132
  Does not cover all cases such as Promises or Generator functions. Use [Babel](https://babel.dev/).
133
133
 
134
+ [Learn more here.](https://github.com/MichaelXF/js-confuser/blob/master/docs/ES5.md)
135
+
134
136
  ### `renameVariables`
135
137
 
136
138
  Determines if variables should be renamed. (`true/false`)
@@ -181,33 +183,12 @@ var qFaI6S = function () {
181
183
  qFaI6S();
182
184
  ```
183
185
 
186
+ [Learn mode here.](https://github.com/MichaelXF/js-confuser/blob/master/docs/RenameVariables.md)
187
+
184
188
  ### `renameGlobals`
185
189
 
186
190
  Renames top-level variables, turn this off for web-related scripts. Enabled by default. (`true/false`)
187
191
 
188
- ```js
189
- // Output (Same input from above)
190
- var twoSum = function (Oc4nmjB, Fk3nptX) {
191
- var on_KnCm = {};
192
- var lqAauc = Oc4nmjB["length"];
193
- for (var mALijp8 = 0; mALijp8 < lqAauc; mALijp8++) {
194
- if (Oc4nmjB[mALijp8] in on_KnCm) {
195
- return [on_KnCm[Oc4nmjB[mALijp8]], mALijp8];
196
- }
197
- on_KnCm[Fk3nptX - Oc4nmjB[mALijp8]] = mALijp8;
198
- }
199
- return [-1, -1];
200
- };
201
- var test = function () {
202
- var y5ySeZ = [2, 7, 11, 15];
203
- var gHYMOm = 9;
204
- var aAdj3v = [0, 1];
205
- var GnLVHX = twoSum(y5ySeZ, gHYMOm);
206
- !(ok(GnLVHX[0] === aAdj3v[0]), ok(GnLVHX[1] === aAdj3v[1]));
207
- };
208
- test();
209
- ```
210
-
211
192
  ### `identifierGenerator`
212
193
 
213
194
  Determines how variables are renamed.
@@ -392,8 +373,11 @@ yAt1T_y(-93)["log"]("Hello World");
392
373
  ```
393
374
 
394
375
  ### `stringCompression`
376
+
395
377
  String Compression uses LZW's compression algorithm to compress strings. (`true/false/0-1`)
396
378
 
379
+ Use a number to control the percentage of strings.
380
+
397
381
  `"console"` -> `inflate('replaĕ!ğğuģģ<~@')`
398
382
 
399
383
  ### `stringConcealing`
@@ -408,6 +392,8 @@ Use a number to control the percentage of strings.
408
392
 
409
393
  String Encoding transforms a string into an encoded representation. (`true/false/0-1`)
410
394
 
395
+ **⚠️ Warning: Significantly increases file size! It is not recommended for most use cases.**
396
+
411
397
  Use a number to control the percentage of strings.
412
398
 
413
399
  `"console"` -> `'\x63\x6f\x6e\x73\x6f\x6c\x65'`
@@ -595,9 +581,16 @@ Creates a calculator function to handle arithmetic and logical expressions. (`tr
595
581
 
596
582
  Adds `debugger` statements throughout the code. Additionally adds a background function for DevTools detection. (`true/false/0-1`)
597
583
 
598
- ### `lock.context`
584
+ ### `lock.tamperProtection`
599
585
 
600
- Properties that must be present on the `window` object (or `global` for NodeJS). (`string[]`)
586
+ Tamper Protection safeguards the runtime behavior from being altered by JavaScript pitfalls. (`true/false`)
587
+
588
+ **⚠️ Tamper Protection requires eval and ran in a non-strict mode environment!**
589
+
590
+ - **This can break your code.**
591
+ - **Due to the security concerns of arbitrary code execution, you must enable this yourself.**
592
+
593
+ [Learn more here](https://github.com/MichaelXF/js-confuser/blob/master/TamperProtection.md).
601
594
 
602
595
  ### `lock.startDate`
603
596
 
@@ -647,10 +640,14 @@ Integrity ensures the source code is unchanged. (`true/false/0-1`)
647
640
 
648
641
  A custom callback function to invoke when a lock is triggered. (`string/false`)
649
642
 
650
- [Learn more about the countermeasures function](https://github.com/MichaelXF/js-confuser/blob/master/docs/Countermeasures.md).
643
+ [Learn more here.](https://github.com/MichaelXF/js-confuser/blob/master/docs/Countermeasures.md)
651
644
 
652
645
  Otherwise, the obfuscator falls back to crashing the process.
653
646
 
647
+ ### `lock.context`
648
+
649
+ Properties that must be present on the `window` object (or `global` for NodeJS). (`string[]`)
650
+
654
651
  ### `movedDeclarations`
655
652
 
656
653
  Moves variable declarations to the top of the context. (`true/false`)
@@ -666,9 +663,8 @@ function getAreaOfCircle(radius) {
666
663
  }
667
664
 
668
665
  // Output
669
- function getAreaOfCircle(yLu5YB1) {
670
- var eUf7Wle, XVYH4D;
671
- var F8QuPL = Math["PI"];
666
+ function getAreaOfCircle(yLu5YB1, eUf7Wle, XVYH4D, F8QuPL) {
667
+ F8QuPL = Math["PI"];
672
668
  typeof ((eUf7Wle = Math["pow"](yLu5YB1, 2)), (XVYH4D = F8QuPL * eUf7Wle));
673
669
  return XVYH4D;
674
670
  }
@@ -804,6 +800,7 @@ You must enable locks yourself, and configure them to your needs.
804
800
  lock: {
805
801
  integrity: true,
806
802
  selfDefending: true,
803
+ tamperProtection: true,
807
804
  domainLock: ["mywebsite.com"],
808
805
  osLock: ["windows", "linux"],
809
806
  browserLock: ["firefox"],
@@ -832,10 +829,14 @@ These features are experimental or a security concern.
832
829
  // set to false for web-related scripts
833
830
  renameGlobals: false,
834
831
 
835
- // experimental
832
+ // custom implementation
836
833
  identifierGenerator: function(){
837
834
  return "myvar_" + (counter++);
838
- }
835
+ },
836
+
837
+ // Modified functions will retain the correct `function.length` property.
838
+ // Enabled by default.
839
+ preserveFunctionLength: false
839
840
  }
840
841
  ```
841
842
 
package/dist/compiler.js CHANGED
@@ -5,22 +5,18 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.compileJsSync = compileJsSync;
7
7
  exports.default = compileJs;
8
-
9
8
  const escodegen = require("escodegen");
10
-
11
9
  async function compileJs(tree, options) {
12
10
  return compileJsSync(tree, options);
13
11
  }
14
-
15
12
  function compileJsSync(tree, options) {
16
13
  var api = {
17
- format: { ...escodegen.FORMAT_MINIFY
14
+ format: {
15
+ ...escodegen.FORMAT_MINIFY
18
16
  }
19
17
  };
20
-
21
18
  if (!options.compact) {
22
19
  api = {};
23
-
24
20
  if (options.indent && options.indent != 4) {
25
21
  api.format = {};
26
22
  api.format.indent = {
@@ -31,10 +27,8 @@ function compileJsSync(tree, options) {
31
27
  };
32
28
  }
33
29
  }
34
-
35
30
  if (options.debugComments) {
36
31
  api.comment = true;
37
32
  }
38
-
39
33
  return escodegen.generate(tree, api);
40
34
  }
package/dist/constants.js CHANGED
@@ -3,20 +3,32 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.reservedKeywords = exports.reservedIdentifiers = exports.placeholderVariablePrefix = exports.noRenameVariablePrefix = void 0;
7
-
6
+ exports.variableFunctionName = exports.reservedKeywords = exports.reservedIdentifiers = exports.predictableFunctionTag = exports.placeholderVariablePrefix = exports.noRenameVariablePrefix = exports.criticalFunctionTag = void 0;
8
7
  /**
9
8
  * Keywords disallowed for variable names in ES5 and under.
10
9
  */
11
- const reservedKeywords = new Set(["abstract", "arguments", "await", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "debugger", "default", "delete", "do", "double", "else", "enum", "eval", "export", "extends", "false", "final", "finally", "float", "for", "function", "goto", "if", "implements", "import", "in", "instanceof", "int", "interface", "let", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "typeof", "var", "void", "volatile", "while", "with", "yield"]);
10
+ const reservedKeywords = exports.reservedKeywords = new Set(["abstract", "arguments", "await", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "debugger", "default", "delete", "do", "double", "else", "enum", "eval", "export", "extends", "false", "final", "finally", "float", "for", "function", "goto", "if", "implements", "import", "in", "instanceof", "int", "interface", "let", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "typeof", "var", "void", "volatile", "while", "with", "yield"]);
11
+
12
12
  /**
13
13
  * Identifiers that are not actually variables.
14
14
  */
15
+ const reservedIdentifiers = exports.reservedIdentifiers = new Set(["undefined", "null", "NaN", "Infinity", "eval", "arguments"]);
16
+ const noRenameVariablePrefix = exports.noRenameVariablePrefix = "__NO_JS_CONFUSER_RENAME__";
17
+ const placeholderVariablePrefix = exports.placeholderVariablePrefix = "__p_";
18
+
19
+ /**
20
+ * Tells the obfuscator this function is predictable:
21
+ * - Never called with extraneous parameters
22
+ */
23
+ const predictableFunctionTag = exports.predictableFunctionTag = "__JS_PREDICT__";
15
24
 
16
- exports.reservedKeywords = reservedKeywords;
17
- const reservedIdentifiers = new Set(["undefined", "null", "NaN", "Infinity", "eval", "arguments"]);
18
- exports.reservedIdentifiers = reservedIdentifiers;
19
- const noRenameVariablePrefix = "__NO_JS_CONFUSER_RENAME__";
20
- exports.noRenameVariablePrefix = noRenameVariablePrefix;
21
- const placeholderVariablePrefix = "__p_";
22
- exports.placeholderVariablePrefix = placeholderVariablePrefix;
25
+ /**
26
+ * Tells the obfuscator this function is critical for the Obfuscated code.
27
+ * - Example: string decryption function
28
+ */
29
+ const criticalFunctionTag = exports.criticalFunctionTag = "__JS_CRITICAL__";
30
+
31
+ /**
32
+ * Allows the user to grab the variable name of a renamed variable.
33
+ */
34
+ const variableFunctionName = exports.variableFunctionName = "__JS_CONFUSER_VAR__";
package/dist/index.js CHANGED
@@ -9,6 +9,12 @@ Object.defineProperty(exports, "Obfuscator", {
9
9
  return _obfuscator.default;
10
10
  }
11
11
  });
12
+ Object.defineProperty(exports, "Template", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _template.default;
16
+ }
17
+ });
12
18
  Object.defineProperty(exports, "Transform", {
13
19
  enumerable: true,
14
20
  get: function () {
@@ -24,29 +30,18 @@ Object.defineProperty(exports, "presets", {
24
30
  return _presets.default;
25
31
  }
26
32
  });
27
-
28
33
  var _compiler = _interopRequireWildcard(require("./compiler"));
29
-
30
34
  var _parser = _interopRequireWildcard(require("./parser"));
31
-
32
35
  var _obfuscator = _interopRequireDefault(require("./obfuscator"));
33
-
34
36
  var _transform = _interopRequireDefault(require("./transforms/transform"));
35
-
37
+ var _template = _interopRequireDefault(require("./templates/template"));
36
38
  var _object = require("./util/object");
37
-
38
39
  var _presets = _interopRequireDefault(require("./presets"));
39
-
40
40
  var assert = _interopRequireWildcard(require("assert"));
41
-
42
41
  var _options = require("./options");
43
-
44
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
45
-
46
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
47
-
48
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
49
-
42
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
43
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
44
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
50
45
  /**
51
46
  * **JsConfuser**: Obfuscates JavaScript.
52
47
  * @param code - The code to be obfuscated.
@@ -55,6 +50,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
55
50
  async function obfuscate(code, options) {
56
51
  return await JsConfuser(code, options);
57
52
  }
53
+
58
54
  /**
59
55
  * Obfuscates an [ESTree](https://github.com/estree/estree) compliant AST.
60
56
  *
@@ -65,8 +61,6 @@ async function obfuscate(code, options) {
65
61
  *
66
62
  * [See all settings here](https://github.com/MichaelXF/js-confuser#options)
67
63
  */
68
-
69
-
70
64
  async function obfuscateAST(AST, options) {
71
65
  assert.ok(typeof AST === "object", "AST must be type object");
72
66
  assert.ok(AST.type == "Program", "AST.type must be equal to 'Program'");
@@ -77,18 +71,16 @@ async function obfuscateAST(AST, options) {
77
71
  options.verbose && console.log("* Removing $ properties");
78
72
  (0, _object.remove$Properties)(AST);
79
73
  }
74
+
80
75
  /**
81
76
  * **JsConfuser**: Obfuscates JavaScript.
82
77
  * @param code - The code to be obfuscated.
83
78
  * @param options - An object of obfuscation options: `{preset: "medium", target: "browser"}`.
84
79
  */
85
-
86
-
87
80
  var JsConfuser = async function (code, options) {
88
81
  if (typeof code !== "string") {
89
82
  throw new TypeError("code must be type string");
90
83
  }
91
-
92
84
  (0, _options.validateOptions)(options);
93
85
  options = await (0, _options.correctOptions)(options);
94
86
  options.verbose && console.log("* Parsing source code");
@@ -102,7 +94,6 @@ var JsConfuser = async function (code, options) {
102
94
  var result = await (0, _compiler.default)(tree, options);
103
95
  return result;
104
96
  };
105
-
106
97
  const debugTransformations = async function (code, options) {
107
98
  (0, _options.validateOptions)(options);
108
99
  options = await (0, _options.correctOptions)(options);
@@ -121,6 +112,7 @@ const debugTransformations = async function (code, options) {
121
112
  await obfuscator.apply(tree, true);
122
113
  return frames;
123
114
  };
115
+
124
116
  /**
125
117
  * This method is used by the obfuscator website to display a progress bar and additional information
126
118
  * about the obfuscation.
@@ -130,10 +122,7 @@ const debugTransformations = async function (code, options) {
130
122
  * @param callback - Progress callback, called after each transformation
131
123
  * @returns
132
124
  */
133
-
134
-
135
125
  exports.debugTransformations = debugTransformations;
136
-
137
126
  const debugObfuscation = async function (code, options, callback, performance) {
138
127
  const startTime = performance.now();
139
128
  (0, _options.validateOptions)(options);
@@ -166,7 +155,6 @@ const debugObfuscation = async function (code, options, callback, performance) {
166
155
  totalPossibleTransforms: obfuscator.totalPossibleTransforms
167
156
  };
168
157
  };
169
-
170
158
  exports.debugObfuscation = debugObfuscation;
171
159
  JsConfuser.obfuscate = obfuscate;
172
160
  JsConfuser.obfuscateAST = obfuscateAST;
@@ -175,14 +163,11 @@ JsConfuser.debugTransformations = debugTransformations;
175
163
  JsConfuser.debugObfuscation = debugObfuscation;
176
164
  JsConfuser.Obfuscator = _obfuscator.default;
177
165
  JsConfuser.Transform = _transform.default;
178
-
166
+ JsConfuser.Template = _template.default;
179
167
  if (typeof window !== "undefined") {
180
168
  window["JsConfuser"] = JsConfuser;
181
169
  }
182
-
183
170
  if (typeof global !== "undefined") {
184
171
  global["JsConfuser"] = JsConfuser;
185
172
  }
186
-
187
- var _default = JsConfuser;
188
- exports.default = _default;
173
+ var _default = exports.default = JsConfuser;
@@ -4,110 +4,72 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _assert = require("assert");
9
-
10
8
  var _events = require("events");
11
-
12
9
  var _traverse = _interopRequireDefault(require("./traverse"));
13
-
14
10
  var _probability = require("./probability");
15
-
16
11
  var _preparation = _interopRequireDefault(require("./transforms/preparation"));
17
-
18
12
  var _objectExtraction = _interopRequireDefault(require("./transforms/extraction/objectExtraction"));
19
-
20
13
  var _lock = _interopRequireDefault(require("./transforms/lock/lock"));
21
-
22
14
  var _dispatcher = _interopRequireDefault(require("./transforms/dispatcher"));
23
-
24
15
  var _deadCode = _interopRequireDefault(require("./transforms/deadCode"));
25
-
26
16
  var _opaquePredicates = _interopRequireDefault(require("./transforms/opaquePredicates"));
27
-
28
17
  var _calculator = _interopRequireDefault(require("./transforms/calculator"));
29
-
30
18
  var _controlFlowFlattening = _interopRequireDefault(require("./transforms/controlFlowFlattening/controlFlowFlattening"));
31
-
32
19
  var _globalConcealing = _interopRequireDefault(require("./transforms/identifier/globalConcealing"));
33
-
34
20
  var _stringSplitting = _interopRequireDefault(require("./transforms/string/stringSplitting"));
35
-
36
21
  var _stringConcealing = _interopRequireDefault(require("./transforms/string/stringConcealing"));
37
-
38
22
  var _stringCompression = _interopRequireDefault(require("./transforms/string/stringCompression"));
39
-
40
23
  var _duplicateLiteralsRemoval = _interopRequireDefault(require("./transforms/extraction/duplicateLiteralsRemoval"));
41
-
42
24
  var _shuffle = _interopRequireDefault(require("./transforms/shuffle"));
43
-
44
25
  var _movedDeclarations = _interopRequireDefault(require("./transforms/identifier/movedDeclarations"));
45
-
46
26
  var _renameVariables = _interopRequireDefault(require("./transforms/identifier/renameVariables"));
47
-
48
27
  var _renameLabels = _interopRequireDefault(require("./transforms/renameLabels"));
49
-
50
28
  var _minify = _interopRequireDefault(require("./transforms/minify"));
51
-
52
29
  var _es = _interopRequireDefault(require("./transforms/es5/es5"));
53
-
54
30
  var _rgf = _interopRequireDefault(require("./transforms/rgf"));
55
-
56
31
  var _flatten = _interopRequireDefault(require("./transforms/flatten"));
57
-
58
32
  var _stack = _interopRequireDefault(require("./transforms/stack"));
59
-
60
33
  var _antiTooling = _interopRequireDefault(require("./transforms/antiTooling"));
61
-
62
34
  var _finalizer = _interopRequireDefault(require("./transforms/finalizer"));
63
-
64
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
65
-
66
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
67
-
35
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
36
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
37
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
38
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
68
39
  /**
69
40
  * The parent transformation holding the `state`.
70
41
  */
71
42
  class Obfuscator extends _events.EventEmitter {
72
43
  constructor(options) {
73
44
  var _this;
74
-
75
45
  super();
76
46
  _this = this;
77
47
  this.options = options;
78
-
79
48
  _defineProperty(this, "varCount", void 0);
80
-
81
49
  _defineProperty(this, "transforms", void 0);
82
-
83
50
  _defineProperty(this, "array", void 0);
84
-
85
51
  _defineProperty(this, "state", "transform");
86
-
87
52
  _defineProperty(this, "generated", void 0);
88
-
89
53
  _defineProperty(this, "totalPossibleTransforms", void 0);
90
-
91
54
  this.varCount = 0;
92
55
  this.transforms = Object.create(null);
93
56
  this.generated = new Set();
94
57
  this.totalPossibleTransforms = 0;
95
-
96
58
  const test = function (map) {
97
59
  for (var _len = arguments.length, transformers = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
98
60
  transformers[_key - 1] = arguments[_key];
99
61
  }
100
-
101
62
  _this.totalPossibleTransforms += transformers.length;
102
-
103
63
  if ((0, _probability.isProbabilityMapProbable)(map)) {
104
64
  // options.verbose && console.log("+ Added " + transformer.name);
65
+
105
66
  transformers.forEach(Transformer => _this.push(new Transformer(_this)));
106
- } else {// options.verbose && console.log("- Skipped adding " + transformer.name);
67
+ } else {
68
+ // options.verbose && console.log("- Skipped adding " + transformer.name);
107
69
  }
108
- }; // Optimization: Only add needed transformers. If a probability always return false, no need in running that extra code.
109
-
70
+ };
110
71
 
72
+ // Optimization: Only add needed transformers. If a probability always return false, no need in running that extra code.
111
73
  test(true, _preparation.default);
112
74
  test(true, _renameLabels.default);
113
75
  test(options.objectExtraction, _objectExtraction.default);
@@ -134,28 +96,25 @@ class Obfuscator extends _events.EventEmitter {
134
96
 
135
97
  if (options.lock && Object.keys(options.lock).filter(x => x == "domainLock" ? options.lock.domainLock && options.lock.domainLock.length : options.lock[x]).length) {
136
98
  test(true, _lock.default);
137
- } // Make array
138
-
99
+ }
139
100
 
140
- this.array = Object.values(this.transforms); // Sort transformations based on their priority
101
+ // Make array
102
+ this.array = Object.values(this.transforms);
141
103
 
104
+ // Sort transformations based on their priority
142
105
  this.array.sort((a, b) => a.priority - b.priority);
143
106
  }
144
-
145
107
  push(transform) {
146
108
  if (transform.className) {
147
109
  (0, _assert.ok)(!this.transforms[transform.className], "Already have " + transform.className);
148
110
  }
149
-
150
111
  this.transforms[transform.className] = transform;
151
112
  }
152
-
153
113
  resetState() {
154
114
  this.varCount = 0;
155
115
  this.generated = new Set();
156
116
  this.state = "transform";
157
117
  }
158
-
159
118
  async apply(tree) {
160
119
  let debugMode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
161
120
  (0, _assert.ok)(tree.type == "Program", "The root node must be type 'Program'");
@@ -163,22 +122,19 @@ class Obfuscator extends _events.EventEmitter {
163
122
  (0, _assert.ok)(Array.isArray(this.array));
164
123
  this.resetState();
165
124
  var completed = 0;
166
-
167
125
  for (var transform of this.array) {
168
126
  await transform.apply(tree);
169
127
  completed++;
170
-
171
128
  if (debugMode) {
172
129
  this.emit("debug", transform.className, tree, completed);
173
130
  }
174
131
  }
175
-
176
132
  if (this.options.verbose) {
177
133
  console.log("-> Check for Eval Callbacks");
178
134
  }
135
+ this.state = "eval";
179
136
 
180
- this.state = "eval"; // Find eval callbacks
181
-
137
+ // Find eval callbacks
182
138
  (0, _traverse.default)(tree, (o, p) => {
183
139
  if (o.$eval) {
184
140
  return () => {
@@ -186,12 +142,9 @@ class Obfuscator extends _events.EventEmitter {
186
142
  };
187
143
  }
188
144
  });
189
-
190
145
  if (this.options.verbose) {
191
146
  console.log("<- Done");
192
147
  }
193
148
  }
194
-
195
149
  }
196
-
197
150
  exports.default = Obfuscator;