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,48 +4,30 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _transform = _interopRequireDefault(require("./transform"));
9
-
10
8
  var _gen = require("../util/gen");
11
-
12
9
  var _insert = require("../util/insert");
13
-
14
10
  var _random = require("../util/random");
15
-
16
11
  var _order = require("../order");
17
-
18
12
  var _assert = require("assert");
19
-
20
13
  var _precedence = require("../precedence");
21
-
22
14
  var _template = _interopRequireDefault(require("../templates/template"));
23
-
24
15
  var _probability = require("../probability");
25
-
26
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
-
28
- 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; }
29
-
16
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
+ 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; }
18
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
19
+ 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); }
30
20
  const allowedBinaryOperators = new Set(["+", "-", "*", "/"]);
31
21
  const allowedUnaryOperators = new Set(["!", "void", "typeof", "-", "~", "+"]);
32
-
33
22
  class Calculator extends _transform.default {
34
23
  constructor(o) {
35
24
  super(o, _order.ObfuscateOrder.Calculator);
36
-
37
25
  _defineProperty(this, "gen", void 0);
38
-
39
26
  _defineProperty(this, "ops", void 0);
40
-
41
27
  _defineProperty(this, "statesUsed", void 0);
42
-
43
28
  _defineProperty(this, "calculatorFn", void 0);
44
-
45
29
  _defineProperty(this, "calculatorOpVar", void 0);
46
-
47
30
  _defineProperty(this, "calculatorSetOpFn", void 0);
48
-
49
31
  this.ops = Object.create(null);
50
32
  this.statesUsed = new Set();
51
33
  this.calculatorFn = this.getPlaceholder() + "_calc";
@@ -53,14 +35,11 @@ class Calculator extends _transform.default {
53
35
  this.calculatorSetOpFn = this.getPlaceholder();
54
36
  this.gen = this.getGenerator();
55
37
  }
56
-
57
38
  apply(tree) {
58
39
  super.apply(tree);
59
-
60
40
  if (Object.keys(this.ops).length == 0) {
61
41
  return;
62
42
  }
63
-
64
43
  var leftArg = this.getPlaceholder();
65
44
  var rightArg = this.getPlaceholder();
66
45
  var switchCases = [];
@@ -68,7 +47,6 @@ class Calculator extends _transform.default {
68
47
  var [type, operator] = opKey.split("_");
69
48
  var code = this.ops[opKey];
70
49
  var body = [];
71
-
72
50
  if (type === "Binary") {
73
51
  body = [(0, _gen.ReturnStatement)((0, _gen.BinaryExpression)(operator, (0, _gen.Identifier)(leftArg), (0, _gen.Identifier)(rightArg)))];
74
52
  } else if (type === "Unary") {
@@ -76,101 +54,87 @@ class Calculator extends _transform.default {
76
54
  } else {
77
55
  throw new Error("Unknown type: " + type);
78
56
  }
79
-
80
57
  switchCases.push((0, _gen.SwitchCase)((0, _gen.Literal)(code), body));
81
58
  });
82
59
  var func = (0, _gen.FunctionDeclaration)(this.calculatorFn, [leftArg, rightArg].map(x => (0, _gen.Identifier)(x)), [(0, _gen.SwitchStatement)((0, _gen.Identifier)(this.calculatorOpVar), switchCases)]);
83
60
  (0, _insert.prepend)(tree, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(this.calculatorOpVar)));
84
- (0, _insert.prepend)(tree, (0, _template.default)("function {name}(a){\n a = {b} + ({b}=a, 0);\n return a;\n }").single({
61
+ (0, _insert.prepend)(tree, new _template.default(`function {name}(a){
62
+ a = {b} + ({b}=a, 0);
63
+ return a;
64
+ }`).single({
85
65
  name: this.calculatorSetOpFn,
86
66
  b: this.calculatorOpVar
87
67
  }));
88
68
  (0, _insert.prepend)(tree, func);
89
69
  }
90
-
91
70
  match(object, parents) {
92
71
  return object.type === "BinaryExpression" || object.type === "UnaryExpression";
93
72
  }
94
-
95
73
  transform(object, parents) {
96
74
  // Allow percentage
97
75
  if (!(0, _probability.ComputeProbabilityMap)(this.options.calculator)) {
98
76
  return;
99
77
  }
100
-
101
78
  var operator = object.operator;
102
79
  var type;
103
-
104
80
  if (object.type === "BinaryExpression") {
105
81
  type = "Binary";
106
-
107
82
  if (!allowedBinaryOperators.has(operator)) {
108
83
  return;
109
- } // Additional checks to ensure complex expressions still work
110
-
84
+ }
111
85
 
86
+ // Additional checks to ensure complex expressions still work
112
87
  var myPrecedence = _precedence.OPERATOR_PRECEDENCE[operator] + Object.keys(_precedence.OPERATOR_PRECEDENCE).indexOf(operator) / 100;
113
- var precedences = parents.map(x => x.type == "BinaryExpression" && _precedence.OPERATOR_PRECEDENCE[x.operator] + Object.keys(_precedence.OPERATOR_PRECEDENCE).indexOf(x.operator) / 100); // corrupt AST
88
+ var precedences = parents.map(x => x.type == "BinaryExpression" && _precedence.OPERATOR_PRECEDENCE[x.operator] + Object.keys(_precedence.OPERATOR_PRECEDENCE).indexOf(x.operator) / 100);
114
89
 
90
+ // corrupt AST
115
91
  if (precedences.find(x => x >= myPrecedence)) {
116
92
  return;
117
93
  }
118
-
119
- if (parents.find(x => x.$dispatcherSkip || x.type == "BinaryExpression")) {
94
+ if (parents.find(x => x.$multiTransformSkip || x.type == "BinaryExpression")) {
120
95
  return;
121
96
  }
122
97
  }
123
-
124
98
  if (object.type === "UnaryExpression") {
125
99
  type = "Unary";
126
-
127
100
  if (!allowedUnaryOperators.has(operator)) {
128
101
  return;
129
- } // Typeof expression fix
130
-
102
+ }
131
103
 
104
+ // Typeof expression fix
132
105
  if (operator === "typeof" && object.argument.type === "Identifier") {
133
106
  // `typeof name` is special because it can reference the variable `name` without
134
107
  // throwing any errors. If changed, an error could be thrown, breaking the users code
135
108
  return;
136
109
  }
137
110
  }
138
-
139
111
  return () => {
140
112
  const opKey = type + "_" + operator;
141
-
142
113
  if (typeof this.ops[opKey] !== "number") {
143
114
  var newState;
144
-
145
115
  do {
146
116
  newState = (0, _random.getRandomInteger)(-50, 50 + Object.keys(this.ops).length * 5);
147
117
  } while (this.statesUsed.has(newState));
148
-
149
118
  (0, _assert.ok)(!isNaN(newState));
150
119
  this.statesUsed.add(newState);
151
120
  this.ops[opKey] = newState;
152
-
153
121
  if (type === "Binary") {
154
- this.log("left ".concat(operator, " right ->"), "".concat(this.calculatorFn, "((").concat(newState, ", left, right)"));
122
+ this.log(`left ${operator} right ->`, `${this.calculatorFn}((${newState}, left, right)`);
155
123
  } else if (type === "Unary") {
156
- this.log("".concat(operator, "(argument) ->"), "".concat(this.calculatorFn, "(").concat(newState, ", argument)"));
124
+ this.log(`${operator}(argument) ->`, `${this.calculatorFn}(${newState}, argument)`);
157
125
  }
158
- } // The operator expression sets the operator to be used
159
-
126
+ }
160
127
 
128
+ // The operator expression sets the operator to be used
161
129
  var operatorExpression = (0, _random.choice)([(0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(this.calculatorOpVar), (0, _gen.Literal)(this.ops[opKey])), (0, _gen.CallExpression)((0, _gen.Identifier)(this.calculatorSetOpFn), [(0, _gen.Literal)(this.ops[opKey])])]);
162
130
  var newExpression;
163
-
164
131
  if (type === "Binary") {
165
132
  newExpression = (0, _gen.CallExpression)((0, _gen.Identifier)(this.calculatorFn), [object.left, object.right, operatorExpression]);
166
133
  } else {
167
134
  newExpression = (0, _gen.CallExpression)((0, _gen.Identifier)(this.calculatorFn), [object.argument, operatorExpression]);
168
135
  }
169
-
170
136
  this.replace(object, newExpression);
171
137
  };
172
138
  }
173
-
174
139
  }
175
-
176
140
  exports.default = Calculator;