js-confuser 2.0.0-alpha.2 → 2.0.0-alpha.4

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 (91) hide show
  1. package/.prettierrc +4 -0
  2. package/CHANGELOG.md +42 -8
  3. package/Migration.md +23 -8
  4. package/README.md +2 -2
  5. package/dist/constants.js +11 -2
  6. package/dist/index.js +49 -6
  7. package/dist/obfuscator.js +121 -10
  8. package/dist/order.js +0 -1
  9. package/dist/probability.js +1 -96
  10. package/dist/templates/getGlobalTemplate.js +4 -1
  11. package/dist/templates/integrityTemplate.js +1 -1
  12. package/dist/templates/stringCompressionTemplate.js +3 -3
  13. package/dist/templates/tamperProtectionTemplates.js +1 -1
  14. package/dist/templates/template.js +17 -12
  15. package/dist/transforms/controlFlowFlattening.js +112 -83
  16. package/dist/transforms/deadCode.js +21 -22
  17. package/dist/transforms/dispatcher.js +62 -37
  18. package/dist/transforms/extraction/duplicateLiteralsRemoval.js +5 -0
  19. package/dist/transforms/extraction/objectExtraction.js +1 -2
  20. package/dist/transforms/finalizer.js +1 -1
  21. package/dist/transforms/flatten.js +2 -19
  22. package/dist/transforms/identifier/globalConcealing.js +3 -4
  23. package/dist/transforms/identifier/movedDeclarations.js +12 -5
  24. package/dist/transforms/identifier/renameVariables.js +40 -6
  25. package/dist/transforms/lock/integrity.js +9 -1
  26. package/dist/transforms/lock/lock.js +16 -9
  27. package/dist/transforms/minify.js +64 -27
  28. package/dist/transforms/opaquePredicates.js +6 -7
  29. package/dist/transforms/pack.js +32 -5
  30. package/dist/transforms/plugin.js +20 -39
  31. package/dist/transforms/preparation.js +25 -36
  32. package/dist/transforms/renameLabels.js +1 -2
  33. package/dist/transforms/rgf.js +36 -16
  34. package/dist/transforms/shuffle.js +10 -11
  35. package/dist/transforms/string/stringCompression.js +14 -10
  36. package/dist/transforms/string/stringConcealing.js +7 -5
  37. package/dist/transforms/string/stringEncoding.js +4 -2
  38. package/dist/transforms/string/stringSplitting.js +4 -2
  39. package/dist/transforms/variableMasking.js +3 -2
  40. package/dist/utils/NameGen.js +5 -2
  41. package/dist/utils/PredicateGen.js +62 -0
  42. package/dist/utils/ast-utils.js +24 -9
  43. package/dist/utils/random-utils.js +10 -0
  44. package/dist/validateOptions.js +2 -2
  45. package/index.d.ts +16 -2
  46. package/package.json +2 -2
  47. package/src/constants.ts +15 -5
  48. package/src/index.ts +15 -5
  49. package/src/obfuscationResult.ts +7 -1
  50. package/src/obfuscator.ts +152 -12
  51. package/src/options.ts +26 -8
  52. package/src/order.ts +0 -2
  53. package/src/templates/getGlobalTemplate.ts +5 -1
  54. package/src/templates/integrityTemplate.ts +14 -19
  55. package/src/templates/stringCompressionTemplate.ts +4 -28
  56. package/src/templates/tamperProtectionTemplates.ts +7 -3
  57. package/src/templates/template.ts +5 -3
  58. package/src/transforms/controlFlowFlattening.ts +139 -83
  59. package/src/transforms/deadCode.ts +27 -30
  60. package/src/transforms/dispatcher.ts +24 -5
  61. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +10 -1
  62. package/src/transforms/extraction/objectExtraction.ts +1 -2
  63. package/src/transforms/finalizer.ts +1 -1
  64. package/src/transforms/flatten.ts +3 -22
  65. package/src/transforms/identifier/globalConcealing.ts +26 -17
  66. package/src/transforms/identifier/movedDeclarations.ts +18 -6
  67. package/src/transforms/identifier/renameVariables.ts +48 -6
  68. package/src/transforms/lock/integrity.ts +11 -1
  69. package/src/transforms/lock/lock.ts +26 -10
  70. package/src/transforms/minify.ts +85 -38
  71. package/src/transforms/opaquePredicates.ts +6 -9
  72. package/src/transforms/pack.ts +41 -5
  73. package/src/transforms/plugin.ts +47 -69
  74. package/src/transforms/preparation.ts +33 -46
  75. package/src/transforms/renameLabels.ts +1 -2
  76. package/src/transforms/rgf.ts +52 -23
  77. package/src/transforms/shuffle.ts +28 -26
  78. package/src/transforms/string/encoding.ts +1 -1
  79. package/src/transforms/string/stringCompression.ts +22 -13
  80. package/src/transforms/string/stringConcealing.ts +13 -7
  81. package/src/transforms/string/stringEncoding.ts +6 -2
  82. package/src/transforms/string/stringSplitting.ts +9 -4
  83. package/src/transforms/variableMasking.ts +2 -2
  84. package/src/utils/NameGen.ts +13 -3
  85. package/src/utils/PredicateGen.ts +61 -0
  86. package/src/utils/ast-utils.ts +16 -9
  87. package/src/utils/random-utils.ts +14 -0
  88. package/src/validateOptions.ts +7 -4
  89. package/src/probability.ts +0 -110
  90. package/src/transforms/functionOutlining.ts +0 -225
  91. package/src/utils/ControlObject.ts +0 -141
@@ -1,18 +1,16 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
7
6
  exports["default"] = void 0;
8
7
  var _randomUtils = require("../utils/random-utils");
9
8
  var _deadCodeTemplates = require("../templates/deadCodeTemplates");
10
- var _probability = require("../probability");
11
9
  var _order = require("../order");
12
10
  var t = _interopRequireWildcard(require("@babel/types"));
13
11
  var _template = _interopRequireDefault(require("../templates/template"));
14
- var _NameGen = require("../utils/NameGen");
15
12
  var _astUtils = require("../utils/ast-utils");
13
+ var _PredicateGen = _interopRequireDefault(require("../utils/PredicateGen"));
16
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
17
15
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
18
16
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
@@ -22,6 +20,7 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
22
20
  function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
23
21
  function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
24
22
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
23
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
25
24
  var _default = exports["default"] = function _default(_ref) {
26
25
  var Plugin = _ref.Plugin;
27
26
  var me = Plugin(_order.Order.DeadCode, {
@@ -29,7 +28,7 @@ var _default = exports["default"] = function _default(_ref) {
29
28
  deadCode: 0
30
29
  }
31
30
  });
32
- var created = 0;
31
+ var predicateGen = new _PredicateGen["default"](me);
33
32
  return {
34
33
  visitor: {
35
34
  Block: {
@@ -37,34 +36,34 @@ var _default = exports["default"] = function _default(_ref) {
37
36
  if (blockPath.find(function (p) {
38
37
  return me.isSkipped(p);
39
38
  })) return;
40
- if (!(0, _probability.computeProbabilityMap)(me.options.deadCode)) {
39
+ if (!me.computeProbabilityMap(me.options.deadCode)) {
41
40
  return;
42
41
  }
43
- if (typeof me.options.deadCode !== "function") {
44
- var suggestedMax = 25;
42
+
43
+ // Default limit on dead code
44
+ // May be overridden by user
45
+ if (typeof me.options.deadCode !== "function" && _typeof(me.options.deadCode) !== "object") {
46
+ var suggestedMax = 20;
45
47
  if (me.obfuscator.parentObfuscator) {
46
48
  // RGF should contain less dead code
47
49
  suggestedMax = 5;
48
50
  }
49
- if (created > suggestedMax && (0, _randomUtils.chance)(created - suggestedMax)) return;
50
- created++;
51
+ if (me.changeData.deadCode >= suggestedMax) {
52
+ return;
53
+ }
51
54
  }
55
+
56
+ // Increment dead code counter
57
+ me.changeData.deadCode++;
52
58
  var template = (0, _randomUtils.choice)(_deadCodeTemplates.deadCodeTemplates);
53
59
  var nodes = template.compile();
54
- var containingFnName = me.getPlaceholder("dead_" + created);
55
- var newPath = blockPath.unshiftContainer("body", t.functionDeclaration(t.identifier(containingFnName), [], t.blockStatement(_toConsumableArray(nodes))));
60
+ var containingFnName = me.getPlaceholder("dead_" + me.changeData.deadCode);
56
61
 
57
- // Overcomplicated way to get a random property name that doesn't exist on the Function
58
- var randomProperty;
59
- var nameGen = new _NameGen.NameGen("randomized");
60
- function PrototypeCollision() {}
61
- PrototypeCollision(); // Call it for code coverage :D
62
-
63
- do {
64
- randomProperty = nameGen.generate();
65
- } while (!randomProperty || PrototypeCollision[randomProperty] !== undefined);
66
- me.changeData.deadCode++;
67
- (0, _astUtils.prepend)(blockPath, new _template["default"]("\n if(\"".concat(randomProperty, "\" in ").concat(containingFnName, ") {\n ").concat(containingFnName, "()\n }\n ")).single());
62
+ // Insert dummy function
63
+ (0, _astUtils.prepend)(blockPath, t.functionDeclaration(t.identifier(containingFnName), [], t.blockStatement(_toConsumableArray(nodes))));
64
+ (0, _astUtils.prepend)(blockPath, new _template["default"]("\n if({falsePredicate}) {\n ".concat(containingFnName, "()\n }\n ")).single({
65
+ falsePredicate: predicateGen.generateFalseExpression(blockPath)
66
+ }));
68
67
  me.skip(blockPath);
69
68
  }
70
69
  }
@@ -9,7 +9,6 @@ var t = _interopRequireWildcard(require("@babel/types"));
9
9
  var _template = _interopRequireDefault(require("../templates/template"));
10
10
  var _assert = require("assert");
11
11
  var _randomUtils = require("../utils/random-utils");
12
- var _probability = require("../probability");
13
12
  var _order = require("../order");
14
13
  var _constants = require("../constants");
15
14
  var _functionUtils = require("../utils/function-utils");
@@ -118,12 +117,38 @@ var _default = exports["default"] = function _default(_ref) {
118
117
  illegalNames.add(name);
119
118
  return;
120
119
  }
120
+ var hasAssignmentPattern = false;
121
+ var _iterator = _createForOfIteratorHelper(path.get("params")),
122
+ _step;
123
+ try {
124
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
125
+ var param = _step.value;
126
+ if (param.isAssignmentPattern()) {
127
+ hasAssignmentPattern = true;
128
+ break;
129
+ }
130
+ param.traverse({
131
+ AssignmentPattern: function AssignmentPattern(innerPath) {
132
+ var fn = innerPath.getFunctionParent();
133
+ if (fn === path) {
134
+ hasAssignmentPattern = true;
135
+ innerPath.stop();
136
+ } else {
137
+ innerPath.skip();
138
+ }
139
+ }
140
+ });
141
+ if (hasAssignmentPattern) break;
142
+ }
121
143
 
122
- // Functions with default parameters are not fully supported
123
- // (Could be a Function Expression referencing outer scope)
124
- if (path.node.params.find(function (x) {
125
- return x.type === "AssignmentPattern";
126
- })) {
144
+ // Functions with default parameters are not fully supported
145
+ // (Could be a Function Expression referencing outer scope)
146
+ } catch (err) {
147
+ _iterator.e(err);
148
+ } finally {
149
+ _iterator.f();
150
+ }
151
+ if (hasAssignmentPattern) {
127
152
  illegalNames.add(name);
128
153
  return;
129
154
  }
@@ -131,33 +156,33 @@ var _default = exports["default"] = function _default(_ref) {
131
156
  }
132
157
  }
133
158
  });
134
- var _iterator = _createForOfIteratorHelper(illegalNames),
135
- _step;
159
+ var _iterator2 = _createForOfIteratorHelper(illegalNames),
160
+ _step2;
136
161
  try {
137
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
138
- var _name = _step.value;
162
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
163
+ var _name = _step2.value;
139
164
  functionPaths["delete"](_name);
140
165
  }
141
166
  } catch (err) {
142
- _iterator.e(err);
167
+ _iterator2.e(err);
143
168
  } finally {
144
- _iterator.f();
169
+ _iterator2.f();
145
170
  }
146
- var _iterator2 = _createForOfIteratorHelper(functionPaths.keys()),
147
- _step2;
171
+ var _iterator3 = _createForOfIteratorHelper(functionPaths.keys()),
172
+ _step3;
148
173
  try {
149
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
150
- var name = _step2.value;
151
- if (!(0, _probability.computeProbabilityMap)(me.options.dispatcher, name)) {
174
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
175
+ var name = _step3.value;
176
+ if (!me.computeProbabilityMap(me.options.dispatcher, name)) {
152
177
  functionPaths["delete"](name);
153
178
  }
154
179
  }
155
180
 
156
181
  // No functions here to change
157
182
  } catch (err) {
158
- _iterator2.e(err);
183
+ _iterator3.e(err);
159
184
  } finally {
160
- _iterator2.f();
185
+ _iterator3.f();
161
186
  }
162
187
  if (functionPaths.size === 0) {
163
188
  return;
@@ -174,19 +199,19 @@ var _default = exports["default"] = function _default(_ref) {
174
199
  returnAsObject: isDebug ? "returnAsObject" : (0, _randomUtils.getRandomString)(10),
175
200
  returnAsObjectProperty: isDebug ? "returnAsObjectProperty" : (0, _randomUtils.getRandomString)(10)
176
201
  };
177
- var _iterator3 = _createForOfIteratorHelper(functionPaths.keys()),
178
- _step3;
202
+ var _iterator4 = _createForOfIteratorHelper(functionPaths.keys()),
203
+ _step4;
179
204
  try {
180
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
181
- var name = _step3.value;
205
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
206
+ var name = _step4.value;
182
207
  newNameMapping.set(name, isDebug ? "_" + name : (0, _randomUtils.getRandomString)(6) /** "_" + name */);
183
208
  }
184
209
 
185
210
  // Find identifiers calling/referencing the functions
186
211
  } catch (err) {
187
- _iterator3.e(err);
212
+ _iterator4.e(err);
188
213
  } finally {
189
- _iterator3.f();
214
+ _iterator4.f();
190
215
  }
191
216
  blockPath.traverse({
192
217
  ReferencedIdentifier: {
@@ -280,17 +305,17 @@ var _default = exports["default"] = function _default(_ref) {
280
305
  newBody.unshift(t.expressionStatement(t.stringLiteral("Dispatcher: ".concat(name, " -> ").concat(newName))));
281
306
  }
282
307
  var functionExpression = t.functionExpression(null, [], t.blockStatement(newBody));
283
- var _iterator4 = _createForOfIteratorHelper(Object.getOwnPropertySymbols(originalFn)),
284
- _step4;
308
+ var _iterator5 = _createForOfIteratorHelper(Object.getOwnPropertySymbols(originalFn)),
309
+ _step5;
285
310
  try {
286
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
287
- var symbol = _step4.value;
311
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
312
+ var symbol = _step5.value;
288
313
  functionExpression[symbol] = originalFn[symbol];
289
314
  }
290
315
  } catch (err) {
291
- _iterator4.e(err);
316
+ _iterator5.e(err);
292
317
  } finally {
293
- _iterator4.f();
318
+ _iterator5.f();
294
319
  }
295
320
  functionExpression[_constants.PREDICTABLE] = true;
296
321
  return t.objectProperty(t.stringLiteral(newName), functionExpression);
@@ -321,17 +346,17 @@ var _default = exports["default"] = function _default(_ref) {
321
346
  prepend(t.variableDeclaration("var", [t.variableDeclarator(t.identifier(cacheName), new _template["default"]("Object[\"create\"](null)").expression())]));
322
347
 
323
348
  // Remove original functions
324
- var _iterator5 = _createForOfIteratorHelper(functionPaths.values()),
325
- _step5;
349
+ var _iterator6 = _createForOfIteratorHelper(functionPaths.values()),
350
+ _step6;
326
351
  try {
327
- for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
328
- var path = _step5.value;
352
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
353
+ var path = _step6.value;
329
354
  path.remove();
330
355
  }
331
356
  } catch (err) {
332
- _iterator5.e(err);
357
+ _iterator6.e(err);
333
358
  } finally {
334
- _iterator5.f();
359
+ _iterator6.f();
335
360
  }
336
361
  }
337
362
  }
@@ -40,6 +40,11 @@ var _default = exports["default"] = function _default(_ref) {
40
40
  programPath.traverse({
41
41
  "StringLiteral|BooleanLiteral|NumericLiteral|NullLiteral|Identifier": function StringLiteralBooleanLiteralNumericLiteralNullLiteralIdentifier(_path) {
42
42
  var literalPath = _path;
43
+
44
+ // Don't change module imports
45
+ if (literalPath.isStringLiteral()) {
46
+ if ((0, _astUtils.isModuleImport)(literalPath)) return;
47
+ }
43
48
  var node = literalPath.node;
44
49
  var isUndefined = false;
45
50
  if (literalPath.isIdentifier()) {
@@ -8,7 +8,6 @@ exports["default"] = void 0;
8
8
  var _order = require("../../order");
9
9
  var t = _interopRequireWildcard(require("@babel/types"));
10
10
  var _astUtils = require("../../utils/ast-utils");
11
- var _probability = require("../../probability");
12
11
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
13
12
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
14
13
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
@@ -134,7 +133,7 @@ var _default = exports["default"] = function _default(_ref) {
134
133
 
135
134
  // Object references are too complex to safely extract
136
135
  if (!isObjectSafe) return;
137
- if (!(0, _probability.computeProbabilityMap)(me.options.objectExtraction, identifier.node.name)) return;
136
+ if (!me.computeProbabilityMap(me.options.objectExtraction, identifier.node.name)) return;
138
137
  var newDeclarationKind = varDecPath.node.kind === "const" ? "let" : varDecPath.node.kind;
139
138
  varDecPath.replaceWithMultiple(newDeclarations.map(function (declaration) {
140
139
  return t.variableDeclaration(newDeclarationKind, [declaration]);
@@ -40,7 +40,7 @@ var _default = exports["default"] = function _default(_ref) {
40
40
  }
41
41
  }), {}, {
42
42
  // Hexadecimal numbers
43
- NumberLiteral: {
43
+ NumericLiteral: {
44
44
  exit: function exit(path) {
45
45
  if (me.options.hexadecimalNumbers) {
46
46
  var value = path.node.value;
@@ -7,11 +7,9 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports["default"] = void 0;
8
8
  var t = _interopRequireWildcard(require("@babel/types"));
9
9
  var _astUtils = require("../utils/ast-utils");
10
- var _probability = require("../probability");
11
10
  var _order = require("../order");
12
11
  var _constants = require("../constants");
13
12
  var _functionUtils = require("../utils/function-utils");
14
- var _assert = require("assert");
15
13
  var _NameGen = require("../utils/NameGen");
16
14
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
17
15
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
@@ -59,7 +57,7 @@ var _default = exports["default"] = function _default(_ref) {
59
57
  if (!t.isValidIdentifier(functionName, true)) {
60
58
  functionName = "anonymous";
61
59
  }
62
- if (!(0, _probability.computeProbabilityMap)(me.options.flatten, functionName)) {
60
+ if (!me.computeProbabilityMap(me.options.flatten, functionName)) {
63
61
  return;
64
62
  }
65
63
  var strictMode = fnPath.find(function (path) {
@@ -99,22 +97,7 @@ var _default = exports["default"] = function _default(_ref) {
99
97
  if (!binding) {
100
98
  return;
101
99
  }
102
- var definedLocal = identifierPath.scope;
103
- do {
104
- if (definedLocal.hasOwnBinding(identifierName)) return;
105
- if (definedLocal === fnPath.scope) break;
106
- definedLocal = definedLocal.parent;
107
- if (definedLocal === program.scope) (0, _assert.ok)(functionName + ":" + identifierName);
108
- } while (definedLocal);
109
- var cursor = fnPath.scope.parent;
110
- var isOutsideVariable = false;
111
- do {
112
- if (cursor.hasBinding(identifierName)) {
113
- isOutsideVariable = true;
114
- break;
115
- }
116
- cursor = cursor.parent;
117
- } while (cursor);
100
+ var isOutsideVariable = fnPath.scope.parent.getBinding(identifierName) === binding;
118
101
  if (!isOutsideVariable) {
119
102
  return;
120
103
  }
@@ -9,7 +9,6 @@ var t = _interopRequireWildcard(require("@babel/types"));
9
9
  var _NameGen = require("../../utils/NameGen");
10
10
  var _template = _interopRequireDefault(require("../../templates/template"));
11
11
  var _order = require("../../order");
12
- var _probability = require("../../probability");
13
12
  var _constants = require("../../constants");
14
13
  var _astUtils = require("../../utils/ast-utils");
15
14
  var _getGlobalTemplate = require("../../templates/getGlobalTemplate");
@@ -29,7 +28,7 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
29
28
  function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
30
29
  function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
31
30
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
32
- var ignoreGlobals = new Set(["require", "__dirname", "eval", "arguments", _constants.variableFunctionName].concat(_toConsumableArray(_constants.reservedIdentifiers)));
31
+ var ignoreGlobals = new Set([].concat(_toConsumableArray(_constants.reservedNodeModuleIdentifiers), ["__dirname", "eval", "arguments", _constants.variableFunctionName], _toConsumableArray(_constants.reservedIdentifiers)));
33
32
  var _default = exports["default"] = function _default(_ref) {
34
33
  var Plugin = _ref.Plugin;
35
34
  var me = Plugin(_order.Order.GlobalConcealing, {
@@ -53,7 +52,7 @@ var _default = exports["default"] = function _default(_ref) {
53
52
  globalMapping.set(gen.generate(), fakeName);
54
53
  }
55
54
  var createSwitchStatement = function createSwitchStatement() {
56
- var cases = Array.from(globalMapping.keys()).map(function (originalName) {
55
+ var cases = (0, _randomUtils.shuffle)(Array.from(globalMapping.keys())).map(function (originalName) {
57
56
  var mappedKey = globalMapping.get(originalName);
58
57
  return t.switchCase(t.stringLiteral(mappedKey), [t.returnStatement(t.memberExpression(t.identifier(globalVarName), t.stringLiteral(originalName), true))]);
59
58
  });
@@ -110,7 +109,7 @@ var _default = exports["default"] = function _default(_ref) {
110
109
  var mapping = globalMapping.get(globalName);
111
110
  if (!mapping) {
112
111
  // Allow user to disable custom global variables
113
- if (!(0, _probability.computeProbabilityMap)(me.options.globalConcealing, globalName)) continue;
112
+ if (!me.computeProbabilityMap(me.options.globalConcealing, globalName)) continue;
114
113
  mapping = gen.generate();
115
114
  globalMapping.set(globalName, mapping);
116
115
  }
@@ -60,9 +60,11 @@ var _default = exports["default"] = function _default(_ref) {
60
60
  return path.isFunction();
61
61
  });
62
62
  if (!functionPath || !functionPath.node[_constants.PREDICTABLE]) return;
63
+ var fnBody = functionPath.get("body");
64
+ if (!fnBody.isBlockStatement()) return;
63
65
 
64
66
  // Must be direct child of the function
65
- if (path.parentPath !== functionPath.get("body")) return;
67
+ if (path.parentPath !== fnBody) return;
66
68
  var functionName = path.node.id.name;
67
69
 
68
70
  // Must be eligible for parameter packing
@@ -85,7 +87,7 @@ var _default = exports["default"] = function _default(_ref) {
85
87
  binding.path = paramPath;
86
88
  binding.identifier = identifier;
87
89
  }
88
- (0, _astUtils.prepend)(functionPath, new _template["default"]("\n if(!".concat(functionName, ") {\n ").concat(functionName, " = {functionExpression};\n }\n ")).single({
90
+ (0, _astUtils.prepend)(fnBody, new _template["default"]("\n if(!".concat(functionName, ") {\n ").concat(functionName, " = {functionExpression};\n }\n ")).single({
89
91
  functionExpression: functionExpression
90
92
  }));
91
93
  path.remove();
@@ -94,6 +96,7 @@ var _default = exports["default"] = function _default(_ref) {
94
96
  },
95
97
  VariableDeclaration: {
96
98
  exit: function exit(path) {
99
+ if (me.isSkipped(path)) return;
97
100
  if (path.node.kind !== "var") return;
98
101
  if (path.node.declarations.length !== 1) return;
99
102
  var insertionMethod = "variableDeclaration";
@@ -125,7 +128,9 @@ var _default = exports["default"] = function _default(_ref) {
125
128
  var isDefinedAtTop = false;
126
129
  var parentPath = path.parentPath;
127
130
  if (parentPath.isBlock()) {
128
- isDefinedAtTop = parentPath.get("body").indexOf(path) === 0;
131
+ isDefinedAtTop = parentPath.get("body").filter(function (x) {
132
+ return x.type !== "ImportDeclaration";
133
+ }).indexOf(path) === 0;
129
134
  }
130
135
 
131
136
  // Already at the top - nothing will change
@@ -167,13 +172,15 @@ var _default = exports["default"] = function _default(_ref) {
167
172
  var block = path.findParent(function (path) {
168
173
  return path.isBlock();
169
174
  });
170
- var topNode = block.node.body[0];
175
+ var topNode = block.node.body.filter(function (x) {
176
+ return x.type !== "ImportDeclaration";
177
+ })[0];
171
178
  var variableDeclarator = t.variableDeclarator(t.identifier(name));
172
179
  if (t.isVariableDeclaration(topNode) && topNode.kind === "var") {
173
180
  topNode.declarations.push(variableDeclarator);
174
181
  break;
175
182
  } else {
176
- block.node.body.unshift(t.variableDeclaration("var", [variableDeclarator]));
183
+ (0, _astUtils.prepend)(block, me.skip(t.variableDeclaration("var", [variableDeclarator])));
177
184
  }
178
185
  me.changeData.variableDeclarations++;
179
186
  break;
@@ -8,7 +8,6 @@ exports["default"] = void 0;
8
8
  var t = _interopRequireWildcard(require("@babel/types"));
9
9
  var _order = require("../../order");
10
10
  var _constants = require("../../constants");
11
- var _probability = require("../../probability");
12
11
  var _astUtils = require("../../utils/ast-utils");
13
12
  var _functionUtils = require("../../utils/function-utils");
14
13
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
@@ -36,6 +35,7 @@ var _default = exports["default"] = function _default(_ref) {
36
35
  });
37
36
  var definedMap = new Map();
38
37
  var referencedMap = new Map();
38
+ var paramMap = new Map(); // Used for default function parameter special case
39
39
  var bindingMap = new Map();
40
40
  var renamedVariables = new Map();
41
41
  me.obfuscator.globalState.renamedVariables = renamedVariables;
@@ -49,8 +49,11 @@ var _default = exports["default"] = function _default(_ref) {
49
49
  if (!(0, _astUtils.isVariableIdentifier)(path)) return;
50
50
  var contextPaths = [(0, _astUtils.getParentFunctionOrProgram)(path)];
51
51
  var isDefined = false;
52
+ var isParameter = false;
52
53
  if (path.isBindingIdentifier() && (0, _astUtils.isDefiningIdentifier)(path)) {
53
54
  isDefined = true;
55
+ var binding = path.scope.getBinding(path.node.name);
56
+ if ((binding === null || binding === void 0 ? void 0 : binding.kind) === "param") isParameter = true;
54
57
 
55
58
  // Function ID is defined in the parent's function declaration
56
59
  if (path.key === "id" && path.parentPath.isFunctionDeclaration()) {
@@ -102,11 +105,29 @@ var _default = exports["default"] = function _default(_ref) {
102
105
  });
103
106
  }
104
107
  var newName = null;
108
+ var skippedPaths = new Set();
105
109
  var _iterator = _createForOfIteratorHelper(contextPaths),
106
110
  _step;
107
111
  try {
108
112
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
109
113
  var contextPath = _step.value;
114
+ if (skippedPaths.has(contextPath)) continue;
115
+ if (contextPath.isFunction()) {
116
+ var _assignmentPattern;
117
+ var assignmentPattern = contextPath.find(function (p) {
118
+ return p.listKey === "params" && p.parentPath.isFunction();
119
+ });
120
+ if ((_assignmentPattern = assignmentPattern) !== null && _assignmentPattern !== void 0 && _assignmentPattern.isAssignmentPattern()) {
121
+ var functionPath = assignmentPattern.getFunctionParent();
122
+ if (functionPath) {
123
+ // The parameters can be still accessed...
124
+ var params = paramMap.get(functionPath.node);
125
+ if (params !== null && params !== void 0 && params.has(identifierName)) {} else {
126
+ skippedPaths.add(functionPath);
127
+ }
128
+ }
129
+ }
130
+ }
110
131
  var _node = contextPath.node;
111
132
  var defined = definedMap.get(_node);
112
133
  if (defined !== null && defined !== void 0 && defined.has(identifierName)) {
@@ -132,6 +153,17 @@ var _default = exports["default"] = function _default(_ref) {
132
153
  // 5. Update Identifier node's 'name' property
133
154
  node.name = newName;
134
155
  node[RENAMED] = true;
156
+
157
+ // 6. Additional parameter mapping
158
+ var binding = identifierPath.scope.getBinding(identifierName);
159
+ if ((binding === null || binding === void 0 ? void 0 : binding.kind) === "param") {
160
+ var mapNode = binding.scope.path.node;
161
+ if (!paramMap.has(mapNode)) {
162
+ paramMap.set(mapNode, new Set([identifierName]));
163
+ } else {
164
+ paramMap.get(mapNode).add(identifierName);
165
+ }
166
+ }
135
167
  }
136
168
  },
137
169
  Scopable: function Scopable(scopePath) {
@@ -211,16 +243,18 @@ var _default = exports["default"] = function _default(_ref) {
211
243
 
212
244
  // Placeholder variables should always be renamed
213
245
  if (name.startsWith(_constants.placeholderVariablePrefix)) return true;
214
-
215
- // Do not rename exports
216
- if ((0, _astUtils.isExportedIdentifier)(bindings === null || bindings === void 0 ? void 0 : bindings.get(name))) return false;
246
+ var binding = bindings === null || bindings === void 0 ? void 0 : bindings.get(name);
247
+ if (binding) {
248
+ // Do not rename exports
249
+ if ((0, _astUtils.isExportedIdentifier)(binding)) return false;
250
+ }
217
251
  if (name === me.obfuscator.getStringCompressionLibraryName()) return false;
218
252
 
219
253
  // Global variables are additionally checked against user option
220
254
  if (isGlobal) {
221
- if (!(0, _probability.computeProbabilityMap)(me.options.renameGlobals, name)) return false;
255
+ if (!me.computeProbabilityMap(me.options.renameGlobals, name)) return false;
222
256
  }
223
- if (!(0, _probability.computeProbabilityMap)(me.options.renameVariables, name, isGlobal)) return false;
257
+ if (!me.computeProbabilityMap(me.options.renameVariables, name, isGlobal)) return false;
224
258
  return true;
225
259
  }
226
260
 
@@ -10,6 +10,7 @@ var _randomUtils = require("../../utils/random-utils");
10
10
  var _integrityTemplate = require("../../templates/integrityTemplate");
11
11
  var t = _interopRequireWildcard(require("@babel/types"));
12
12
  var _template = _interopRequireDefault(require("../../templates/template"));
13
+ var _NameGen = require("../../utils/NameGen");
13
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
14
15
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
15
16
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
@@ -29,6 +30,10 @@ var _default = exports["default"] = function _default(_ref) {
29
30
  functions: 0
30
31
  }
31
32
  });
33
+ var nameGen = new _NameGen.NameGen(me.options.identifierGenerator, {
34
+ avoidObjectPrototype: true,
35
+ avoidReserved: true
36
+ });
32
37
  return {
33
38
  visitor: {
34
39
  Program: {
@@ -57,10 +62,13 @@ var _default = exports["default"] = function _default(_ref) {
57
62
  var codeTrimmed = code.replace(me.globalState.lock.integrity.sensitivityRegex, "");
58
63
  var seed = (0, _randomUtils.getRandomInteger)(0, 10000000);
59
64
  var hashCode = (0, _integrityTemplate.HashFunction)(codeTrimmed, seed);
65
+ var selfName = funcDecPath.node.id.name;
66
+ var selfCacheProperty = nameGen.generate();
67
+ var selfCacheString = "".concat(selfName, ".").concat(selfCacheProperty);
60
68
 
61
69
  // me.log(codeTrimmed, hashCode);
62
70
  me.changeData.functions++;
63
- funcDecPath.node.body = t.blockStatement(new _template["default"]("\n var hash = ".concat(obfuscatedHashFnName, "(").concat(newFunctionDeclaration.id.name, ", ").concat(seed, ");\n if(hash === ").concat(hashCode, ") {\n {originalBody}\n } else {\n {countermeasures} \n }\n ")).compile({
71
+ funcDecPath.node.body = t.blockStatement(new _template["default"]("\n var hash = ".concat(selfCacheString, " || (").concat(selfCacheString, " = ").concat(obfuscatedHashFnName, "(").concat(newFunctionDeclaration.id.name, ", ").concat(seed, "));\n if(hash === ").concat(hashCode, ") {\n {originalBody}\n } else {\n {countermeasures} \n }\n ")).compile({
64
72
  originalBody: funcDecPath.node.body.body,
65
73
  countermeasures: function countermeasures() {
66
74
  return me.globalState.lock.createCountermeasuresCode();