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,91 +4,70 @@ 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 _order = require("../order");
11
-
12
9
  var _probability = require("../probability");
13
-
14
10
  var _template = _interopRequireDefault(require("../templates/template"));
15
-
16
11
  var _traverse = require("../traverse");
17
-
18
12
  var _gen = require("../util/gen");
19
-
20
13
  var _identifiers = require("../util/identifiers");
21
-
22
14
  var _insert = require("../util/insert");
23
-
24
15
  var _random = require("../util/random");
25
-
26
16
  var _transform = _interopRequireDefault(require("./transform"));
27
-
28
17
  var _constants = require("../constants");
29
-
30
18
  var _functionLength = require("../templates/functionLength");
31
-
32
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
33
-
34
- 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; }
35
-
19
+ var _globals = require("../templates/globals");
20
+ var _guard = require("../util/guard");
21
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
22
+ 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; }
23
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
24
+ 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); }
36
25
  class Stack extends _transform.default {
37
26
  constructor(o) {
38
27
  super(o, _order.ObfuscateOrder.Stack);
39
-
40
28
  _defineProperty(this, "mangledExpressionsMade", void 0);
41
-
42
29
  _defineProperty(this, "functionLengthName", void 0);
43
-
44
30
  this.mangledExpressionsMade = 0;
45
31
  }
46
-
47
32
  match(object, parents) {
48
- return (0, _insert.isFunction)(object) && !object.params.find(x => x.type !== "Identifier") && object.body.type === "BlockStatement" && !parents.find(x => x.$dispatcherSkip) && !object.$requiresEval;
33
+ return (0, _insert.isFunction)(object) && !object.params.find(x => x.type !== "Identifier") && object.body.type === "BlockStatement" && !parents.find(x => x.$multiTransformSkip) && !object.$requiresEval;
49
34
  }
50
-
51
35
  transform(object, parents) {
52
36
  var _this = this;
53
-
54
37
  return () => {
55
38
  var _getBlockBody$;
56
-
57
39
  // Uncaught SyntaxError: Getter must not have any formal parameters.
58
40
  // Uncaught SyntaxError: Setter must have exactly one formal parameter
59
41
  var propIndex = parents.findIndex(x => x.type === "Property" || x.type === "MethodDefinition");
60
-
61
42
  if (propIndex !== -1) {
62
43
  if (parents[propIndex].value === (parents[propIndex - 1] || object)) {
63
44
  if (parents[propIndex].kind !== "init" || parents[propIndex].method) {
64
45
  return;
65
46
  }
66
47
  }
67
- } // Don't apply to functions with 'use strict' directive
68
-
48
+ }
69
49
 
50
+ // Don't apply to functions with 'use strict' directive
70
51
  if ((_getBlockBody$ = (0, _insert.getBlockBody)(object.body)[0]) !== null && _getBlockBody$ !== void 0 && _getBlockBody$.directive) {
71
52
  return;
72
53
  }
73
-
74
54
  if (!(0, _probability.ComputeProbabilityMap)(this.options.stack)) {
75
55
  return;
76
56
  }
77
-
78
57
  var defined = new Set();
79
58
  var referenced = new Set();
80
59
  var illegal = new Set();
60
+
81
61
  /**
82
62
  * Maps old names to new indices
83
63
  */
84
-
85
64
  var subscripts = new Map();
86
65
  var deadValues = Object.create(null);
87
66
  var propertyGen = this.getGenerator();
88
-
89
67
  function isTransformableFunction(functionNode) {
90
- if (functionNode.$requiresEval) return false; // Check for 'this'
68
+ if (functionNode.$requiresEval) return false;
91
69
 
70
+ // Check for 'this'
92
71
  var isIllegal = false;
93
72
  (0, _traverse.walk)(functionNode.body, [], (o, p) => {
94
73
  if (o.type === "ThisExpression") {
@@ -98,11 +77,9 @@ class Stack extends _transform.default {
98
77
  });
99
78
  return !isIllegal;
100
79
  }
101
-
102
80
  function setSubscript(string, index) {
103
81
  subscripts.set(string, index + "");
104
82
  }
105
-
106
83
  object.params.forEach(param => {
107
84
  (0, _assert.ok)(param.name);
108
85
  defined.add(param.name);
@@ -115,56 +92,51 @@ class Stack extends _transform.default {
115
92
  isIllegal = true;
116
93
  return "EXIT";
117
94
  }
118
-
119
95
  if (o.type == "Identifier") {
120
96
  var info = (0, _identifiers.getIdentifierInfo)(o, p);
121
-
122
97
  if (!info.spec.isReferenced || info.spec.isExported) {
123
98
  return;
124
99
  }
125
-
126
100
  var c = info.spec.isDefined ? (0, _insert.getDefiningContext)(o, p) : (0, _insert.getReferencingContexts)(o, p).find(x => (0, _insert.isVarContext)(x));
127
-
128
101
  if (c !== object) {
129
102
  // this.log(o.name + " is illegal due to different context");
130
103
  illegal.add(o.name);
131
104
  }
132
-
133
105
  if (o.name.startsWith(_constants.noRenameVariablePrefix)) {
134
106
  illegal.add(o.name);
135
107
  }
136
108
 
109
+ // Ignore __JS_CONFUSER_VAR__()
110
+ if ((0, _guard.isJSConfuserVar)(p)) {
111
+ illegal.add(o.name);
112
+ }
137
113
  if (info.isClauseParameter || info.isFunctionParameter || (0, _insert.isForInitialize)(o, p)) {
138
114
  // this.log(
139
115
  // o.name + " is illegal due to clause parameter/function parameter"
140
116
  // );
141
117
  illegal.add(o.name);
142
118
  }
143
-
144
119
  if (o.hidden) {
145
120
  illegal.add(o.name);
146
121
  }
147
-
148
122
  if (info.spec.isDefined) {
149
123
  if (defined.has(o.name)) {
150
124
  illegal.add(o.name);
151
125
  }
152
-
153
126
  if (info.isFunctionDeclaration) {
154
127
  (0, _assert.ok)(p[0].type === "FunctionDeclaration");
155
-
156
128
  if (p[0] !== object.body.body[0] || !isTransformableFunction(p[0])) {
157
129
  illegal.add(o.name);
158
130
  }
159
- } // The new accessors will either be numbered: [index] or as a string .string
160
-
131
+ }
161
132
 
133
+ // The new accessors will either be numbered: [index] or as a string .string
162
134
  var newSubscript = (0, _random.choice)([subscripts.size, propertyGen.generate()]);
163
135
  setSubscript(o.name, newSubscript);
164
- defined.add(o.name); // Stack can only process single VariableDeclarations
136
+ defined.add(o.name);
165
137
 
138
+ // Stack can only process single VariableDeclarations
166
139
  var varIndex = p.findIndex(x => x.type == "VariableDeclaration");
167
-
168
140
  if (varIndex !== -1) {
169
141
  // Invalid 'id' property (must be Identifier)
170
142
  if (varIndex !== 2) {
@@ -173,7 +145,6 @@ class Stack extends _transform.default {
173
145
  illegal.add(o.name);
174
146
  } else {
175
147
  var value = p[varIndex].declarations[0].init;
176
-
177
148
  if (value && !isTransformableFunction(value)) {
178
149
  illegal.add(o.name);
179
150
  }
@@ -182,16 +153,13 @@ class Stack extends _transform.default {
182
153
  } else if (info.spec.isReferenced) {
183
154
  if (info.spec.isModified) {
184
155
  var assignmentIndex = p.findIndex(x => x.type === "AssignmentExpression");
185
-
186
156
  if (assignmentIndex !== -1) {
187
157
  var value = p[assignmentIndex].right;
188
-
189
158
  if (value && !isTransformableFunction(value)) {
190
159
  illegal.add(o.name);
191
160
  }
192
161
  }
193
162
  }
194
-
195
163
  referenced.add(o.name);
196
164
  }
197
165
  }
@@ -207,55 +175,41 @@ class Stack extends _transform.default {
207
175
  subscripts.delete(name);
208
176
  }
209
177
  });
210
-
211
178
  if (object.params.find(x => illegal.has(x.name))) {
212
179
  return;
213
180
  }
214
-
215
181
  if (!subscripts.size) {
216
182
  return;
217
183
  }
218
-
219
184
  const numberLiteral = function (number) {
220
185
  let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
221
186
  (0, _assert.ok)(number === number);
222
-
223
187
  if (typeof number !== "number" || !Object.keys(deadValues).length || depth > 4 || (0, _random.chance)(75 + depth * 15 + _this.mangledExpressionsMade / 25)) {
224
188
  return (0, _gen.Literal)(number);
225
189
  }
226
-
227
190
  _this.mangledExpressionsMade++;
228
191
  var opposingIndex = (0, _random.choice)(Object.keys(deadValues));
229
-
230
192
  if (typeof opposingIndex === "undefined") {
231
193
  return (0, _gen.Literal)(number);
232
194
  }
233
-
234
195
  var actualValue = deadValues[opposingIndex];
235
196
  (0, _assert.ok)(typeof actualValue === "number");
236
197
  return (0, _gen.BinaryExpression)("-", (0, _gen.MemberExpression)((0, _gen.Identifier)(stackName), numberLiteral(isNaN(parseFloat(opposingIndex)) ? opposingIndex : parseFloat(opposingIndex), depth + 1), true), numberLiteral(actualValue - number, depth + 1));
237
198
  };
238
-
239
199
  function getMemberExpression(index) {
240
200
  (0, _assert.ok)(typeof index === "string", typeof index);
241
201
  return (0, _gen.MemberExpression)((0, _gen.Identifier)(stackName), numberLiteral(isNaN(parseFloat(index)) ? index : parseFloat(index)), true);
242
202
  }
243
-
244
203
  var stackName = this.getPlaceholder() + "_stack";
245
-
246
204
  const scan = (o, p) => {
247
205
  if (o.type == "Identifier") {
248
206
  var index = subscripts.get(o.name);
249
-
250
207
  if (typeof index !== "undefined") {
251
208
  var info = (0, _identifiers.getIdentifierInfo)(o, p);
252
-
253
209
  if (!info.spec.isReferenced) {
254
210
  return;
255
211
  }
256
-
257
212
  var member = getMemberExpression(index);
258
-
259
213
  if (info.spec.isDefined) {
260
214
  if (info.isVariableDeclaration) {
261
215
  (0, _traverse.walk)(p[2], p.slice(3), (oo, pp) => {
@@ -271,7 +225,8 @@ class Stack extends _transform.default {
271
225
  return scan(oo, pp);
272
226
  }
273
227
  });
274
- this.replace(p[0], (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", member, { ...p[0],
228
+ this.replace(p[0], (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", member, {
229
+ ...p[0],
275
230
  type: "FunctionExpression",
276
231
  id: null,
277
232
  expression: false
@@ -283,46 +238,40 @@ class Stack extends _transform.default {
283
238
  return scan(oo, pp);
284
239
  }
285
240
  });
286
- this.replace(p[0], (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", member, { ...p[0],
241
+ this.replace(p[0], (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", member, {
242
+ ...p[0],
287
243
  type: "ClassExpression"
288
244
  })));
289
245
  return;
290
246
  }
291
247
  }
292
-
293
248
  if (info.spec.isReferenced) {
294
249
  this.replace(o, member);
295
250
  }
296
251
  }
297
252
  }
298
-
299
- if (o.type == "Literal" && typeof o.value === "number" && Math.floor(o.value) === o.value && Math.abs(o.value) < 100000 && p.find(x => (0, _insert.isFunction)(x)) === object && (0, _random.chance)(50)) {
253
+ if (o.type == "Literal" && typeof o.value === "number" && Math.floor(o.value) === o.value && Math.abs(o.value) < 100_000 && p.find(x => (0, _insert.isFunction)(x)) === object && (0, _random.chance)(50)) {
300
254
  return () => {
301
255
  this.replaceIdentifierOrLiteral(o, numberLiteral(o.value, 0), p);
302
256
  };
303
257
  }
304
258
  };
305
-
306
259
  var rotateNodes = Object.create(null);
307
260
  object.body.body.forEach((stmt, index) => {
308
261
  var isFirst = index == 0;
309
-
310
262
  if (isFirst || (0, _random.chance)(50 - index * 10)) {
311
263
  var exprs = [];
312
264
  var changes = (0, _random.getRandomInteger)(1, 3);
313
-
314
265
  for (var i = 0; i < changes; i++) {
315
266
  var expr;
316
267
  var type = (0, _random.choice)(["set", "deadValue"]);
317
268
  var valueSet = new Set([...Array.from(subscripts.values()), ...Object.keys(deadValues)]);
318
269
  var newIndex;
319
270
  var i = 0;
320
-
321
271
  do {
322
272
  newIndex = (0, _random.choice)([propertyGen.generate(), (0, _random.getRandomInteger)(0, 250 + subscripts.size + i * 1000) + ""]);
323
273
  i++;
324
274
  } while (valueSet.has(newIndex));
325
-
326
275
  switch (type) {
327
276
  case "set":
328
277
  var randomName = (0, _random.choice)(Array.from(subscripts.keys()));
@@ -331,76 +280,70 @@ class Stack extends _transform.default {
331
280
  (0, _assert.ok)(typeof deadValues[newIndex] === "undefined", deadValues[newIndex]);
332
281
  setSubscript(randomName, newIndex);
333
282
  break;
334
-
335
283
  case "deadValue":
336
- var rand = (0, _random.getRandomInteger)(-150, 150); // modify an already existing dead value index
284
+ var rand = (0, _random.getRandomInteger)(-150, 150);
337
285
 
286
+ // modify an already existing dead value index
338
287
  if ((0, _random.chance)(50)) {
339
288
  var alreadyExisting = (0, _random.choice)(Object.keys(deadValues));
340
-
341
289
  if (typeof alreadyExisting === "string") {
342
290
  newIndex = alreadyExisting;
343
291
  }
344
292
  }
345
-
346
293
  expr = (0, _gen.AssignmentExpression)("=", getMemberExpression(newIndex), numberLiteral(rand));
347
294
  deadValues[newIndex] = rand;
348
295
  break;
349
296
  }
350
-
351
297
  exprs.push(expr);
352
298
  }
353
-
354
299
  rotateNodes[index] = (0, _gen.ExpressionStatement)((0, _gen.SequenceExpression)(exprs));
355
300
  }
356
-
357
301
  (0, _traverse.walk)(stmt, [object.body.body, object.body, object, ...parents], (o, p) => {
358
302
  return scan(o, p);
359
303
  });
360
-
361
304
  if (stmt.type == "ReturnStatement") {
362
305
  var opposing = (0, _random.choice)(Object.keys(deadValues));
363
-
364
306
  if (typeof opposing === "string") {
365
307
  this.replace(stmt, (0, _gen.IfStatement)((0, _gen.BinaryExpression)(">", getMemberExpression(opposing), numberLiteral(deadValues[opposing] + (0, _random.getRandomInteger)(40, 140))), [(0, _gen.ReturnStatement)(getMemberExpression((0, _random.getRandomInteger)(-250, 250) + ""))], [(0, _gen.ReturnStatement)(stmt.argument)]));
366
308
  }
367
309
  }
368
- }); // Add in the rotation nodes
310
+ });
369
311
 
312
+ // Add in the rotation nodes
370
313
  Object.keys(rotateNodes).forEach((index, i) => {
371
314
  object.body.body.splice(parseInt(index) + i, 0, rotateNodes[index]);
372
- }); // Preserve function.length property
373
-
374
- var originalFunctionLength = (0, _insert.computeFunctionLength)(object.params); // Set the params for this function to be the stack array
315
+ });
375
316
 
376
- object.params = [(0, _gen.RestElement)((0, _gen.Identifier)(stackName))]; // Ensure the array is correct length
317
+ // Preserve function.length property
318
+ var originalFunctionLength = (0, _insert.computeFunctionLength)(object.params);
377
319
 
378
- (0, _insert.prepend)(object.body, (0, _template.default)("".concat(stackName, "[\"length\"] = ").concat(startingSize)).single());
320
+ // Set the params for this function to be the stack array
321
+ object.params = [(0, _gen.RestElement)((0, _gen.Identifier)(stackName))];
379
322
 
380
- if (originalFunctionLength !== 0) {
323
+ // Ensure the array is correct length
324
+ (0, _insert.prepend)(object.body, new _template.default(`${stackName}["length"] = ${startingSize}`).single());
325
+ if (this.options.preserveFunctionLength && originalFunctionLength !== 0) {
381
326
  if (!this.functionLengthName) {
382
327
  this.functionLengthName = this.getPlaceholder();
383
328
  (0, _insert.prepend)(parents[parents.length - 1] || object, _functionLength.FunctionLengthTemplate.single({
384
- name: this.functionLengthName
329
+ name: this.functionLengthName,
330
+ ObjectDefineProperty: this.createInitVariable(_globals.ObjectDefineProperty, parents)
385
331
  }));
386
332
  }
387
-
388
333
  if (object.type === "FunctionDeclaration") {
389
334
  var body = parents[0];
390
-
391
335
  if (Array.isArray(body)) {
392
336
  var index = body.indexOf(object);
393
337
  body.splice(index, 0, (0, _gen.ExpressionStatement)((0, _gen.CallExpression)((0, _gen.Identifier)(this.functionLengthName), [(0, _gen.Identifier)(object.id.name), (0, _gen.Literal)(originalFunctionLength)])));
394
338
  }
395
339
  } else {
396
340
  (0, _assert.ok)(object.type === "FunctionExpression" || object.type === "ArrowFunctionExpression");
397
- this.replace(object, (0, _gen.CallExpression)((0, _gen.Identifier)(this.functionLengthName), [{ ...object
341
+ this.replace(object, (0, _gen.CallExpression)((0, _gen.Identifier)(this.functionLengthName), [{
342
+ ...object
398
343
  }, (0, _gen.Literal)(originalFunctionLength)]));
399
344
  }
400
345
  }
401
346
  };
402
347
  }
403
-
404
348
  }
405
-
406
349
  exports.default = Stack;
@@ -3,29 +3,50 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = void 0;
7
-
6
+ exports.EncodingImplementations = void 0;
7
+ exports.createEncodingImplementation = createEncodingImplementation;
8
+ exports.hasAllEncodings = hasAllEncodings;
8
9
  var _template = _interopRequireDefault(require("../../templates/template"));
10
+ var _gen = require("../../util/gen");
11
+ var _random = require("../../util/random");
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ /**
14
+ * Defines an encoding implementation the Obfuscator
15
+ */
16
+
17
+ let _hasAllEncodings = false;
18
+ function hasAllEncodings() {
19
+ return _hasAllEncodings;
20
+ }
21
+ function createEncodingImplementation() {
22
+ if (_hasAllEncodings) {
23
+ return EncodingImplementations[(0, _random.choice)(Object.keys(EncodingImplementations))];
24
+ }
9
25
 
10
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
26
+ // create base91 encoding
27
+ let strTable = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~"';
11
28
 
12
- const Encoding = {
13
- base91: {
29
+ // shuffle table
30
+ strTable = (0, _random.shuffle)(strTable.split("")).join("");
31
+ let identity = "base91_" + strTable;
32
+ if (EncodingImplementations.hasOwnProperty(identity)) {
33
+ _hasAllEncodings = true;
34
+ return EncodingImplementations[identity];
35
+ }
36
+ var encodingImplementation = {
37
+ identity,
14
38
  encode(str) {
15
- const table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~"';
39
+ const table = strTable;
16
40
  const raw = Buffer.from(str, "utf-8");
17
41
  const len = raw.length;
18
42
  let ret = "";
19
43
  let n = 0;
20
44
  let b = 0;
21
-
22
45
  for (let i = 0; i < len; i++) {
23
46
  b |= raw[i] << n;
24
47
  n += 8;
25
-
26
48
  if (n > 13) {
27
49
  let v = b & 8191;
28
-
29
50
  if (v > 88) {
30
51
  b >>= 13;
31
52
  n -= 13;
@@ -34,58 +55,89 @@ const Encoding = {
34
55
  b >>= 14;
35
56
  n -= 14;
36
57
  }
37
-
38
58
  ret += table[v % 91] + table[v / 91 | 0];
39
59
  }
40
60
  }
41
-
42
61
  if (n) {
43
62
  ret += table[b % 91];
44
63
  if (n > 7 || b > 90) ret += table[b / 91 | 0];
45
64
  }
46
-
47
65
  return ret;
48
66
  },
49
-
50
67
  decode(str) {
51
- const table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~"';
68
+ const table = strTable;
52
69
  const raw = "" + (str || "");
53
70
  const len = raw.length;
54
71
  const ret = [];
55
72
  let b = 0;
56
73
  let n = 0;
57
74
  let v = -1;
58
-
59
75
  for (let i = 0; i < len; i++) {
60
76
  const p = table.indexOf(raw[i]);
61
77
  if (p === -1) continue;
62
-
63
78
  if (v < 0) {
64
79
  v = p;
65
80
  } else {
66
81
  v += p * 91;
67
82
  b |= v << n;
68
83
  n += (v & 8191) > 88 ? 13 : 14;
69
-
70
84
  do {
71
85
  ret.push(b & 0xff);
72
86
  b >>= 8;
73
87
  n -= 8;
74
88
  } while (n > 7);
75
-
76
89
  v = -1;
77
90
  }
78
91
  }
79
-
80
92
  if (v > -1) {
81
93
  ret.push((b | v << n) & 0xff);
82
94
  }
83
-
84
95
  return Buffer.from(ret).toString("utf-8");
85
96
  },
86
-
87
- template: (0, _template.default)(" \n function {name}(str){\n const table =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~\"';\n\n const raw = \"\" + (str || \"\");\n const len = raw.length;\n const ret = [];\n\n let b = 0;\n let n = 0;\n let v = -1;\n\n for (let i = 0; i < len; i++) {\n const p = table.indexOf(raw[i]);\n if (p === -1) continue;\n if (v < 0) {\n v = p;\n } else {\n v += p * 91;\n b |= v << n;\n n += (v & 8191) > 88 ? 13 : 14;\n do {\n ret.push(b & 0xff);\n b >>= 8;\n n -= 8;\n } while (n > 7);\n v = -1;\n }\n }\n\n if (v > -1) {\n ret.push((b | (v << n)) & 0xff);\n }\n\n return {bufferToString}(ret);\n }\n ")
88
- }
97
+ template: new _template.default(`
98
+ function {__fnName__}(str){
99
+ var table = {__strTable__};
100
+
101
+ var raw = "" + (str || "");
102
+ var len = raw.length;
103
+ var ret = [];
104
+
105
+ var b = 0;
106
+ var n = 0;
107
+ var v = -1;
108
+
109
+ for (var i = 0; i < len; i++) {
110
+ var p = table.indexOf(raw[i]);
111
+ if (p === -1) continue;
112
+ if (v < 0) {
113
+ v = p;
114
+ } else {
115
+ v += p * 91;
116
+ b |= v << n;
117
+ n += (v & 8191) > 88 ? 13 : 14;
118
+ do {
119
+ ret.push(b & 0xff);
120
+ b >>= 8;
121
+ n -= 8;
122
+ } while (n > 7);
123
+ v = -1;
124
+ }
125
+ }
126
+
127
+ if (v > -1) {
128
+ ret.push((b | (v << n)) & 0xff);
129
+ }
130
+
131
+ return {__bufferToString__}(ret);
132
+ }
133
+ `).setDefaultVariables({
134
+ __strTable__: (0, _gen.Literal)(strTable)
135
+ })
136
+ };
137
+ EncodingImplementations[identity] = encodingImplementation;
138
+ return encodingImplementation;
139
+ }
140
+ const EncodingImplementations = exports.EncodingImplementations = {
89
141
  /* ascii85: { This implementation is flaky and causes decoding errors
90
142
  encode(a) {
91
143
  var b, c, d, e, f, g, h, i, j, k;
@@ -174,7 +226,4 @@ const Encoding = {
174
226
  }
175
227
  `),
176
228
  }, */
177
-
178
- };
179
- var _default = Encoding;
180
- exports.default = _default;
229
+ };