js-confuser 1.7.2 → 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.
- package/.github/ISSUE_TEMPLATE/bug_report.md +6 -4
- package/.github/workflows/node.js.yml +1 -1
- package/CHANGELOG.md +105 -0
- package/Migration.md +57 -0
- package/README.md +23 -913
- package/dist/constants.js +69 -13
- package/dist/index.js +108 -152
- package/dist/obfuscator.js +316 -118
- package/dist/options.js +1 -109
- package/dist/order.js +30 -30
- package/dist/presets.js +47 -45
- package/dist/probability.js +25 -32
- package/dist/templates/bufferToStringTemplate.js +9 -0
- package/dist/templates/deadCodeTemplates.js +9 -0
- package/dist/templates/getGlobalTemplate.js +19 -0
- package/dist/templates/integrityTemplate.js +30 -0
- package/dist/templates/setFunctionLengthTemplate.js +9 -0
- package/dist/templates/stringCompressionTemplate.js +10 -0
- package/dist/templates/tamperProtectionTemplates.js +21 -0
- package/dist/templates/template.js +213 -93
- package/dist/transforms/astScrambler.js +100 -0
- package/dist/transforms/calculator.js +70 -127
- package/dist/transforms/controlFlowFlattening.js +1182 -0
- package/dist/transforms/deadCode.js +62 -577
- package/dist/transforms/dispatcher.js +300 -309
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +88 -189
- package/dist/transforms/extraction/objectExtraction.js +131 -215
- package/dist/transforms/finalizer.js +56 -59
- package/dist/transforms/flatten.js +275 -276
- package/dist/transforms/functionOutlining.js +230 -0
- package/dist/transforms/identifier/globalConcealing.js +217 -103
- package/dist/transforms/identifier/movedDeclarations.js +167 -91
- package/dist/transforms/identifier/renameVariables.js +240 -187
- package/dist/transforms/lock/integrity.js +61 -184
- package/dist/transforms/lock/lock.js +263 -303
- package/dist/transforms/minify.js +431 -436
- package/dist/transforms/opaquePredicates.js +65 -118
- package/dist/transforms/pack.js +160 -0
- package/dist/transforms/plugin.js +179 -0
- package/dist/transforms/preparation.js +263 -163
- package/dist/transforms/renameLabels.js +132 -56
- package/dist/transforms/rgf.js +142 -240
- package/dist/transforms/shuffle.js +52 -145
- package/dist/transforms/string/encoding.js +45 -173
- package/dist/transforms/string/stringCompression.js +81 -126
- package/dist/transforms/string/stringConcealing.js +189 -224
- package/dist/transforms/string/stringEncoding.js +32 -40
- package/dist/transforms/string/stringSplitting.js +54 -55
- package/dist/transforms/variableMasking.js +232 -0
- package/dist/utils/ControlObject.js +125 -0
- package/dist/utils/IntGen.js +46 -0
- package/dist/utils/NameGen.js +106 -0
- package/dist/utils/ast-utils.js +560 -0
- package/dist/utils/function-utils.js +56 -0
- package/dist/utils/gen-utils.js +48 -0
- package/dist/utils/node.js +77 -0
- package/dist/utils/object-utils.js +21 -0
- package/dist/utils/random-utils.js +91 -0
- package/dist/utils/static-utils.js +64 -0
- package/dist/validateOptions.js +122 -0
- package/index.d.ts +1 -17
- package/package.json +27 -22
- package/src/constants.ts +139 -77
- package/src/index.ts +70 -163
- package/src/obfuscationResult.ts +43 -0
- package/src/obfuscator.ts +328 -135
- package/src/options.ts +154 -623
- package/src/order.ts +14 -14
- package/src/presets.ts +39 -34
- package/src/probability.ts +21 -36
- package/src/templates/{bufferToString.ts → bufferToStringTemplate.ts} +5 -54
- package/src/templates/deadCodeTemplates.ts +1185 -0
- package/src/templates/getGlobalTemplate.ts +72 -0
- package/src/templates/integrityTemplate.ts +69 -0
- package/src/templates/setFunctionLengthTemplate.ts +11 -0
- package/src/templates/stringCompressionTemplate.ts +42 -0
- package/src/templates/tamperProtectionTemplates.ts +116 -0
- package/src/templates/template.ts +183 -92
- package/src/transforms/astScrambler.ts +99 -0
- package/src/transforms/calculator.ts +96 -224
- package/src/transforms/controlFlowFlattening.ts +1594 -0
- package/src/transforms/deadCode.ts +85 -628
- package/src/transforms/dispatcher.ts +431 -636
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +147 -299
- package/src/transforms/extraction/objectExtraction.ts +160 -333
- package/src/transforms/finalizer.ts +63 -64
- package/src/transforms/flatten.ts +439 -557
- package/src/transforms/functionOutlining.ts +225 -0
- package/src/transforms/identifier/globalConcealing.ts +261 -189
- package/src/transforms/identifier/movedDeclarations.ts +228 -142
- package/src/transforms/identifier/renameVariables.ts +252 -258
- package/src/transforms/lock/integrity.ts +84 -260
- package/src/transforms/lock/lock.ts +342 -491
- package/src/transforms/minify.ts +523 -663
- package/src/transforms/opaquePredicates.ts +90 -229
- package/src/transforms/pack.ts +195 -0
- package/src/transforms/plugin.ts +185 -0
- package/src/transforms/preparation.ts +337 -215
- package/src/transforms/renameLabels.ts +176 -77
- package/src/transforms/rgf.ts +293 -386
- package/src/transforms/shuffle.ts +80 -254
- package/src/transforms/string/encoding.ts +26 -129
- package/src/transforms/string/stringCompression.ts +118 -236
- package/src/transforms/string/stringConcealing.ts +255 -339
- package/src/transforms/string/stringEncoding.ts +28 -47
- package/src/transforms/string/stringSplitting.ts +61 -75
- package/src/transforms/variableMasking.ts +257 -0
- package/src/utils/ControlObject.ts +141 -0
- package/src/utils/IntGen.ts +33 -0
- package/src/utils/NameGen.ts +106 -0
- package/src/utils/ast-utils.ts +667 -0
- package/src/utils/function-utils.ts +50 -0
- package/src/utils/gen-utils.ts +48 -0
- package/src/utils/node.ts +78 -0
- package/src/utils/object-utils.ts +21 -0
- package/src/utils/random-utils.ts +79 -0
- package/src/utils/static-utils.ts +66 -0
- package/src/validateOptions.ts +256 -0
- package/tsconfig.json +13 -8
- package/babel.config.js +0 -12
- package/dev.js +0 -8
- package/dist/compiler.js +0 -34
- package/dist/parser.js +0 -59
- package/dist/precedence.js +0 -66
- package/dist/templates/bufferToString.js +0 -108
- package/dist/templates/crash.js +0 -59
- package/dist/templates/es5.js +0 -137
- package/dist/templates/functionLength.js +0 -34
- package/dist/templates/globals.js +0 -9
- package/dist/transforms/antiTooling.js +0 -88
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +0 -1281
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +0 -131
- package/dist/transforms/es5/antiClass.js +0 -164
- package/dist/transforms/es5/antiDestructuring.js +0 -193
- package/dist/transforms/es5/antiES6Object.js +0 -185
- package/dist/transforms/es5/antiSpreadOperator.js +0 -35
- package/dist/transforms/es5/antiTemplate.js +0 -66
- package/dist/transforms/es5/es5.js +0 -123
- package/dist/transforms/extraction/classExtraction.js +0 -83
- package/dist/transforms/identifier/globalAnalysis.js +0 -70
- package/dist/transforms/identifier/variableAnalysis.js +0 -104
- package/dist/transforms/lock/antiDebug.js +0 -76
- package/dist/transforms/stack.js +0 -343
- package/dist/transforms/transform.js +0 -350
- package/dist/traverse.js +0 -110
- package/dist/util/compare.js +0 -145
- package/dist/util/gen.js +0 -564
- package/dist/util/guard.js +0 -9
- package/dist/util/identifiers.js +0 -355
- package/dist/util/insert.js +0 -362
- package/dist/util/math.js +0 -19
- package/dist/util/object.js +0 -40
- package/dist/util/random.js +0 -130
- package/dist/util/scope.js +0 -20
- package/docs/ControlFlowFlattening.md +0 -595
- package/docs/Countermeasures.md +0 -63
- package/docs/ES5.md +0 -197
- package/docs/Integrity.md +0 -75
- package/docs/RGF.md +0 -419
- package/samples/example.js +0 -15
- package/samples/high.js +0 -1
- package/samples/input.js +0 -3
- package/samples/javascriptobfuscator.com.js +0 -8
- package/samples/jscrambler_advanced.js +0 -1894
- package/samples/jscrambler_light.js +0 -1134
- package/samples/low.js +0 -1
- package/samples/medium.js +0 -1
- package/samples/obfuscator.io.js +0 -1686
- package/samples/preemptive.com.js +0 -16
- package/src/compiler.ts +0 -35
- package/src/parser.ts +0 -49
- package/src/precedence.ts +0 -61
- package/src/templates/crash.ts +0 -55
- package/src/templates/es5.ts +0 -131
- package/src/templates/functionLength.ts +0 -32
- package/src/templates/globals.ts +0 -3
- package/src/transforms/antiTooling.ts +0 -102
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +0 -2146
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +0 -179
- package/src/transforms/es5/antiClass.ts +0 -272
- package/src/transforms/es5/antiDestructuring.ts +0 -294
- package/src/transforms/es5/antiES6Object.ts +0 -267
- package/src/transforms/es5/antiSpreadOperator.ts +0 -56
- package/src/transforms/es5/antiTemplate.ts +0 -98
- package/src/transforms/es5/es5.ts +0 -149
- package/src/transforms/extraction/classExtraction.ts +0 -168
- package/src/transforms/identifier/globalAnalysis.ts +0 -85
- package/src/transforms/identifier/variableAnalysis.ts +0 -118
- package/src/transforms/lock/antiDebug.ts +0 -112
- package/src/transforms/stack.ts +0 -551
- package/src/transforms/transform.ts +0 -453
- package/src/traverse.ts +0 -120
- package/src/types.ts +0 -131
- package/src/util/compare.ts +0 -181
- package/src/util/gen.ts +0 -651
- package/src/util/guard.ts +0 -7
- package/src/util/identifiers.ts +0 -494
- package/src/util/insert.ts +0 -419
- package/src/util/math.ts +0 -15
- package/src/util/object.ts +0 -39
- package/src/util/random.ts +0 -141
- package/src/util/scope.ts +0 -21
- package/test/code/Cash.src.js +0 -1011
- package/test/code/Cash.test.ts +0 -49
- package/test/code/Dynamic.src.js +0 -118
- package/test/code/Dynamic.test.ts +0 -49
- package/test/code/ES6.src.js +0 -235
- package/test/code/ES6.test.ts +0 -42
- package/test/code/NewFeatures.test.ts +0 -19
- package/test/code/StrictMode.src.js +0 -65
- package/test/code/StrictMode.test.js +0 -37
- package/test/compare.test.ts +0 -104
- package/test/index.test.ts +0 -249
- package/test/options.test.ts +0 -132
- package/test/presets.test.ts +0 -22
- package/test/probability.test.ts +0 -44
- package/test/templates/template.test.ts +0 -14
- package/test/transforms/antiTooling.test.ts +0 -52
- package/test/transforms/calculator.test.ts +0 -78
- package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +0 -1274
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +0 -192
- package/test/transforms/deadCode.test.ts +0 -85
- package/test/transforms/dispatcher.test.ts +0 -457
- package/test/transforms/es5/antiClass.test.ts +0 -427
- package/test/transforms/es5/antiDestructuring.test.ts +0 -157
- package/test/transforms/es5/antiES6Object.test.ts +0 -245
- package/test/transforms/es5/antiTemplate.test.ts +0 -116
- package/test/transforms/es5/es5.test.ts +0 -110
- package/test/transforms/extraction/classExtraction.test.ts +0 -86
- package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +0 -200
- package/test/transforms/extraction/objectExtraction.test.ts +0 -491
- package/test/transforms/flatten.test.ts +0 -721
- package/test/transforms/hexadecimalNumbers.test.ts +0 -62
- package/test/transforms/identifier/globalConcealing.test.ts +0 -72
- package/test/transforms/identifier/movedDeclarations.test.ts +0 -275
- package/test/transforms/identifier/renameVariables.test.ts +0 -621
- package/test/transforms/lock/antiDebug.test.ts +0 -66
- package/test/transforms/lock/browserLock.test.ts +0 -129
- package/test/transforms/lock/countermeasures.test.ts +0 -100
- package/test/transforms/lock/integrity.test.ts +0 -161
- package/test/transforms/lock/lock.test.ts +0 -204
- package/test/transforms/lock/osLock.test.ts +0 -312
- package/test/transforms/lock/selfDefending.test.ts +0 -68
- package/test/transforms/minify.test.ts +0 -575
- package/test/transforms/opaquePredicates.test.ts +0 -43
- package/test/transforms/preparation.test.ts +0 -157
- package/test/transforms/renameLabels.test.ts +0 -95
- package/test/transforms/rgf.test.ts +0 -378
- package/test/transforms/shuffle.test.ts +0 -135
- package/test/transforms/stack.test.ts +0 -573
- package/test/transforms/string/stringCompression.test.ts +0 -120
- package/test/transforms/string/stringConcealing.test.ts +0 -299
- package/test/transforms/string/stringEncoding.test.ts +0 -95
- package/test/transforms/string/stringSplitting.test.ts +0 -135
- package/test/transforms/transform.test.ts +0 -66
- package/test/traverse.test.ts +0 -139
- package/test/util/compare.test.ts +0 -34
- package/test/util/gen.test.ts +0 -121
- package/test/util/identifiers.test.ts +0 -253
- package/test/util/insert.test.ts +0 -142
- package/test/util/math.test.ts +0 -5
- package/test/util/random.test.ts +0 -71
- /package/dist/{types.js → obfuscationResult.js} +0 -0
|
@@ -1,336 +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
|
|
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
|
|
16
|
-
var
|
|
17
|
-
var
|
|
18
|
-
var
|
|
19
|
-
var
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
function
|
|
25
|
-
function
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
_defineProperty(this, "iosDetectFn", void 0);
|
|
40
|
-
/**
|
|
41
|
-
* This is a boolean variable injected into the source code determining wether the countermeasures function has been called.
|
|
42
|
-
* This is used to prevent infinite loops from happening
|
|
43
|
-
*/
|
|
44
|
-
_defineProperty(this, "counterMeasuresActivated", void 0);
|
|
45
|
-
_defineProperty(this, "made", void 0);
|
|
46
|
-
if (this.options.lock.integrity) {
|
|
47
|
-
this.before.push(new _integrity.default(o, this));
|
|
48
|
-
}
|
|
49
|
-
if (this.options.lock.antiDebug) {
|
|
50
|
-
this.before.push(new _antiDebug.default(o, this));
|
|
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
|
|
51
33
|
}
|
|
52
|
-
|
|
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
|
+
});
|
|
53
40
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
(
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
chain = [parents[1], parents.slice(2)];
|
|
72
|
-
}
|
|
73
|
-
this.counterMeasuresNode = chain;
|
|
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
|
+
});
|
|
46
|
+
}
|
|
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());
|
|
74
58
|
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
59
|
+
}),
|
|
60
|
+
percentagePerBlock: 0.5
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
64
|
+
_loop();
|
|
80
65
|
}
|
|
66
|
+
} catch (err) {
|
|
67
|
+
_iterator.e(err);
|
|
68
|
+
} finally {
|
|
69
|
+
_iterator.f();
|
|
81
70
|
}
|
|
82
|
-
super.apply(tree);
|
|
83
71
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Call function
|
|
91
|
-
if (typeof opt === "string") {
|
|
92
|
-
if (!this.counterMeasuresActivated) {
|
|
93
|
-
this.counterMeasuresActivated = this.getPlaceholder();
|
|
94
|
-
(0, _insert.prepend)(parents[parents.length - 1] || object, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(this.counterMeasuresActivated)));
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Since Lock occurs before variable renaming, we are using the pre-obfuscated function name
|
|
98
|
-
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)((0, _template.default)(opt).single().expression, [])])))];
|
|
99
|
-
}
|
|
100
|
-
var type = (0, _random.choice)(["crash", "exit"]);
|
|
101
|
-
switch (type) {
|
|
102
|
-
case "crash":
|
|
103
|
-
var varName = this.getPlaceholder();
|
|
104
|
-
return (0, _random.choice)([_crash.CrashTemplate1, _crash.CrashTemplate2, _crash.CrashTemplate3]).compile({
|
|
105
|
-
var: varName
|
|
106
|
-
});
|
|
107
|
-
case "exit":
|
|
108
|
-
if (this.options.target == "browser") {
|
|
109
|
-
return (0, _template.default)("document.documentElement.innerHTML = '';").compile();
|
|
110
|
-
}
|
|
111
|
-
return (0, _template.default)("process.exit()").compile();
|
|
112
|
-
}
|
|
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
|
|
76
|
+
});
|
|
113
77
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
getTime(object) {
|
|
120
|
-
if (!object) {
|
|
121
|
-
return 0;
|
|
122
|
-
}
|
|
123
|
-
if (object instanceof Date) {
|
|
124
|
-
return this.getTime(object.getTime());
|
|
125
|
-
}
|
|
126
|
-
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
|
+
});
|
|
127
83
|
}
|
|
128
|
-
|
|
129
|
-
|
|
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;
|
|
130
90
|
}
|
|
131
|
-
|
|
132
|
-
if (
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// no check in countermeasures code, otherwise it will infinitely call itself
|
|
137
|
-
if (this.counterMeasuresNode && (object == this.counterMeasuresNode[0] || parents.indexOf(this.counterMeasuresNode[0]) !== -1)) {
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
var block = (0, _traverse.getBlock)(object, parents);
|
|
141
|
-
var choices = [];
|
|
142
|
-
if (this.options.lock.startDate) {
|
|
143
|
-
choices.push("startDate");
|
|
144
|
-
}
|
|
145
|
-
if (this.options.lock.endDate) {
|
|
146
|
-
choices.push("endDate");
|
|
91
|
+
var createCountermeasuresCode = function createCountermeasuresCode() {
|
|
92
|
+
if (invokeCountermeasuresFnName) {
|
|
93
|
+
return new _template["default"]("".concat(invokeCountermeasuresFnName, "()")).compile();
|
|
147
94
|
}
|
|
148
|
-
if (
|
|
149
|
-
|
|
95
|
+
if (me.options.lock.countermeasures === false) {
|
|
96
|
+
return [];
|
|
150
97
|
}
|
|
151
|
-
|
|
152
|
-
|
|
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;
|
|
153
105
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
if (
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
if (this.options.lock.selfDefending) {
|
|
161
|
-
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;
|
|
162
112
|
}
|
|
163
|
-
|
|
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) {
|
|
164
118
|
return;
|
|
165
119
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
if (Math.random() > 0.5) {
|
|
175
|
-
dateNow = (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.NewExpression)((0, _gen.Identifier)("Date"), []), (0, _gen.Literal)("getTime")), []);
|
|
176
|
-
}
|
|
177
|
-
if (Math.random() > 0.5) {
|
|
178
|
-
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();
|
|
179
128
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
return regExp['test'](namedFunction)
|
|
194
|
-
};
|
|
195
|
-
return test()
|
|
196
|
-
}
|
|
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
|
+
}
|
|
197
142
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
nodes.push((0, _gen.IfStatement)(callExpression, this.getCounterMeasuresCode(object, parents) || [], null));
|
|
203
|
-
break;
|
|
204
|
-
case "startDate":
|
|
205
|
-
test = (0, _gen.BinaryExpression)("<", dateNow, (0, _gen.Literal)(this.getTime(this.options.lock.startDate)));
|
|
206
|
-
nodes.push((0, _gen.IfStatement)(test, this.getCounterMeasuresCode(object, parents) || [], null));
|
|
207
|
-
break;
|
|
208
|
-
case "endDate":
|
|
209
|
-
test = (0, _gen.BinaryExpression)(">", dateNow, (0, _gen.Literal)(this.getTime(this.options.lock.endDate)));
|
|
210
|
-
nodes.push((0, _gen.IfStatement)(test, this.getCounterMeasuresCode(object, parents) || [], null));
|
|
211
|
-
break;
|
|
212
|
-
case "context":
|
|
213
|
-
var prop = (0, _random.choice)(this.options.lock.context);
|
|
214
|
-
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
|
|
215
147
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
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);
|
|
221
165
|
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
this.iosDetectFn = this.getPlaceholder();
|
|
241
|
-
(0, _insert.prepend)(parents[parents.length - 1] || object, (0, _template.default)(`function ${this.iosDetectFn}() {
|
|
242
|
-
return [
|
|
243
|
-
'iPad Simulator',
|
|
244
|
-
'iPhone Simulator',
|
|
245
|
-
'iPod Simulator',
|
|
246
|
-
'iPad',
|
|
247
|
-
'iPhone',
|
|
248
|
-
'iPod'
|
|
249
|
-
].includes(navigator.platform)
|
|
250
|
-
// iPad on iOS 13 detection
|
|
251
|
-
|| (navigator.userAgent.includes("Mac") && "ontouchend" in document)
|
|
252
|
-
}`).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
|
+
}
|
|
253
184
|
}
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
windows: "win32",
|
|
259
|
-
osx: "darwin",
|
|
260
|
-
ios: "darwin"
|
|
261
|
-
}[osName] || osName;
|
|
262
|
-
thisTest = (0, _template.default)(`require('os').platform()==="${platformName}"`).single().expression;
|
|
263
|
-
}
|
|
264
|
-
if (!test) {
|
|
265
|
-
test = thisTest;
|
|
266
|
-
} else {
|
|
267
|
-
test = (0, _gen.LogicalExpression)("||", {
|
|
268
|
-
...test
|
|
269
|
-
}, thisTest);
|
|
185
|
+
} catch (err) {
|
|
186
|
+
_iterator2.e(err);
|
|
187
|
+
} finally {
|
|
188
|
+
_iterator2.f();
|
|
270
189
|
}
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
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.");
|
|
291
213
|
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
break;
|
|
298
|
-
case "domainLock":
|
|
299
|
-
function removeSlashes(path) {
|
|
300
|
-
var count = path.length - 1;
|
|
301
|
-
var index = 0;
|
|
302
|
-
while (path.charCodeAt(index) === 47 && ++index);
|
|
303
|
-
while (path.charCodeAt(count) === 47 && --count);
|
|
304
|
-
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
|
+
});
|
|
305
219
|
}
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
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)]);
|
|
314
231
|
}
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
if (Math.random() > 0.5) {
|
|
318
|
-
test = (0, _gen.LogicalExpression)("||", (0, _gen.BinaryExpression)("==", (0, _gen.UnaryExpression)("typeof", (0, _gen.Identifier)("location")), (0, _gen.Literal)("undefined")), test);
|
|
319
|
-
}
|
|
320
|
-
nodes.push((0, _gen.IfStatement)(test, this.getCounterMeasuresCode(object, parents) || [], null));
|
|
232
|
+
});
|
|
233
|
+
(0, _astUtils.prependProgram)(path, hashCode);
|
|
321
234
|
}
|
|
322
|
-
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
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
|
+
};
|
|
331
292
|
}
|
|
332
293
|
}
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
exports.default = Lock;
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
};
|