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,100 +4,76 @@ 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 _constants = require("../../constants");
11
-
12
9
  var _compare = require("../../util/compare");
13
-
14
10
  var _identifiers = require("../../util/identifiers");
15
-
16
11
  var _insert = require("../../util/insert");
17
-
18
12
  var _transform = _interopRequireDefault(require("../transform"));
19
-
20
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
-
22
- 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; }
23
-
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
15
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
16
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
24
17
  /**
25
18
  * Keeps track of what identifiers are defined and referenced in each context.
26
19
  */
27
20
  class VariableAnalysis extends _transform.default {
28
- /**
29
- * Node being the context.
30
- */
31
-
32
- /**
33
- * Context->Nodes referenced (does not include nested)
34
- */
35
-
36
- /**
37
- * Set of global identifiers to never be redefined
38
- *
39
- * - Used to not accidentally block access to a global variable
40
- */
41
-
42
- /**
43
- * Set of identifiers that are defined within the program
44
- */
45
21
  constructor(o) {
46
22
  super(o);
47
-
23
+ /**
24
+ * Node being the context.
25
+ */
48
26
  _defineProperty(this, "defined", void 0);
49
-
27
+ /**
28
+ * Context->Nodes referenced (does not include nested)
29
+ */
50
30
  _defineProperty(this, "references", void 0);
51
-
31
+ /**
32
+ * Set of global identifiers to never be redefined
33
+ *
34
+ * - Used to not accidentally block access to a global variable
35
+ */
52
36
  _defineProperty(this, "globals", void 0);
53
-
37
+ /**
38
+ * Set of identifiers that are defined within the program
39
+ */
54
40
  _defineProperty(this, "notGlobals", void 0);
55
-
56
41
  this.defined = new Map();
57
42
  this.references = new Map();
58
43
  this.globals = new Set();
59
44
  this.notGlobals = new Set();
60
45
  }
61
-
62
46
  match(object, parents) {
63
47
  return object.type === "Identifier";
64
48
  }
65
-
66
49
  transform(object, parents) {
67
50
  var name = object.name;
68
51
  (0, _assert.ok)(typeof name === "string");
69
-
70
52
  if (!(0, _compare.isValidIdentifier)(name)) {
71
53
  return;
72
54
  }
73
-
74
55
  if (_constants.reservedIdentifiers.has(name)) {
75
56
  return;
76
57
  }
77
-
78
58
  if (this.options.globalVariables.has(name)) {
79
59
  return;
80
60
  }
81
-
82
61
  var info = (0, _identifiers.getIdentifierInfo)(object, parents);
83
-
84
62
  if (!info.spec.isReferenced) {
85
63
  return;
86
64
  }
87
-
88
65
  if (info.spec.isExported) {
89
66
  return;
90
67
  }
68
+ var isDefined = info.spec.isDefined;
91
69
 
92
- var isDefined = info.spec.isDefined; // Keep track of defined names within the program
93
-
70
+ // Keep track of defined names within the program
94
71
  if (isDefined) {
95
72
  this.notGlobals.add(object.name);
96
73
  this.globals.delete(object.name);
97
74
  } else if (!this.notGlobals.has(object.name)) {
98
75
  this.globals.add(object.name);
99
76
  }
100
-
101
77
  var definingContexts = info.spec.isDefined ? (0, _insert.getAllDefiningContexts)(object, parents) : (0, _insert.getReferencingContexts)(object, parents, info);
102
78
  (0, _assert.ok)(definingContexts.length);
103
79
  definingContexts.forEach(definingContext => {
@@ -105,12 +81,12 @@ class VariableAnalysis extends _transform.default {
105
81
  // isContext(definingContext),
106
82
  // `${definingContext.type} is not a context`
107
83
  // );
84
+
108
85
  if (isDefined) {
109
86
  // Add to defined Map
110
87
  if (!this.defined.has(definingContext)) {
111
88
  this.defined.set(definingContext, new Set());
112
89
  }
113
-
114
90
  this.defined.get(definingContext).add(name);
115
91
  this.references.has(definingContext) && this.references.get(definingContext).delete(name);
116
92
  } else {
@@ -119,13 +95,10 @@ class VariableAnalysis extends _transform.default {
119
95
  if (!this.references.has(definingContext)) {
120
96
  this.references.set(definingContext, new Set());
121
97
  }
122
-
123
98
  this.references.get(definingContext).add(name);
124
99
  }
125
100
  }
126
101
  });
127
102
  }
128
-
129
103
  }
130
-
131
104
  exports.default = VariableAnalysis;
@@ -4,69 +4,66 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _order = require("../../order");
9
-
10
8
  var _template = _interopRequireDefault(require("../../templates/template"));
11
-
12
9
  var _traverse = require("../../traverse");
13
-
14
10
  var _gen = require("../../util/gen");
15
-
16
11
  var _insert = require("../../util/insert");
17
-
18
12
  var _random = require("../../util/random");
19
-
20
13
  var _transform = _interopRequireDefault(require("../transform"));
14
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
+ 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; }
16
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
17
+ 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); }
18
+ var DevToolsDetection = new _template.default(`
19
+ try {
20
+ if ( setInterval ) {
21
+ setInterval(()=>{
22
+ {functionName}();
23
+ }, 4000);
24
+ }
25
+ } catch ( e ) {
21
26
 
22
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
-
24
- 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; }
25
-
26
- var DevToolsDetection = (0, _template.default)("\n try {\n if ( setInterval ) {\n setInterval(()=>{\n {functionName}();\n }, 4000);\n }\n } catch ( e ) {\n\n }\n");
27
-
27
+ }
28
+ `);
28
29
  class AntiDebug extends _transform.default {
29
30
  constructor(o, lock) {
30
31
  super(o, _order.ObfuscateOrder.Lock);
31
-
32
32
  _defineProperty(this, "made", void 0);
33
-
34
33
  _defineProperty(this, "lock", void 0);
35
-
36
34
  this.lock = lock;
37
35
  this.made = 0;
38
36
  }
39
-
40
37
  apply(tree) {
41
38
  super.apply(tree);
42
39
  var fnName = this.getPlaceholder();
43
40
  var startTimeName = this.getPlaceholder();
44
41
  var endTimeName = this.getPlaceholder();
45
42
  var isDevName = this.getPlaceholder();
46
- var functionDeclaration = (0, _gen.FunctionDeclaration)(fnName, [], [...(0, _template.default)("\n var ".concat(startTimeName, " = new Date();\n debugger;\n var ").concat(endTimeName, " = new Date();\n var ").concat(isDevName, " = ").concat(endTimeName, "-").concat(startTimeName, " > 1000;\n ")).compile(), (0, _gen.IfStatement)((0, _gen.Identifier)(isDevName), this.options.lock.countermeasures ? this.lock.getCounterMeasuresCode(tree.body, [tree]) : [(0, _gen.WhileStatement)((0, _gen.Identifier)(isDevName), [(0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(startTimeName), (0, _gen.Identifier)(endTimeName)))])], null)]);
43
+ var functionDeclaration = (0, _gen.FunctionDeclaration)(fnName, [], [...new _template.default(`
44
+ var ${startTimeName} = new Date();
45
+ debugger;
46
+ var ${endTimeName} = new Date();
47
+ var ${isDevName} = ${endTimeName}-${startTimeName} > 1000;
48
+ `).compile(), (0, _gen.IfStatement)((0, _gen.Identifier)(isDevName), this.options.lock.countermeasures ? this.lock.getCounterMeasuresCode(tree.body, [tree]) : [(0, _gen.WhileStatement)((0, _gen.Identifier)(isDevName), [(0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(startTimeName), (0, _gen.Identifier)(endTimeName)))])], null)]);
47
49
  tree.body.unshift(...DevToolsDetection.compile({
48
50
  functionName: fnName
49
51
  }));
50
52
  tree.body.push(functionDeclaration);
51
53
  }
52
-
53
54
  match(object, parents) {
54
55
  return (0, _traverse.isBlock)(object);
55
56
  }
56
-
57
57
  transform(object, parents) {
58
58
  return () => {
59
59
  var body = (0, _insert.getBlockBody)(object.body);
60
60
  [...body].forEach((stmt, i) => {
61
61
  var addDebugger = Math.random() < 0.1 / (this.made || 1);
62
-
63
62
  if (object.type == "Program" && i == 0) {
64
63
  addDebugger = true;
65
64
  }
66
-
67
65
  if (addDebugger) {
68
66
  var index = (0, _random.getRandomInteger)(0, body.length);
69
-
70
67
  if (body[index].type != "DebuggerStatement") {
71
68
  body.splice(index, 0, (0, _gen.DebuggerStatement)());
72
69
  this.made++;
@@ -75,7 +72,5 @@ class AntiDebug extends _transform.default {
75
72
  });
76
73
  };
77
74
  }
78
-
79
75
  }
80
-
81
76
  exports.default = AntiDebug;
@@ -4,25 +4,17 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _transform = _interopRequireDefault(require("../transform"));
9
-
10
8
  var _template = _interopRequireDefault(require("../../templates/template"));
11
-
12
9
  var _gen = require("../../util/gen");
13
-
14
10
  var _insert = require("../../util/insert");
15
-
16
11
  var _random = require("../../util/random");
17
-
18
12
  var _assert = require("assert");
19
-
20
13
  var _compiler = require("../../compiler");
21
-
22
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
-
24
- 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; }
25
-
14
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
+ 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; }
16
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
17
+ 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); }
26
18
  /**
27
19
  * Hashing Algorithm for function integrity
28
20
  * @param str
@@ -31,25 +23,55 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
31
23
  function cyrb53(str) {
32
24
  let seed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
33
25
  let h1 = 0xdeadbeef ^ seed,
34
- h2 = 0x41c6ce57 ^ seed;
35
-
26
+ h2 = 0x41c6ce57 ^ seed;
36
27
  for (let i = 0, ch; i < str.length; i++) {
37
28
  ch = str.charCodeAt(i);
38
29
  h1 = Math.imul(h1 ^ ch, 2654435761);
39
30
  h2 = Math.imul(h2 ^ ch, 1597334677);
40
31
  }
41
-
42
32
  h1 = Math.imul(h1 ^ h1 >>> 16, 2246822507) ^ Math.imul(h2 ^ h2 >>> 13, 3266489909);
43
33
  h2 = Math.imul(h2 ^ h2 >>> 16, 2246822507) ^ Math.imul(h1 ^ h1 >>> 13, 3266489909);
44
34
  return 4294967296 * (2097151 & h2) + (h1 >>> 0);
45
- } // In template form to be inserted into code
46
-
47
-
48
- const HashTemplate = (0, _template.default)("\nfunction {name}(str, seed) {\n var h1 = 0xdeadbeef ^ seed;\n var h2 = 0x41c6ce57 ^ seed;\n for (var i = 0, ch; i < str.length; i++) {\n ch = str.charCodeAt(i);\n h1 = {imul}(h1 ^ ch, 2654435761);\n h2 = {imul}(h2 ^ ch, 1597334677);\n }\n h1 = {imul}(h1 ^ (h1>>>16), 2246822507) ^ {imul}(h2 ^ (h2>>>13), 3266489909);\n h2 = {imul}(h2 ^ (h2>>>16), 2246822507) ^ {imul}(h1 ^ (h1>>>13), 3266489909);\n return 4294967296 * (2097151 & h2) + (h1>>>0);\n};"); // Math.imul polyfill for ES5
35
+ }
49
36
 
50
- const ImulTemplate = (0, _template.default)("\nvar {name} = Math.imul || function(opA, opB){\n opB |= 0; // ensure that opB is an integer. opA will automatically be coerced.\n // floating points give us 53 bits of precision to work with plus 1 sign bit\n // automatically handled for our convienence:\n // 1. 0x003fffff /*opA & 0x000fffff*/ * 0x7fffffff /*opB*/ = 0x1fffff7fc00001\n // 0x1fffff7fc00001 < Number.MAX_SAFE_INTEGER /*0x1fffffffffffff*/\n var result = (opA & 0x003fffff) * opB;\n // 2. We can remove an integer coersion from the statement above because:\n // 0x1fffff7fc00001 + 0xffc00000 = 0x1fffffff800001\n // 0x1fffffff800001 < Number.MAX_SAFE_INTEGER /*0x1fffffffffffff*/\n if (opA & 0xffc00000 /*!== 0*/) result += (opA & 0xffc00000) * opB |0;\n return result |0;\n};"); // Simple function that returns .toString() value with spaces replaced out
37
+ // In template form to be inserted into code
38
+ const HashTemplate = new _template.default(`
39
+ function {name}(str, seed) {
40
+ var h1 = 0xdeadbeef ^ seed;
41
+ var h2 = 0x41c6ce57 ^ seed;
42
+ for (var i = 0, ch; i < str.length; i++) {
43
+ ch = str.charCodeAt(i);
44
+ h1 = {imul}(h1 ^ ch, 2654435761);
45
+ h2 = {imul}(h2 ^ ch, 1597334677);
46
+ }
47
+ h1 = {imul}(h1 ^ (h1>>>16), 2246822507) ^ {imul}(h2 ^ (h2>>>13), 3266489909);
48
+ h2 = {imul}(h2 ^ (h2>>>16), 2246822507) ^ {imul}(h1 ^ (h1>>>13), 3266489909);
49
+ return 4294967296 * (2097151 & h2) + (h1>>>0);
50
+ };`);
51
+
52
+ // Math.imul polyfill for ES5
53
+ const ImulTemplate = new _template.default(`
54
+ var {name} = Math.imul || function(opA, opB){
55
+ opB |= 0; // ensure that opB is an integer. opA will automatically be coerced.
56
+ // floating points give us 53 bits of precision to work with plus 1 sign bit
57
+ // automatically handled for our convienence:
58
+ // 1. 0x003fffff /*opA & 0x000fffff*/ * 0x7fffffff /*opB*/ = 0x1fffff7fc00001
59
+ // 0x1fffff7fc00001 < Number.MAX_SAFE_INTEGER /*0x1fffffffffffff*/
60
+ var result = (opA & 0x003fffff) * opB;
61
+ // 2. We can remove an integer coersion from the statement above because:
62
+ // 0x1fffff7fc00001 + 0xffc00000 = 0x1fffffff800001
63
+ // 0x1fffffff800001 < Number.MAX_SAFE_INTEGER /*0x1fffffffffffff*/
64
+ if (opA & 0xffc00000 /*!== 0*/) result += (opA & 0xffc00000) * opB |0;
65
+ return result |0;
66
+ };`);
67
+
68
+ // Simple function that returns .toString() value with spaces replaced out
69
+ const StringTemplate = new _template.default(`
70
+ function {name}(x){
71
+ return x.toString().replace(/ |\\n|;|,|\\{|\\}|\\(|\\)|\\.|\\[|\\]/g, "");
72
+ }
73
+ `);
51
74
 
52
- const StringTemplate = (0, _template.default)("\n function {name}(x){\n return x.toString().replace(/ |\\n|;|,|\\{|\\}|\\(|\\)|\\.|\\[|\\]/g, \"\");\n }\n");
53
75
  /**
54
76
  * Integrity protects functions by using checksum techniques to verify their code has not changed.
55
77
  *
@@ -69,30 +91,21 @@ const StringTemplate = (0, _template.default)("\n function {name}(x){\n retu
69
91
  * - The hashing function is placed during this transformation,
70
92
  * - A hidden identifier is placed to keep track of the name.
71
93
  */
72
-
73
94
  class Integrity extends _transform.default {
74
95
  constructor(o, lock) {
75
96
  super(o);
76
-
77
97
  _defineProperty(this, "hashFn", void 0);
78
-
79
98
  _defineProperty(this, "imulFn", void 0);
80
-
81
99
  _defineProperty(this, "stringFn", void 0);
82
-
83
100
  _defineProperty(this, "seed", void 0);
84
-
85
101
  _defineProperty(this, "lock", void 0);
86
-
87
102
  this.lock = lock;
88
103
  this.seed = (0, _random.getRandomInteger)(0, 1000);
89
104
  }
90
-
91
105
  match(object, parents) {
92
106
  // ArrowFunctions are excluded!
93
107
  return object.type == "Program" || (0, _insert.isFunction)(object) && object.type !== "ArrowFunctionExpression";
94
108
  }
95
-
96
109
  transform(object, parents) {
97
110
  if (object.type == "Program") {
98
111
  return () => {
@@ -101,7 +114,7 @@ class Integrity extends _transform.default {
101
114
  var imulVariableDeclaration = ImulTemplate.single({
102
115
  name: imulName
103
116
  });
104
- imulVariableDeclaration.$dispatcherSkip = true;
117
+ imulVariableDeclaration.$multiTransformSkip = true;
105
118
  this.imulFn = imulVariableDeclaration._hiddenId = (0, _gen.Identifier)(imulName);
106
119
  hashingUtils.push(imulVariableDeclaration);
107
120
  var hashName = this.getPlaceholder();
@@ -111,79 +124,69 @@ class Integrity extends _transform.default {
111
124
  });
112
125
  this.hashFn = hashFunctionDeclaration._hiddenId = (0, _gen.Identifier)(hashName);
113
126
  hashingUtils.push(hashFunctionDeclaration);
114
- hashFunctionDeclaration.$dispatcherSkip = true;
127
+ hashFunctionDeclaration.$multiTransformSkip = true;
115
128
  var stringName = this.getPlaceholder();
116
129
  var stringFunctionDeclaration = StringTemplate.single({
117
130
  name: stringName
118
131
  });
119
132
  this.stringFn = stringFunctionDeclaration._hiddenId = (0, _gen.Identifier)(stringName);
120
133
  hashingUtils.push(stringFunctionDeclaration);
121
- stringFunctionDeclaration.$dispatcherSkip = true;
134
+ stringFunctionDeclaration.$multiTransformSkip = true;
122
135
  var functionExpression = (0, _gen.FunctionExpression)([], (0, _insert.clone)(object.body));
123
136
  object.body = [(0, _gen.ExpressionStatement)((0, _gen.CallExpression)(functionExpression, []))];
124
- object.$dispatcherSkip = true;
137
+ object.$multiTransformSkip = true;
125
138
  object._hiddenHashingUtils = hashingUtils;
126
139
  var ok = this.transform(functionExpression, [object.body[0], object.body, object]);
127
-
128
140
  if (ok) {
129
141
  ok();
130
142
  }
131
-
132
143
  object.$eval = () => {
133
144
  if ((0, _insert.isFunction)(functionExpression) && functionExpression.body.type == "BlockStatement") {
134
145
  if (this.lock.counterMeasuresNode) {
135
146
  functionExpression.body.body.unshift((0, _insert.clone)(this.lock.counterMeasuresNode[0]));
136
147
  }
137
-
138
148
  functionExpression.body.body.unshift(...hashingUtils);
139
149
  }
140
150
  };
141
151
  };
142
152
  }
143
-
144
153
  (0, _assert.ok)((0, _insert.isFunction)(object));
145
-
146
154
  if (object.generator || object.async) {
147
155
  return;
148
156
  }
149
-
150
157
  return () => {
151
158
  object.__hiddenCountermeasures = this.lock.getCounterMeasuresCode(object, parents);
152
-
153
159
  object.$eval = () => {
154
160
  var functionName = this.generateIdentifier();
155
161
  var hashName = this.generateIdentifier();
156
- var functionDeclaration = { ...(0, _insert.clone)(object),
162
+ var functionDeclaration = {
163
+ ...(0, _insert.clone)(object),
157
164
  type: "FunctionDeclaration",
158
165
  id: (0, _gen.Identifier)(functionName),
159
166
  params: object.params || [],
160
167
  body: object.body || (0, _gen.BlockStatement)([]),
161
168
  expression: false,
162
- $dispatcherSkip: true
169
+ $multiTransformSkip: true
163
170
  };
164
171
  var toString = (0, _compiler.compileJsSync)(functionDeclaration, this.options);
165
-
166
172
  if (!toString) {
167
173
  return;
168
174
  }
169
-
170
175
  var minified = toString.replace(/ |\n|;|,|\{|\}|\(|\)|\.|\[|\]/g, "");
171
176
  var hash = cyrb53(minified, this.seed);
172
177
  this.log((object.id ? object.id.name : "function") + " -> " + hash, minified);
173
- var ifStatement = (0, _gen.IfStatement)((0, _gen.BinaryExpression)("==", (0, _gen.Identifier)(hashName), (0, _gen.Literal)(hash)), [(0, _template.default)("return {functionName}.apply(this, arguments)").single({
178
+ var ifStatement = (0, _gen.IfStatement)((0, _gen.BinaryExpression)("==", (0, _gen.Identifier)(hashName), (0, _gen.Literal)(hash)), [new _template.default(`return {functionName}.apply(this, arguments)`).single({
174
179
  functionName: functionName
175
180
  })]);
176
-
177
181
  if (object.__hiddenCountermeasures && object.__hiddenCountermeasures.length) {
178
182
  ifStatement.alternate = (0, _gen.BlockStatement)(object.__hiddenCountermeasures);
179
183
  }
184
+ object.body = (0, _gen.BlockStatement)([functionDeclaration, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(hashName, (0, _gen.CallExpression)((0, _insert.clone)(this.hashFn), [(0, _gen.CallExpression)((0, _insert.clone)(this.stringFn), [(0, _gen.Identifier)(functionName)]), (0, _gen.Literal)(this.seed)]))), ifStatement]);
180
185
 
181
- object.body = (0, _gen.BlockStatement)([functionDeclaration, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(hashName, (0, _gen.CallExpression)((0, _insert.clone)(this.hashFn), [(0, _gen.CallExpression)((0, _insert.clone)(this.stringFn), [(0, _gen.Identifier)(functionName)]), (0, _gen.Literal)(this.seed)]))), ifStatement]); // Make sure the countermeasures activation variable is present
182
-
186
+ // Make sure the countermeasures activation variable is present
183
187
  if (this.lock.counterMeasuresActivated) {
184
188
  object.body.body.unshift((0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(this.lock.counterMeasuresActivated)));
185
189
  }
186
-
187
190
  if (object.type == "ArrowFunctionExpression") {
188
191
  object.type = "FunctionExpression";
189
192
  object.expression = false;
@@ -191,7 +194,5 @@ class Integrity extends _transform.default {
191
194
  };
192
195
  };
193
196
  }
194
-
195
197
  }
196
-
197
198
  exports.default = Integrity;