js-confuser 1.7.3 → 2.0.0-alpha.0

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 (269) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +6 -4
  2. package/CHANGELOG.md +70 -0
  3. package/Migration.md +57 -0
  4. package/README.md +23 -929
  5. package/dist/constants.js +65 -14
  6. package/dist/index.js +108 -160
  7. package/dist/obfuscator.js +316 -118
  8. package/dist/options.js +1 -119
  9. package/dist/order.js +30 -30
  10. package/dist/presets.js +47 -45
  11. package/dist/probability.js +25 -32
  12. package/dist/templates/bufferToStringTemplate.js +9 -0
  13. package/dist/templates/deadCodeTemplates.js +9 -0
  14. package/dist/templates/getGlobalTemplate.js +19 -0
  15. package/dist/templates/integrityTemplate.js +30 -0
  16. package/dist/templates/setFunctionLengthTemplate.js +9 -0
  17. package/dist/templates/stringCompressionTemplate.js +10 -0
  18. package/dist/templates/tamperProtectionTemplates.js +21 -0
  19. package/dist/templates/template.js +199 -184
  20. package/dist/transforms/astScrambler.js +100 -0
  21. package/dist/transforms/calculator.js +70 -127
  22. package/dist/transforms/controlFlowFlattening.js +1182 -0
  23. package/dist/transforms/deadCode.js +62 -587
  24. package/dist/transforms/dispatcher.js +300 -313
  25. package/dist/transforms/extraction/duplicateLiteralsRemoval.js +88 -189
  26. package/dist/transforms/extraction/objectExtraction.js +131 -215
  27. package/dist/transforms/finalizer.js +56 -59
  28. package/dist/transforms/flatten.js +275 -276
  29. package/dist/transforms/functionOutlining.js +230 -0
  30. package/dist/transforms/identifier/globalConcealing.js +214 -135
  31. package/dist/transforms/identifier/movedDeclarations.js +167 -91
  32. package/dist/transforms/identifier/renameVariables.js +239 -193
  33. package/dist/transforms/lock/integrity.js +61 -184
  34. package/dist/transforms/lock/lock.js +261 -387
  35. package/dist/transforms/minify.js +431 -436
  36. package/dist/transforms/opaquePredicates.js +65 -118
  37. package/dist/transforms/pack.js +160 -0
  38. package/dist/transforms/plugin.js +179 -0
  39. package/dist/transforms/preparation.js +261 -173
  40. package/dist/transforms/renameLabels.js +132 -56
  41. package/dist/transforms/rgf.js +140 -267
  42. package/dist/transforms/shuffle.js +52 -145
  43. package/dist/transforms/string/encoding.js +44 -175
  44. package/dist/transforms/string/stringCompression.js +79 -155
  45. package/dist/transforms/string/stringConcealing.js +189 -225
  46. package/dist/transforms/string/stringEncoding.js +32 -40
  47. package/dist/transforms/string/stringSplitting.js +54 -55
  48. package/dist/transforms/variableMasking.js +232 -0
  49. package/dist/utils/ControlObject.js +125 -0
  50. package/dist/utils/IntGen.js +46 -0
  51. package/dist/utils/NameGen.js +106 -0
  52. package/dist/utils/ast-utils.js +560 -0
  53. package/dist/utils/function-utils.js +56 -0
  54. package/dist/utils/gen-utils.js +48 -0
  55. package/dist/utils/node.js +77 -0
  56. package/dist/utils/object-utils.js +21 -0
  57. package/dist/utils/random-utils.js +91 -0
  58. package/dist/utils/static-utils.js +64 -0
  59. package/dist/validateOptions.js +122 -0
  60. package/index.d.ts +1 -17
  61. package/package.json +27 -22
  62. package/src/constants.ts +139 -82
  63. package/src/index.ts +70 -165
  64. package/src/obfuscationResult.ts +43 -0
  65. package/src/obfuscator.ts +328 -135
  66. package/src/options.ts +149 -658
  67. package/src/order.ts +14 -14
  68. package/src/presets.ts +39 -34
  69. package/src/probability.ts +21 -36
  70. package/src/templates/bufferToStringTemplate.ts +57 -0
  71. package/src/templates/deadCodeTemplates.ts +1185 -0
  72. package/src/templates/getGlobalTemplate.ts +72 -0
  73. package/src/templates/integrityTemplate.ts +69 -0
  74. package/src/templates/setFunctionLengthTemplate.ts +11 -0
  75. package/src/templates/stringCompressionTemplate.ts +42 -0
  76. package/src/templates/tamperProtectionTemplates.ts +116 -0
  77. package/src/templates/template.ts +149 -157
  78. package/src/transforms/astScrambler.ts +99 -0
  79. package/src/transforms/calculator.ts +96 -226
  80. package/src/transforms/controlFlowFlattening.ts +1594 -0
  81. package/src/transforms/deadCode.ts +85 -676
  82. package/src/transforms/dispatcher.ts +431 -640
  83. package/src/transforms/extraction/duplicateLiteralsRemoval.ts +147 -295
  84. package/src/transforms/extraction/objectExtraction.ts +160 -333
  85. package/src/transforms/finalizer.ts +63 -64
  86. package/src/transforms/flatten.ts +439 -557
  87. package/src/transforms/functionOutlining.ts +225 -0
  88. package/src/transforms/identifier/globalConcealing.ts +255 -266
  89. package/src/transforms/identifier/movedDeclarations.ts +228 -142
  90. package/src/transforms/identifier/renameVariables.ts +250 -271
  91. package/src/transforms/lock/integrity.ts +85 -263
  92. package/src/transforms/lock/lock.ts +338 -579
  93. package/src/transforms/minify.ts +523 -663
  94. package/src/transforms/opaquePredicates.ts +90 -229
  95. package/src/transforms/pack.ts +195 -0
  96. package/src/transforms/plugin.ts +185 -0
  97. package/src/transforms/preparation.ts +337 -231
  98. package/src/transforms/renameLabels.ts +176 -77
  99. package/src/transforms/rgf.ts +293 -424
  100. package/src/transforms/shuffle.ts +80 -254
  101. package/src/transforms/string/encoding.ts +20 -126
  102. package/src/transforms/string/stringCompression.ts +117 -307
  103. package/src/transforms/string/stringConcealing.ts +254 -342
  104. package/src/transforms/string/stringEncoding.ts +28 -47
  105. package/src/transforms/string/stringSplitting.ts +61 -75
  106. package/src/transforms/variableMasking.ts +257 -0
  107. package/src/utils/ControlObject.ts +141 -0
  108. package/src/utils/IntGen.ts +33 -0
  109. package/src/utils/NameGen.ts +106 -0
  110. package/src/utils/ast-utils.ts +667 -0
  111. package/src/utils/function-utils.ts +50 -0
  112. package/src/utils/gen-utils.ts +48 -0
  113. package/src/utils/node.ts +78 -0
  114. package/src/utils/object-utils.ts +21 -0
  115. package/src/utils/random-utils.ts +79 -0
  116. package/src/utils/static-utils.ts +66 -0
  117. package/src/validateOptions.ts +256 -0
  118. package/tsconfig.json +13 -8
  119. package/babel.config.js +0 -12
  120. package/dev.js +0 -8
  121. package/dist/compiler.js +0 -34
  122. package/dist/parser.js +0 -59
  123. package/dist/precedence.js +0 -66
  124. package/dist/templates/bufferToString.js +0 -129
  125. package/dist/templates/core.js +0 -35
  126. package/dist/templates/crash.js +0 -28
  127. package/dist/templates/es5.js +0 -137
  128. package/dist/templates/functionLength.js +0 -34
  129. package/dist/templates/globals.js +0 -9
  130. package/dist/transforms/antiTooling.js +0 -88
  131. package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +0 -1287
  132. package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +0 -131
  133. package/dist/transforms/es5/antiClass.js +0 -164
  134. package/dist/transforms/es5/antiDestructuring.js +0 -193
  135. package/dist/transforms/es5/antiES6Object.js +0 -185
  136. package/dist/transforms/es5/antiSpreadOperator.js +0 -35
  137. package/dist/transforms/es5/antiTemplate.js +0 -66
  138. package/dist/transforms/es5/es5.js +0 -123
  139. package/dist/transforms/extraction/classExtraction.js +0 -83
  140. package/dist/transforms/identifier/globalAnalysis.js +0 -83
  141. package/dist/transforms/identifier/variableAnalysis.js +0 -104
  142. package/dist/transforms/lock/antiDebug.js +0 -76
  143. package/dist/transforms/stack.js +0 -349
  144. package/dist/transforms/transform.js +0 -372
  145. package/dist/traverse.js +0 -110
  146. package/dist/util/compare.js +0 -145
  147. package/dist/util/gen.js +0 -564
  148. package/dist/util/guard.js +0 -14
  149. package/dist/util/identifiers.js +0 -355
  150. package/dist/util/insert.js +0 -362
  151. package/dist/util/math.js +0 -19
  152. package/dist/util/object.js +0 -40
  153. package/dist/util/random.js +0 -156
  154. package/dist/util/scope.js +0 -20
  155. package/docs/ControlFlowFlattening.md +0 -595
  156. package/docs/Countermeasures.md +0 -70
  157. package/docs/ES5.md +0 -197
  158. package/docs/Integrity.md +0 -82
  159. package/docs/RGF.md +0 -424
  160. package/docs/RenameVariables.md +0 -116
  161. package/docs/TamperProtection.md +0 -100
  162. package/docs/Template.md +0 -117
  163. package/samples/example.js +0 -15
  164. package/samples/high.js +0 -1
  165. package/samples/input.js +0 -3
  166. package/samples/javascriptobfuscator.com.js +0 -8
  167. package/samples/jscrambler_advanced.js +0 -1894
  168. package/samples/jscrambler_light.js +0 -1134
  169. package/samples/low.js +0 -1
  170. package/samples/medium.js +0 -1
  171. package/samples/obfuscator.io.js +0 -1686
  172. package/samples/preemptive.com.js +0 -16
  173. package/src/compiler.ts +0 -35
  174. package/src/parser.ts +0 -49
  175. package/src/precedence.ts +0 -61
  176. package/src/templates/bufferToString.ts +0 -136
  177. package/src/templates/core.ts +0 -29
  178. package/src/templates/crash.ts +0 -23
  179. package/src/templates/es5.ts +0 -131
  180. package/src/templates/functionLength.ts +0 -32
  181. package/src/templates/globals.ts +0 -3
  182. package/src/transforms/antiTooling.ts +0 -102
  183. package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +0 -2153
  184. package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +0 -179
  185. package/src/transforms/es5/antiClass.ts +0 -276
  186. package/src/transforms/es5/antiDestructuring.ts +0 -294
  187. package/src/transforms/es5/antiES6Object.ts +0 -267
  188. package/src/transforms/es5/antiSpreadOperator.ts +0 -56
  189. package/src/transforms/es5/antiTemplate.ts +0 -98
  190. package/src/transforms/es5/es5.ts +0 -149
  191. package/src/transforms/extraction/classExtraction.ts +0 -168
  192. package/src/transforms/identifier/globalAnalysis.ts +0 -102
  193. package/src/transforms/identifier/variableAnalysis.ts +0 -118
  194. package/src/transforms/lock/antiDebug.ts +0 -112
  195. package/src/transforms/stack.ts +0 -557
  196. package/src/transforms/transform.ts +0 -441
  197. package/src/traverse.ts +0 -120
  198. package/src/types.ts +0 -133
  199. package/src/util/compare.ts +0 -181
  200. package/src/util/gen.ts +0 -651
  201. package/src/util/guard.ts +0 -17
  202. package/src/util/identifiers.ts +0 -494
  203. package/src/util/insert.ts +0 -419
  204. package/src/util/math.ts +0 -15
  205. package/src/util/object.ts +0 -39
  206. package/src/util/random.ts +0 -221
  207. package/src/util/scope.ts +0 -21
  208. package/test/code/Cash.src.js +0 -1011
  209. package/test/code/Cash.test.ts +0 -132
  210. package/test/code/Dynamic.src.js +0 -118
  211. package/test/code/Dynamic.test.ts +0 -49
  212. package/test/code/ES6.src.js +0 -235
  213. package/test/code/ES6.test.ts +0 -42
  214. package/test/code/NewFeatures.test.ts +0 -19
  215. package/test/code/StrictMode.src.js +0 -65
  216. package/test/code/StrictMode.test.js +0 -37
  217. package/test/compare.test.ts +0 -104
  218. package/test/index.test.ts +0 -249
  219. package/test/options.test.ts +0 -150
  220. package/test/presets.test.ts +0 -22
  221. package/test/probability.test.ts +0 -44
  222. package/test/templates/template.test.ts +0 -224
  223. package/test/transforms/antiTooling.test.ts +0 -52
  224. package/test/transforms/calculator.test.ts +0 -78
  225. package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +0 -1274
  226. package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +0 -192
  227. package/test/transforms/deadCode.test.ts +0 -85
  228. package/test/transforms/dispatcher.test.ts +0 -457
  229. package/test/transforms/es5/antiClass.test.ts +0 -427
  230. package/test/transforms/es5/antiDestructuring.test.ts +0 -157
  231. package/test/transforms/es5/antiES6Object.test.ts +0 -245
  232. package/test/transforms/es5/antiTemplate.test.ts +0 -116
  233. package/test/transforms/es5/es5.test.ts +0 -110
  234. package/test/transforms/extraction/classExtraction.test.ts +0 -86
  235. package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +0 -200
  236. package/test/transforms/extraction/objectExtraction.test.ts +0 -491
  237. package/test/transforms/flatten.test.ts +0 -721
  238. package/test/transforms/hexadecimalNumbers.test.ts +0 -62
  239. package/test/transforms/identifier/globalConcealing.test.ts +0 -142
  240. package/test/transforms/identifier/movedDeclarations.test.ts +0 -275
  241. package/test/transforms/identifier/renameVariables.test.ts +0 -695
  242. package/test/transforms/lock/antiDebug.test.ts +0 -66
  243. package/test/transforms/lock/browserLock.test.ts +0 -129
  244. package/test/transforms/lock/countermeasures.test.ts +0 -100
  245. package/test/transforms/lock/integrity.test.ts +0 -161
  246. package/test/transforms/lock/lock.test.ts +0 -204
  247. package/test/transforms/lock/osLock.test.ts +0 -312
  248. package/test/transforms/lock/selfDefending.test.ts +0 -68
  249. package/test/transforms/lock/tamperProtection.test.ts +0 -336
  250. package/test/transforms/minify.test.ts +0 -575
  251. package/test/transforms/opaquePredicates.test.ts +0 -43
  252. package/test/transforms/preparation.test.ts +0 -157
  253. package/test/transforms/renameLabels.test.ts +0 -95
  254. package/test/transforms/rgf.test.ts +0 -378
  255. package/test/transforms/shuffle.test.ts +0 -135
  256. package/test/transforms/stack.test.ts +0 -573
  257. package/test/transforms/string/stringCompression.test.ts +0 -120
  258. package/test/transforms/string/stringConcealing.test.ts +0 -299
  259. package/test/transforms/string/stringEncoding.test.ts +0 -95
  260. package/test/transforms/string/stringSplitting.test.ts +0 -135
  261. package/test/transforms/transform.test.ts +0 -66
  262. package/test/traverse.test.ts +0 -139
  263. package/test/util/compare.test.ts +0 -34
  264. package/test/util/gen.test.ts +0 -121
  265. package/test/util/identifiers.test.ts +0 -253
  266. package/test/util/insert.test.ts +0 -142
  267. package/test/util/math.test.ts +0 -5
  268. package/test/util/random.test.ts +0 -71
  269. /package/dist/{types.js → obfuscationResult.js} +0 -0
@@ -1,422 +1,296 @@
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); }
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
- exports.default = void 0;
7
- var _transform = _interopRequireDefault(require("../transform"));
8
- var _gen = require("../../util/gen");
9
- var _traverse = _interopRequireWildcard(require("../../traverse"));
10
- var _random = require("../../util/random");
11
- var _crash = require("../../templates/crash");
12
- var _insert = require("../../util/insert");
13
- var _template = _interopRequireDefault(require("../../templates/template"));
7
+ exports["default"] = void 0;
14
8
  var _order = require("../../order");
15
- var _integrity = _interopRequireDefault(require("./integrity"));
16
- var _antiDebug = _interopRequireDefault(require("./antiDebug"));
17
- var _identifiers = require("../../util/identifiers");
18
- var _compare = require("../../util/compare");
19
- var _assert = require("assert");
20
- var _core = require("../../templates/core");
21
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
22
- 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; }
23
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
24
- 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; }
25
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
26
- 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); }
27
- /**
28
- * Applies browser & date locks.
29
- */
30
- class Lock extends _transform.default {
31
- shouldTransformNativeFunction(nameAndPropertyPath) {
32
- if (!this.options.lock.tamperProtection) {
33
- return false;
34
- }
35
- if (typeof this.options.lock.tamperProtection === "function") {
36
- return this.options.lock.tamperProtection(nameAndPropertyPath.join("."));
37
- }
38
- if (this.options.target === "browser" && nameAndPropertyPath.length === 1 && nameAndPropertyPath[0] === "fetch") {
39
- return true;
40
- }
41
-
42
- // TODO: Allow user to customize this behavior
43
- var globalObject = typeof window !== "undefined" ? window : global;
44
- var fn = globalObject;
45
- for (var item of nameAndPropertyPath) {
46
- fn = fn[item];
47
- if (typeof fn === "undefined") return false;
9
+ var _randomUtils = require("../../utils/random-utils");
10
+ var _template = _interopRequireDefault(require("../../templates/template"));
11
+ var t = _interopRequireWildcard(require("@babel/types"));
12
+ var _astUtils = require("../../utils/ast-utils");
13
+ var _integrity = require("./integrity");
14
+ var _integrityTemplate = require("../../templates/integrityTemplate");
15
+ var _constants = require("../../constants");
16
+ var _tamperProtectionTemplates = require("../../templates/tamperProtectionTemplates");
17
+ var _probability = require("../../probability");
18
+ 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); }
19
+ 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; }
20
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
21
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
22
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
23
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
24
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
25
+ 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; } } }; }
26
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
27
+ 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; }
28
+ var _default = exports["default"] = function _default(_ref) {
29
+ var Plugin = _ref.Plugin;
30
+ var me = Plugin(_order.Order.Lock, {
31
+ changeData: {
32
+ locksInserted: 0
48
33
  }
49
- var hasNativeCode = typeof fn === "function" && ("" + fn).includes("[native code]");
50
- return hasNativeCode;
34
+ });
35
+ if (me.options.lock.startDate instanceof Date) {
36
+ me.options.lock.customLocks.push({
37
+ code: ["\n if(Date.now()<".concat(me.options.lock.startDate.getTime(), ") {\n {countermeasures}\n }\n "), "\n if((new Date()).getTime()<".concat(me.options.lock.startDate.getTime(), ") {\n {countermeasures}\n }\n ")],
38
+ percentagePerBlock: 0.5
39
+ });
51
40
  }
52
- constructor(o) {
53
- super(o, _order.ObfuscateOrder.Lock);
54
-
55
- // Removed feature
56
- // if (this.options.lock.startDate && this.options.lock.endDate) {
57
- // this.before.push(new LockStrings(o));
58
- // }
59
- _defineProperty(this, "globalVar", void 0);
60
- _defineProperty(this, "counterMeasuresNode", void 0);
61
- _defineProperty(this, "iosDetectFn", void 0);
62
- /**
63
- * This is a boolean variable injected into the source code determining wether the countermeasures function has been called.
64
- * This is used to prevent infinite loops from happening
65
- */
66
- _defineProperty(this, "counterMeasuresActivated", void 0);
67
- /**
68
- * The name of the native function that is used to check runtime calls for tampering
69
- */
70
- _defineProperty(this, "nativeFunctionName", void 0);
71
- _defineProperty(this, "made", void 0);
72
- if (this.options.lock.integrity) {
73
- this.before.push(new _integrity.default(o, this));
74
- }
75
- if (this.options.lock.antiDebug) {
76
- this.before.push(new _antiDebug.default(o, this));
77
- }
78
- this.made = 0;
41
+ if (me.options.lock.endDate instanceof Date) {
42
+ me.options.lock.customLocks.push({
43
+ code: ["\n if(Date.now()>".concat(me.options.lock.endDate.getTime(), ") {\n {countermeasures}\n }\n "), "\n if((new Date()).getTime()>".concat(me.options.lock.endDate.getTime(), ") {\n {countermeasures}\n }\n ")],
44
+ percentagePerBlock: 0.5
45
+ });
79
46
  }
80
- apply(tree) {
81
- if (typeof this.options.lock.countermeasures === "string" && (0, _compare.isValidIdentifier)(this.options.lock.countermeasures)) {
82
- (0, _traverse.default)(tree, (object, parents) => {
83
- if (object.type == "Identifier" && object.name === this.options.lock.countermeasures) {
84
- var info = (0, _identifiers.getIdentifierInfo)(object, parents);
85
- if (info.spec.isDefined) {
86
- if (this.counterMeasuresNode) {
87
- throw new Error("Countermeasures function was already defined, it must have a unique name from the rest of your code");
88
- } else {
89
- var definingContext = (0, _insert.getVarContext)(parents[0], parents.slice(1));
90
- if (definingContext != tree) {
91
- throw new Error("Countermeasures function must be defined at the global level");
92
- }
93
- var chain = [object, parents];
94
- if (info.isFunctionDeclaration) {
95
- chain = [parents[0], parents.slice(1)];
96
- } else if (info.isVariableDeclaration) {
97
- chain = [parents[1], parents.slice(2)];
98
- }
99
- this.counterMeasuresNode = chain;
47
+ if (me.options.lock.domainLock) {
48
+ var domainArray = Array.isArray(me.options.lock.domainLock) ? me.options.lock.domainLock : [me.options.lock.domainLock];
49
+ var _iterator = _createForOfIteratorHelper(domainArray),
50
+ _step;
51
+ try {
52
+ var _loop = function _loop() {
53
+ var _regexString = _step.value;
54
+ me.options.lock.customLocks.push({
55
+ code: new _template["default"]("\n if(!new RegExp({regexString}).test(window.location.href)) {\n {countermeasures}\n }\n ").setDefaultVariables({
56
+ regexString: function regexString() {
57
+ return t.stringLiteral(_regexString.toString());
100
58
  }
101
- }
102
- }
103
- });
104
- if (!this.counterMeasuresNode) {
105
- throw new Error("Countermeasures function named '" + this.options.lock.countermeasures + "' was not found.");
59
+ }),
60
+ percentagePerBlock: 0.5
61
+ });
62
+ };
63
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
64
+ _loop();
106
65
  }
107
- }
108
- super.apply(tree);
109
- if (this.options.lock.tamperProtection) {
110
- this.nativeFunctionName = this.getPlaceholder() + "_lockNative";
111
-
112
- // Ensure program is not in strict mode
113
- // Tamper Protection forces non-strict mode
114
-
115
- var strictModeCheck = new _template.default(`
116
- (function(){
117
- function isStrictMode(){
118
- try {
119
- var arr = []
120
- delete arr["length"]
121
- } catch(e) {
122
- return true;
123
- }
124
- return false;
125
- }
126
-
127
- if(isStrictMode()) {
128
- {countermeasures}
129
- ${this.nativeFunctionName} = undefined;
130
- }
131
- })()
132
- `).single({
133
- countermeasures: this.getCounterMeasuresCode(tree, [])
134
- });
135
-
136
- // $multiTransformSkip is used to prevent scoping between transformations
137
- strictModeCheck.$multiTransformSkip = true;
138
- (0, _insert.prepend)(tree, strictModeCheck);
139
- var nativeFunctionCheck = new _template.default(`
140
- function ${this.nativeFunctionName}() {
141
- {IndexOfTemplate}
142
-
143
- function checkFunction(fn){
144
- if (indexOf("" + fn, '{ [native code] }') === -1
145
- ||
146
- typeof Object.getOwnPropertyDescriptor(fn, "toString") !== "undefined"
147
- ) {
148
- {countermeasures}
149
- return undefined
150
- }
151
-
152
- return fn;
153
- }
154
-
155
- var args = arguments
156
- if(args.length === 1) {
157
- return checkFunction(args[0]);
158
- } else if (args.length === 2) {
159
- var object = args[0];
160
- var property = args[1];
161
-
162
- var fn = object[property];
163
- fn = checkFunction(fn);
164
-
165
- return fn.bind(object);
166
- }
167
- }`).single({
168
- IndexOfTemplate: _core.IndexOfTemplate,
169
- countermeasures: this.getCounterMeasuresCode(tree, [])
170
- });
171
-
172
- // $multiTransformSkip is used to prevent scoping between transformations
173
- nativeFunctionCheck.$multiTransformSkip = true;
174
- (0, _insert.prepend)(tree, nativeFunctionCheck);
66
+ } catch (err) {
67
+ _iterator.e(err);
68
+ } finally {
69
+ _iterator.f();
175
70
  }
176
71
  }
177
- getCounterMeasuresCode(object, parents) {
178
- var opt = this.options.lock.countermeasures;
179
- if (opt === false) {
180
- return null;
181
- }
182
-
183
- // Call function
184
- if (typeof opt === "string") {
185
- if (!this.counterMeasuresActivated) {
186
- this.counterMeasuresActivated = this.getPlaceholder();
187
- (0, _insert.prepend)(parents[parents.length - 1] || object, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(this.counterMeasuresActivated)));
188
- }
189
-
190
- // Since Lock occurs before variable renaming, we are using the pre-obfuscated function name
191
- return [(0, _gen.ExpressionStatement)((0, _gen.LogicalExpression)("||", (0, _gen.Identifier)(this.counterMeasuresActivated), (0, _gen.SequenceExpression)([(0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(this.counterMeasuresActivated), (0, _gen.Literal)(true)), (0, _gen.CallExpression)(new _template.default(opt).single().expression, [])])))];
192
- }
193
-
194
- // Default fallback to infinite loop
195
- var varName = this.getPlaceholder();
196
- return (0, _random.choice)([_crash.CrashTemplate1, _crash.CrashTemplate2]).compile({
197
- var: varName
72
+ if (me.options.lock.selfDefending) {
73
+ me.options.lock.customLocks.push({
74
+ code: "\n (\n function(){\n // Breaks any code formatter\n var namedFunction = function(){\n const test = function(){\n const regExp=new RegExp('\\n');\n return regExp['test'](namedFunction)\n };\n\n if(test()) {\n {countermeasures}\n }\n }\n\n return namedFunction();\n }\n )();\n ",
75
+ percentagePerBlock: 0.5
198
76
  });
199
77
  }
200
-
201
- /**
202
- * Converts Dates to numbers, then applies some randomness
203
- * @param object
204
- */
205
- getTime(object) {
206
- if (!object) {
207
- return 0;
208
- }
209
- if (object instanceof Date) {
210
- return this.getTime(object.getTime());
211
- }
212
- return object + (0, _random.getRandomInteger)(-4000, 4000);
78
+ if (me.options.lock.antiDebug) {
79
+ me.options.lock.customLocks.push({
80
+ code: "\n debugger;\n ",
81
+ percentagePerBlock: 0.5
82
+ });
213
83
  }
214
- match(object, parents) {
215
- return (0, _traverse.isBlock)(object);
84
+ var timesMap = new WeakMap();
85
+ var countermeasuresNode;
86
+ var invokeCountermeasuresFnName;
87
+ if (me.options.lock.countermeasures) {
88
+ invokeCountermeasuresFnName = me.getPlaceholder("invokeCountermeasures");
89
+ me.globalState.internals.invokeCountermeasuresFnName = invokeCountermeasuresFnName;
216
90
  }
217
- transform(object, parents) {
218
- if (parents.find(x => (0, _compare.isLoop)(x) && x.type != "SwitchStatement")) {
219
- return;
220
- }
221
-
222
- // no check in countermeasures code, otherwise it will infinitely call itself
223
- if (this.counterMeasuresNode && (object == this.counterMeasuresNode[0] || parents.indexOf(this.counterMeasuresNode[0]) !== -1)) {
224
- return;
225
- }
226
- var block = (0, _traverse.getBlock)(object, parents);
227
- var choices = [];
228
- if (this.options.lock.startDate) {
229
- choices.push("startDate");
91
+ var createCountermeasuresCode = function createCountermeasuresCode() {
92
+ if (invokeCountermeasuresFnName) {
93
+ return new _template["default"]("".concat(invokeCountermeasuresFnName, "()")).compile();
230
94
  }
231
- if (this.options.lock.endDate) {
232
- choices.push("endDate");
95
+ if (me.options.lock.countermeasures === false) {
96
+ return [];
233
97
  }
234
- if (this.options.lock.domainLock && this.options.lock.domainLock.length) {
235
- choices.push("domainLock");
98
+ return new _template["default"]("while(true){}").compile();
99
+ };
100
+ me.globalState.lock.createCountermeasuresCode = createCountermeasuresCode;
101
+ function applyLockToBlock(path, customLock) {
102
+ var times = timesMap.get(customLock);
103
+ if (typeof times === "undefined") {
104
+ times = 0;
236
105
  }
237
- if (this.options.lock.context && this.options.lock.context.length) {
238
- choices.push("context");
239
- }
240
- if (this.options.lock.browserLock && this.options.lock.browserLock.length) {
241
- choices.push("browserLock");
242
- }
243
- if (this.options.lock.osLock && this.options.lock.osLock.length) {
244
- choices.push("osLock");
245
- }
246
- if (this.options.lock.selfDefending) {
247
- choices.push("selfDefending");
106
+ var maxCount = customLock.maxCount || 100; // 100 is default max count
107
+ var minCount = customLock.minCount || 1; // 1 is default min count
108
+
109
+ if (maxCount >= 0 && times > maxCount) {
110
+ // Limit creation, allowing -1 to disable the limit entirely
111
+ return;
248
112
  }
249
- if (!choices.length) {
113
+
114
+ // The Program always gets a lock
115
+ // Else based on the percentage
116
+ // Try to reach the minimum count
117
+ if (!path.isProgram() && !(0, _randomUtils.chance)(customLock.percentagePerBlock * 100) && times >= minCount) {
250
118
  return;
251
119
  }
252
- return () => {
253
- this.made++;
254
- if (this.made > 150) {
255
- return;
256
- }
257
- var type = (0, _random.choice)(choices);
258
- var nodes = [];
259
- var dateNow = (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)("Date"), (0, _gen.Literal)("now"), true), []);
260
- if (Math.random() > 0.5) {
261
- dateNow = (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.NewExpression)((0, _gen.Identifier)("Date"), []), (0, _gen.Literal)("getTime")), []);
262
- }
263
- if (Math.random() > 0.5) {
264
- dateNow = (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.MemberExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)("Date"), (0, _gen.Literal)("prototype"), true), (0, _gen.Literal)("getTime"), true), (0, _gen.Literal)("call"), true), [(0, _gen.NewExpression)((0, _gen.Identifier)("Date"), [])]);
120
+
121
+ // Increment the times
122
+ timesMap.set(customLock, times + 1);
123
+ var lockCode = Array.isArray(customLock.code) ? (0, _randomUtils.choice)(customLock.code) : customLock.code;
124
+ var template = typeof lockCode === "string" ? new _template["default"](lockCode) : lockCode;
125
+ var lockNodes = template.compile({
126
+ countermeasures: function countermeasures() {
127
+ return createCountermeasuresCode();
265
128
  }
266
- var test;
267
- var offset = 0;
268
- switch (type) {
269
- case "selfDefending":
270
- // A very simple mechanism inspired from https://github.com/javascript-obfuscator/javascript-obfuscator/blob/master/src/custom-code-helpers/self-defending/templates/SelfDefendingNoEvalTemplate.ts
271
- // regExp checks for a newline, formatters add these
272
- var callExpression = new _template.default(`
273
- (
274
- function(){
275
- // Breaks JSNice.org, beautifier.io
276
- var namedFunction = function(){
277
- const test = function(){
278
- const regExp=new RegExp('\\n');
279
- return regExp['test'](namedFunction)
280
- };
281
- return test()
282
- }
129
+ });
130
+ var p = path.unshiftContainer("body", lockNodes);
131
+ p.forEach(function (p) {
132
+ return p.skip();
133
+ });
134
+ me.changeData.locksInserted++;
135
+ }
136
+ return {
137
+ visitor: {
138
+ BindingIdentifier: function BindingIdentifier(path) {
139
+ if (path.node.name !== me.options.lock.countermeasures) {
140
+ return;
141
+ }
283
142
 
284
- return namedFunction();
285
- }
286
- )()
287
- `).single().expression;
288
- nodes.push((0, _gen.IfStatement)(callExpression, this.getCounterMeasuresCode(object, parents) || [], null));
289
- break;
290
- case "startDate":
291
- test = (0, _gen.BinaryExpression)("<", dateNow, (0, _gen.Literal)(this.getTime(this.options.lock.startDate)));
292
- nodes.push((0, _gen.IfStatement)(test, this.getCounterMeasuresCode(object, parents) || [], null));
293
- break;
294
- case "endDate":
295
- test = (0, _gen.BinaryExpression)(">", dateNow, (0, _gen.Literal)(this.getTime(this.options.lock.endDate)));
296
- nodes.push((0, _gen.IfStatement)(test, this.getCounterMeasuresCode(object, parents) || [], null));
297
- break;
298
- case "context":
299
- var prop = (0, _random.choice)(this.options.lock.context);
300
- var code = this.getCounterMeasuresCode(object, parents) || [];
143
+ // Exclude labels
144
+ if (!(0, _astUtils.isVariableIdentifier)(path)) return;
145
+ if (!(0, _astUtils.isDefiningIdentifier)(path)) {
146
+ // Reassignments are not allowed
301
147
 
302
- // Todo: Alternative to `this`
303
- if (!this.globalVar) {
304
- offset = 1;
305
- this.globalVar = this.getPlaceholder();
306
- (0, _insert.prepend)(parents[parents.length - 1] || block, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(this.globalVar, (0, _gen.LogicalExpression)("||", (0, _gen.Identifier)(this.options.globalVariables.keys().next().value), (0, _gen.ThisExpression)()))));
148
+ me.error("Countermeasures function cannot be reassigned");
149
+ }
150
+ if (countermeasuresNode) {
151
+ // Disallow multiple countermeasures functions
152
+
153
+ me.error("Countermeasures function was already defined, it must have a unique name from the rest of your code");
154
+ }
155
+ if (path.scope.getBinding(path.node.name).scope !== path.scope.getProgramParent()) {
156
+ me.error("Countermeasures function must be defined at the global level");
157
+ }
158
+ countermeasuresNode = path;
159
+ },
160
+ Block: {
161
+ exit: function exit(path) {
162
+ var customLock = (0, _randomUtils.choice)(me.options.lock.customLocks);
163
+ if (customLock) {
164
+ applyLockToBlock(path, customLock);
307
165
  }
308
- test = (0, _gen.UnaryExpression)("!", (0, _gen.MemberExpression)((0, _gen.Identifier)(this.globalVar), (0, _gen.Literal)(prop), true));
309
- nodes.push((0, _gen.IfStatement)(test, code, null));
310
- break;
311
- case "osLock":
312
- var navigatorUserAgent = new _template.default(`window.navigator.userAgent.toLowerCase()`).single().expression;
313
- (0, _assert.ok)(this.options.lock.osLock);
314
- var code = this.getCounterMeasuresCode(object, parents) || [];
315
- this.options.lock.osLock.forEach(osName => {
316
- var agentMatcher = {
317
- windows: "Win",
318
- linux: "Linux",
319
- osx: "Mac",
320
- android: "Android",
321
- ios: "---"
322
- }[osName];
323
- var thisTest = (0, _gen.CallExpression)((0, _gen.MemberExpression)(navigatorUserAgent, (0, _gen.Literal)("match"), true), [(0, _gen.Literal)(agentMatcher.toLowerCase())]);
324
- if (osName == "ios" && this.options.target === "browser") {
325
- if (!this.iosDetectFn) {
326
- this.iosDetectFn = this.getPlaceholder();
327
- (0, _insert.prepend)(parents[parents.length - 1] || object, new _template.default(`function ${this.iosDetectFn}() {
328
- return [
329
- 'iPad Simulator',
330
- 'iPhone Simulator',
331
- 'iPod Simulator',
332
- 'iPad',
333
- 'iPhone',
334
- 'iPod'
335
- ].includes(navigator.platform)
336
- // iPad on iOS 13 detection
337
- || (navigator.userAgent.includes("Mac") && "ontouchend" in document)
338
- }`).single());
166
+ }
167
+ },
168
+ Program: {
169
+ exit: function exit(path) {
170
+ // Insert nativeFunctionCheck
171
+ if (me.options.lock.tamperProtection) {
172
+ // Disallow strict mode
173
+ // Tamper Protection uses non-strict mode features:
174
+ // - eval() with local scope assignments
175
+ var directives = path.get("directives");
176
+ var _iterator2 = _createForOfIteratorHelper(directives),
177
+ _step2;
178
+ try {
179
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
180
+ var directive = _step2.value;
181
+ if (directive.node.value.value === "use strict") {
182
+ me.error("Tamper Protection cannot be applied to code in strict mode. Disable strict mode by removing the 'use strict' directive, or disable Tamper Protection.");
183
+ }
339
184
  }
340
- thisTest = (0, _gen.CallExpression)((0, _gen.Identifier)(this.iosDetectFn), []);
341
- }
342
- if (this.options.target === "node") {
343
- var platformName = {
344
- windows: "win32",
345
- osx: "darwin",
346
- ios: "darwin"
347
- }[osName] || osName;
348
- thisTest = new _template.default(`require('os').platform()==="${platformName}"`).single().expression;
349
- }
350
- if (!test) {
351
- test = thisTest;
352
- } else {
353
- test = (0, _gen.LogicalExpression)("||", {
354
- ...test
355
- }, thisTest);
185
+ } catch (err) {
186
+ _iterator2.e(err);
187
+ } finally {
188
+ _iterator2.f();
356
189
  }
357
- });
358
- test = (0, _gen.UnaryExpression)("!", {
359
- ...test
360
- });
361
- nodes.push((0, _gen.IfStatement)(test, code, null));
362
- break;
363
- case "browserLock":
364
- var navigatorUserAgent = new _template.default(`window.navigator.userAgent.toLowerCase()`).single().expression;
365
- (0, _assert.ok)(this.options.lock.browserLock);
366
- this.options.lock.browserLock.forEach(browserName => {
367
- var thisTest = (0, _gen.CallExpression)((0, _gen.MemberExpression)(navigatorUserAgent, (0, _gen.Literal)("match"), true), [(0, _gen.Literal)(browserName == "iexplorer" ? "msie" : browserName.toLowerCase())]);
368
- if (browserName === "safari") {
369
- thisTest = new _template.default(`/^((?!chrome|android).)*safari/i.test(navigator.userAgent)`).single().expression;
370
- }
371
- if (!test) {
372
- test = thisTest;
373
- } else {
374
- test = (0, _gen.LogicalExpression)("||", {
375
- ...test
376
- }, thisTest);
190
+ var nativeFunctionName = me.getPlaceholder() + "_nativeFunctionCheck";
191
+ me.obfuscator.globalState.internals.nativeFunctionName = nativeFunctionName;
192
+
193
+ // Ensure program is not in strict mode
194
+ // Tamper Protection forces non-strict mode
195
+ (0, _astUtils.prependProgram)(path, _tamperProtectionTemplates.StrictModeTemplate.compile({
196
+ nativeFunctionName: nativeFunctionName,
197
+ countermeasures: createCountermeasuresCode()
198
+ }));
199
+ var nativeFunctionDeclaration = _tamperProtectionTemplates.NativeFunctionTemplate.single({
200
+ nativeFunctionName: nativeFunctionName,
201
+ countermeasures: createCountermeasuresCode(),
202
+ IndexOfTemplate: _tamperProtectionTemplates.IndexOfTemplate
203
+ });
204
+
205
+ // Checks function's toString() value for [native code] signature
206
+ (0, _astUtils.prependProgram)(path, nativeFunctionDeclaration);
207
+ }
208
+
209
+ // Insert invokeCountermeasures function
210
+ if (invokeCountermeasuresFnName) {
211
+ if (!countermeasuresNode) {
212
+ me.error("Countermeasures function named '" + me.options.lock.countermeasures + "' was not found.");
377
213
  }
378
- });
379
- test = (0, _gen.UnaryExpression)("!", {
380
- ...test
381
- });
382
- nodes.push((0, _gen.IfStatement)(test, this.getCounterMeasuresCode(object, parents) || [], null));
383
- break;
384
- case "domainLock":
385
- function removeSlashes(path) {
386
- var count = path.length - 1;
387
- var index = 0;
388
- while (path.charCodeAt(index) === 47 && ++index);
389
- while (path.charCodeAt(count) === 47 && --count);
390
- return path.slice(index, count + 1);
214
+ var hasInvoked = me.getPlaceholder("hasInvoked");
215
+ var statements = new _template["default"]("\n var ".concat(hasInvoked, " = false;\n function ").concat(invokeCountermeasuresFnName, "(){\n if(").concat(hasInvoked, ") return;\n ").concat(hasInvoked, " = true;\n ").concat(me.options.lock.countermeasures, "();\n }\n ")).addSymbols(_constants.MULTI_TRANSFORM).compile();
216
+ (0, _astUtils.prependProgram)(path, statements).forEach(function (p) {
217
+ return p.skip();
218
+ });
391
219
  }
392
- var locationHref = (0, _gen.MemberExpression)((0, _gen.Identifier)("location"), (0, _gen.Literal)("href"), true);
393
- var random = (0, _random.choice)(this.options.lock.domainLock);
394
- if (random) {
395
- test = (0, _gen.CallExpression)((0, _gen.MemberExpression)(locationHref, (0, _gen.Literal)("match"), true), [{
396
- type: "Literal",
397
- regex: {
398
- pattern: random instanceof RegExp ? random.source : removeSlashes(random + ""),
399
- flags: random instanceof RegExp ? "" : ""
220
+ if (me.options.lock.integrity) {
221
+ var hashFnName = me.getPlaceholder() + "_hash";
222
+ var imulFnName = me.getPlaceholder() + "_imul";
223
+ var _sensitivityRegex = me.globalState.lock.integrity.sensitivityRegex;
224
+ me.globalState.internals.integrityHashName = hashFnName;
225
+ var hashCode = _integrityTemplate.HashTemplate.compile({
226
+ imul: imulFnName,
227
+ name: hashFnName,
228
+ hashingUtilFnName: me.getPlaceholder(),
229
+ sensitivityRegex: function sensitivityRegex() {
230
+ return t.newExpression(t.identifier("RegExp"), [t.stringLiteral(_sensitivityRegex.source), t.stringLiteral(_sensitivityRegex.flags)]);
400
231
  }
401
- }]);
402
- test = (0, _gen.UnaryExpression)("!", test);
403
- if (Math.random() > 0.5) {
404
- test = (0, _gen.LogicalExpression)("||", (0, _gen.BinaryExpression)("==", (0, _gen.UnaryExpression)("typeof", (0, _gen.Identifier)("location")), (0, _gen.Literal)("undefined")), test);
405
- }
406
- nodes.push((0, _gen.IfStatement)(test, this.getCounterMeasuresCode(object, parents) || [], null));
232
+ });
233
+ (0, _astUtils.prependProgram)(path, hashCode);
407
234
  }
408
- break;
409
- }
410
- if (nodes.length) {
411
- var body = (0, _insert.getBlockBody)(block);
412
- var randomIndex = (0, _random.getRandomInteger)(0, body.length) + offset;
413
- if (randomIndex >= body.length) {
414
- body.push(...nodes);
415
- } else {
416
- body.splice(randomIndex, 0, ...nodes);
235
+ }
236
+ },
237
+ // Integrity first pass
238
+ // Functions are prepared for Integrity by simply extracting the function body
239
+ // The extracted function is hashed in the 'integrity' plugin
240
+ FunctionDeclaration: {
241
+ exit: function exit(funcDecPath) {
242
+ if (!me.options.lock.integrity) return;
243
+
244
+ // Mark functions for integrity
245
+ // Don't apply to async or generator functions
246
+ if (funcDecPath.node.async || funcDecPath.node.generator) return;
247
+ if (funcDecPath.find(function (p) {
248
+ return !!p.node[_constants.SKIP];
249
+ })) return;
250
+ var program = (0, _astUtils.getParentFunctionOrProgram)(funcDecPath);
251
+ // Only top-level functions
252
+ if (!program.isProgram()) return;
253
+
254
+ // Check user's custom implementation
255
+ var functionName = (0, _astUtils.getFunctionName)(funcDecPath);
256
+ // Don't apply to the countermeasures function (Intended)
257
+ if (me.options.lock.countermeasures && functionName === me.options.lock.countermeasures) return;
258
+ // Don't apply to invokeCountermeasures function (Intended)
259
+ if (me.obfuscator.isInternalVariable(functionName)) return;
260
+ if (!(0, _probability.computeProbabilityMap)(me.options.lock.integrity, functionName)) return;
261
+ var newFnName = me.getPlaceholder();
262
+ var newFunctionDeclaration = t.functionDeclaration(t.identifier(newFnName), funcDecPath.node.params, funcDecPath.node.body);
263
+
264
+ // Clone semantic symbols like (UNSAFE, PREDICTABLE, MULTI_TRANSFORM, etc)
265
+ var source = funcDecPath.node;
266
+ Object.getOwnPropertySymbols(source).forEach(function (symbol) {
267
+ newFunctionDeclaration[symbol] = source[symbol];
268
+ });
269
+ newFunctionDeclaration[_constants.SKIP] = true;
270
+ var _program$unshiftConta = program.unshiftContainer("body", newFunctionDeclaration),
271
+ _program$unshiftConta2 = _slicedToArray(_program$unshiftConta, 1),
272
+ newFnPath = _program$unshiftConta2[0];
273
+
274
+ // Function simply calls the new function
275
+ // In the case Integrity cannot transform the function, the original behavior is preserved
276
+ funcDecPath.node.body = t.blockStatement(new _template["default"]("\n return ".concat(newFnName, "(...arguments);\n ")).compile(), funcDecPath.node.body.directives);
277
+
278
+ // Parameters no longer needed, using 'arguments' instead
279
+ funcDecPath.node.params = [];
280
+
281
+ // Mark the function as unsafe - use of 'arguments' is unsafe
282
+ funcDecPath.node[_constants.UNSAFE] = true;
283
+
284
+ // Params changed - function is no longer predictable
285
+ funcDecPath.node[_constants.PREDICTABLE] = false;
286
+
287
+ // Mark the function for integrity
288
+ funcDecPath.node[_integrity.INTEGRITY] = {
289
+ fnPath: newFnPath,
290
+ fnName: newFnName
291
+ };
417
292
  }
418
293
  }
419
- };
420
- }
421
- }
422
- exports.default = Lock;
294
+ }
295
+ };
296
+ };