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
@@ -4,27 +4,45 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
7
+ var _constants = require("../../constants");
8
+ var _template = _interopRequireDefault(require("../../templates/template"));
8
9
  var _traverse = require("../../traverse");
9
-
10
10
  var _gen = require("../../util/gen");
11
-
11
+ var _insert = require("../../util/insert");
12
12
  var _transform = _interopRequireDefault(require("../transform"));
13
-
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ 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; }
15
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
16
+ 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); }
16
17
  /**
17
18
  * Expression Obfuscation runs before Control Flow Flattening
18
19
  */
19
20
  class ExpressionObfuscation extends _transform.default {
20
21
  constructor(o) {
21
22
  super(o);
23
+ _defineProperty(this, "fnName", void 0);
24
+ }
25
+ apply(tree) {
26
+ super.apply(tree);
27
+ if (typeof this.fnName === "string") {
28
+ (0, _insert.prepend)(tree, new _template.default(`
29
+ function {fnName}(...args){
30
+ return args[args["length"] - 1]
31
+ }
32
+ `).single({
33
+ fnName: this.fnName
34
+ }));
35
+ }
36
+ }
37
+ createSequenceExpression(expressions) {
38
+ if (!this.fnName) {
39
+ this.fnName = this.getPlaceholder() + _constants.criticalFunctionTag;
40
+ }
41
+ return (0, _gen.CallExpression)((0, _gen.Identifier)(this.fnName), [...expressions]);
22
42
  }
23
-
24
43
  match(object, parents) {
25
44
  return (0, _traverse.isBlock)(object);
26
45
  }
27
-
28
46
  transform(object, parents) {
29
47
  return () => {
30
48
  var exprs = [];
@@ -32,10 +50,10 @@ class ExpressionObfuscation extends _transform.default {
32
50
  object.body.forEach((stmt, i) => {
33
51
  if (stmt.type == "ExpressionStatement" && !stmt.directive) {
34
52
  var expr = stmt.expression;
35
-
36
53
  if (expr.type == "UnaryExpression" && !(expr.operator === "typeof" && expr.argument.type === "Identifier") && exprs.length // typeof is special
37
54
  ) {
38
- expr.argument = (0, _gen.SequenceExpression)([...exprs, { ...expr.argument
55
+ expr.argument = (0, _gen.SequenceExpression)([...exprs, {
56
+ ...expr.argument
39
57
  }]);
40
58
  deleteExprs.push(...exprs);
41
59
  exprs = [];
@@ -48,63 +66,66 @@ class ExpressionObfuscation extends _transform.default {
48
66
  if (stmt.test.type == "BinaryExpression" && stmt.test.operator !== "**") {
49
67
  if (stmt.test.left.type == "UnaryExpression" && !(stmt.test.left.operator === "typeof" && stmt.test.left.argument.type === "Identifier") // typeof is special
50
68
  ) {
51
- stmt.test.left.argument = (0, _gen.SequenceExpression)([...exprs, { ...stmt.test.left.argument
69
+ stmt.test.left.argument = this.createSequenceExpression([...exprs, {
70
+ ...stmt.test.left.argument
52
71
  }]);
53
72
  } else {
54
- stmt.test.left = (0, _gen.SequenceExpression)([...exprs, { ...stmt.test.left
73
+ stmt.test.left = this.createSequenceExpression([...exprs, {
74
+ ...stmt.test.left
55
75
  }]);
56
76
  }
57
77
  } else if (stmt.test.type == "LogicalExpression" && stmt.test.left.type == "BinaryExpression" && stmt.test.operator !== "**" && stmt.test.left.left.type == "UnaryExpression") {
58
- stmt.test.left.left.argument = (0, _gen.SequenceExpression)([...exprs, { ...stmt.test.left.left.argument
78
+ stmt.test.left.left.argument = this.createSequenceExpression([...exprs, {
79
+ ...stmt.test.left.left.argument
59
80
  }]);
60
81
  } else {
61
- stmt.test = (0, _gen.SequenceExpression)([...exprs, { ...stmt.test
82
+ stmt.test = this.createSequenceExpression([...exprs, {
83
+ ...stmt.test
62
84
  }]);
63
85
  }
64
-
65
86
  deleteExprs.push(...exprs);
66
87
  } else if (stmt.type == "ForStatement" || stmt.type == "LabeledStatement" && stmt.body.type == "ForStatement") {
67
88
  var init = (stmt.type == "LabeledStatement" ? stmt.body : stmt).init;
68
-
69
89
  if (init) {
70
90
  if (init.type == "VariableDeclaration") {
71
- init.declarations[0].init = (0, _gen.SequenceExpression)([...exprs, { ...(init.declarations[0].init || (0, _gen.Identifier)("undefined"))
91
+ init.declarations[0].init = this.createSequenceExpression([...exprs, {
92
+ ...(init.declarations[0].init || (0, _gen.Identifier)("undefined"))
72
93
  }]);
73
94
  deleteExprs.push(...exprs);
74
95
  } else if (init.type == "AssignmentExpression") {
75
- init.right = (0, _gen.SequenceExpression)([...exprs, { ...(init.right || (0, _gen.Identifier)("undefined"))
96
+ init.right = this.createSequenceExpression([...exprs, {
97
+ ...(init.right || (0, _gen.Identifier)("undefined"))
76
98
  }]);
77
99
  deleteExprs.push(...exprs);
78
100
  }
79
101
  }
80
102
  } else if (stmt.type == "VariableDeclaration") {
81
- stmt.declarations[0].init = (0, _gen.SequenceExpression)([...exprs, { ...(stmt.declarations[0].init || (0, _gen.Identifier)("undefined"))
103
+ stmt.declarations[0].init = this.createSequenceExpression([...exprs, {
104
+ ...(stmt.declarations[0].init || (0, _gen.Identifier)("undefined"))
82
105
  }]);
83
106
  deleteExprs.push(...exprs);
84
107
  } else if (stmt.type == "ThrowStatement") {
85
- stmt.argument = (0, _gen.SequenceExpression)([...exprs, { ...stmt.argument
108
+ stmt.argument = this.createSequenceExpression([...exprs, {
109
+ ...stmt.argument
86
110
  }]);
87
111
  deleteExprs.push(...exprs);
88
112
  } else if (stmt.type == "ReturnStatement") {
89
- stmt.argument = (0, _gen.SequenceExpression)([...exprs, { ...(stmt.argument || (0, _gen.Identifier)("undefined"))
113
+ stmt.argument = this.createSequenceExpression([...exprs, {
114
+ ...(stmt.argument || (0, _gen.Identifier)("undefined"))
90
115
  }]);
91
116
  deleteExprs.push(...exprs);
92
117
  }
93
118
  }
94
-
95
119
  exprs = [];
96
120
  }
97
121
  });
98
122
  deleteExprs.forEach(expr => {
99
123
  var index = object.body.findIndex(x => x.expression === expr);
100
-
101
124
  if (index !== -1) {
102
125
  object.body.splice(index, 1);
103
126
  }
104
127
  });
105
128
  };
106
129
  }
107
-
108
130
  }
109
-
110
131
  exports.default = ExpressionObfuscation;