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.
- package/.github/ISSUE_TEMPLATE/bug_report.md +6 -4
- package/CHANGELOG.md +70 -0
- package/Migration.md +57 -0
- package/README.md +23 -929
- package/dist/constants.js +65 -14
- package/dist/index.js +108 -160
- package/dist/obfuscator.js +316 -118
- package/dist/options.js +1 -119
- 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 +199 -184
- 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 -587
- package/dist/transforms/dispatcher.js +300 -313
- 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 +214 -135
- package/dist/transforms/identifier/movedDeclarations.js +167 -91
- package/dist/transforms/identifier/renameVariables.js +239 -193
- package/dist/transforms/lock/integrity.js +61 -184
- package/dist/transforms/lock/lock.js +261 -387
- 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 +261 -173
- package/dist/transforms/renameLabels.js +132 -56
- package/dist/transforms/rgf.js +140 -267
- package/dist/transforms/shuffle.js +52 -145
- package/dist/transforms/string/encoding.js +44 -175
- package/dist/transforms/string/stringCompression.js +79 -155
- package/dist/transforms/string/stringConcealing.js +189 -225
- 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 -82
- package/src/index.ts +70 -165
- package/src/obfuscationResult.ts +43 -0
- package/src/obfuscator.ts +328 -135
- package/src/options.ts +149 -658
- package/src/order.ts +14 -14
- package/src/presets.ts +39 -34
- package/src/probability.ts +21 -36
- package/src/templates/bufferToStringTemplate.ts +57 -0
- 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 +149 -157
- package/src/transforms/astScrambler.ts +99 -0
- package/src/transforms/calculator.ts +96 -226
- package/src/transforms/controlFlowFlattening.ts +1594 -0
- package/src/transforms/deadCode.ts +85 -676
- package/src/transforms/dispatcher.ts +431 -640
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +147 -295
- 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 +255 -266
- package/src/transforms/identifier/movedDeclarations.ts +228 -142
- package/src/transforms/identifier/renameVariables.ts +250 -271
- package/src/transforms/lock/integrity.ts +85 -263
- package/src/transforms/lock/lock.ts +338 -579
- 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 -231
- package/src/transforms/renameLabels.ts +176 -77
- package/src/transforms/rgf.ts +293 -424
- package/src/transforms/shuffle.ts +80 -254
- package/src/transforms/string/encoding.ts +20 -126
- package/src/transforms/string/stringCompression.ts +117 -307
- package/src/transforms/string/stringConcealing.ts +254 -342
- 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 -129
- package/dist/templates/core.js +0 -35
- package/dist/templates/crash.js +0 -28
- 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 -1287
- 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 -83
- package/dist/transforms/identifier/variableAnalysis.js +0 -104
- package/dist/transforms/lock/antiDebug.js +0 -76
- package/dist/transforms/stack.js +0 -349
- package/dist/transforms/transform.js +0 -372
- 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 -14
- 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 -156
- package/dist/util/scope.js +0 -20
- package/docs/ControlFlowFlattening.md +0 -595
- package/docs/Countermeasures.md +0 -70
- package/docs/ES5.md +0 -197
- package/docs/Integrity.md +0 -82
- package/docs/RGF.md +0 -424
- package/docs/RenameVariables.md +0 -116
- package/docs/TamperProtection.md +0 -100
- package/docs/Template.md +0 -117
- 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/bufferToString.ts +0 -136
- package/src/templates/core.ts +0 -29
- package/src/templates/crash.ts +0 -23
- 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 -2153
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +0 -179
- package/src/transforms/es5/antiClass.ts +0 -276
- 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 -102
- package/src/transforms/identifier/variableAnalysis.ts +0 -118
- package/src/transforms/lock/antiDebug.ts +0 -112
- package/src/transforms/stack.ts +0 -557
- package/src/transforms/transform.ts +0 -441
- package/src/traverse.ts +0 -120
- package/src/types.ts +0 -133
- package/src/util/compare.ts +0 -181
- package/src/util/gen.ts +0 -651
- package/src/util/guard.ts +0 -17
- 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 -221
- package/src/util/scope.ts +0 -21
- package/test/code/Cash.src.js +0 -1011
- package/test/code/Cash.test.ts +0 -132
- 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 -150
- package/test/presets.test.ts +0 -22
- package/test/probability.test.ts +0 -44
- package/test/templates/template.test.ts +0 -224
- 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 -142
- package/test/transforms/identifier/movedDeclarations.test.ts +0 -275
- package/test/transforms/identifier/renameVariables.test.ts +0 -695
- 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/lock/tamperProtection.test.ts +0 -336
- 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,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
|
|
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
|
-
var
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
function
|
|
25
|
-
function
|
|
26
|
-
function
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
50
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
105
|
-
|
|
59
|
+
}),
|
|
60
|
+
percentagePerBlock: 0.5
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
64
|
+
_loop();
|
|
106
65
|
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
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
|
-
|
|
203
|
-
|
|
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
|
-
|
|
215
|
-
|
|
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
|
-
|
|
218
|
-
if (
|
|
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 (
|
|
232
|
-
|
|
95
|
+
if (me.options.lock.countermeasures === false) {
|
|
96
|
+
return [];
|
|
233
97
|
}
|
|
234
|
-
|
|
235
|
-
|
|
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
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
if (
|
|
241
|
-
|
|
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
|
-
|
|
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
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
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
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
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
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
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
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
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
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
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
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
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
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
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
|
-
|
|
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
|
-
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
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
|
+
};
|