js-confuser 1.7.0 → 1.7.2

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