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,69 +1,145 @@
|
|
|
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
|
+
exports["default"] = _default;
|
|
8
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
7
9
|
var _order = require("../order");
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
var
|
|
13
|
-
function
|
|
14
|
-
function
|
|
15
|
-
function
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
10
|
+
var _NameGen = require("../utils/NameGen");
|
|
11
|
+
var _assert = require("assert");
|
|
12
|
+
var _probability = require("../probability");
|
|
13
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
14
|
+
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; }
|
|
15
|
+
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; } } }; }
|
|
16
|
+
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; } }
|
|
17
|
+
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; }
|
|
18
|
+
var LABEL = Symbol("label");
|
|
19
|
+
function _default(_ref) {
|
|
20
|
+
var Plugin = _ref.Plugin;
|
|
21
|
+
var me = Plugin(_order.Order.RenameLabels, {
|
|
22
|
+
changeData: {
|
|
23
|
+
labelsRenamed: 0,
|
|
24
|
+
labelsRemoved: 0
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
return {
|
|
28
|
+
visitor: {
|
|
29
|
+
Program: function Program(path) {
|
|
30
|
+
var allLabelInterfaces = [];
|
|
31
|
+
|
|
32
|
+
// First pass: Collect all label usages
|
|
33
|
+
path.traverse({
|
|
34
|
+
LabeledStatement: function LabeledStatement(labelPath) {
|
|
35
|
+
var labelInterface = {
|
|
36
|
+
label: labelPath.node.label.name,
|
|
37
|
+
removed: false,
|
|
38
|
+
required: false,
|
|
39
|
+
paths: []
|
|
40
|
+
};
|
|
41
|
+
allLabelInterfaces.push(labelInterface);
|
|
42
|
+
labelPath.node[LABEL] = labelInterface;
|
|
43
|
+
},
|
|
44
|
+
"BreakStatement|ContinueStatement": function BreakStatementContinueStatement(_path) {
|
|
45
|
+
var path = _path;
|
|
46
|
+
if (path.node.label) {
|
|
47
|
+
var labelName = path.node.label.name;
|
|
48
|
+
var targets = [];
|
|
49
|
+
var onlySearchLoops = path.isContinueStatement();
|
|
50
|
+
var currentPath = path;
|
|
51
|
+
while (currentPath) {
|
|
52
|
+
if (currentPath.isFor() || currentPath.isWhile() || currentPath.isSwitchStatement()) {
|
|
53
|
+
targets.push(currentPath);
|
|
54
|
+
}
|
|
55
|
+
if (currentPath.isBlockStatement() && currentPath.parentPath.isLabeledStatement()) {
|
|
56
|
+
targets.push(currentPath);
|
|
57
|
+
}
|
|
58
|
+
currentPath = currentPath.parentPath;
|
|
59
|
+
}
|
|
60
|
+
var target = targets.find(function (label) {
|
|
61
|
+
return label.parentPath && label.parentPath.isLabeledStatement() && label.parentPath.node.label.name === labelName;
|
|
62
|
+
});
|
|
63
|
+
if (onlySearchLoops) {
|
|
64
|
+
// Remove BlockStatements and SwitchStatements from the list of targets
|
|
65
|
+
// a continue statement only target loops
|
|
66
|
+
// This helps remove unnecessary labels when a continue is nested with a block statement
|
|
67
|
+
// ex: for-loop with if-statement continue
|
|
68
|
+
targets = targets.filter(function (target) {
|
|
69
|
+
return !target.isBlockStatement() && !target.isSwitchStatement();
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
(0, _assert.ok)(target);
|
|
73
|
+
var isRequired = target.isBlockStatement() || targets[0] !== target;
|
|
74
|
+
var _labelInterface = target.parentPath.node[LABEL];
|
|
75
|
+
if (isRequired) {
|
|
76
|
+
_labelInterface.required = true;
|
|
77
|
+
} else {
|
|
78
|
+
// Label is not required here, remove it for this particular break/continue statement
|
|
79
|
+
path.node.label = null;
|
|
80
|
+
}
|
|
81
|
+
if (!_labelInterface.paths) {
|
|
82
|
+
_labelInterface.paths = [];
|
|
83
|
+
}
|
|
84
|
+
_labelInterface.paths.push(path);
|
|
85
|
+
}
|
|
38
86
|
}
|
|
39
|
-
|
|
40
|
-
|
|
87
|
+
});
|
|
88
|
+
var nameGen = new _NameGen.NameGen(me.options.identifierGenerator);
|
|
89
|
+
for (var _i = 0, _allLabelInterfaces = allLabelInterfaces; _i < _allLabelInterfaces.length; _i++) {
|
|
90
|
+
var labelInterface = _allLabelInterfaces[_i];
|
|
91
|
+
var isRequired = labelInterface.required;
|
|
92
|
+
if (isRequired) {
|
|
93
|
+
var newName = labelInterface.label;
|
|
94
|
+
if ((0, _probability.computeProbabilityMap)(me.options.renameLabels, labelInterface.label)) {
|
|
95
|
+
newName = nameGen.generate();
|
|
96
|
+
}
|
|
97
|
+
labelInterface.renamed = newName;
|
|
98
|
+
me.changeData.labelsRenamed++;
|
|
99
|
+
} else {
|
|
100
|
+
labelInterface.removed = true;
|
|
101
|
+
me.changeData.labelsRemoved++;
|
|
41
102
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Second pass: Rename labels and remove unused ones
|
|
106
|
+
path.traverse({
|
|
107
|
+
LabeledStatement: function LabeledStatement(labelPath) {
|
|
108
|
+
var labelInterface = labelPath.node[LABEL];
|
|
109
|
+
if (labelInterface) {
|
|
110
|
+
// Remove label but replace it with its body
|
|
111
|
+
if (labelInterface.removed) {
|
|
112
|
+
labelPath.replaceWith(labelPath.node.body);
|
|
113
|
+
}
|
|
49
114
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
115
|
+
// Else keep the label but rename it
|
|
116
|
+
if (typeof labelInterface.renamed === "string") {
|
|
117
|
+
labelPath.node.label.name = labelInterface.renamed;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Update all break/continue statements
|
|
121
|
+
var _iterator = _createForOfIteratorHelper(labelInterface.paths),
|
|
122
|
+
_step;
|
|
123
|
+
try {
|
|
124
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
125
|
+
var breakPath = _step.value;
|
|
126
|
+
// Remove label from break/continue statement
|
|
127
|
+
if (labelInterface.removed) {
|
|
128
|
+
breakPath.node.label = null;
|
|
129
|
+
} else {
|
|
130
|
+
// Update label name
|
|
131
|
+
breakPath.node.label = t.identifier(labelInterface.renamed);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
} catch (err) {
|
|
135
|
+
_iterator.e(err);
|
|
136
|
+
} finally {
|
|
137
|
+
_iterator.f();
|
|
54
138
|
}
|
|
55
|
-
o.label = (0, _gen.Identifier)(newName);
|
|
56
|
-
labelNeverUsed = false;
|
|
57
139
|
}
|
|
58
140
|
}
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
if (newName) {
|
|
62
|
-
object.label = (0, _gen.Identifier)(newName);
|
|
63
|
-
} else if (isRemovable || labelNeverUsed) {
|
|
64
|
-
this.replace(object, (0, _insert.clone)(object.body));
|
|
141
|
+
});
|
|
65
142
|
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
exports.default = RenameLabels;
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}
|
package/dist/transforms/rgf.js
CHANGED
|
@@ -1,284 +1,157 @@
|
|
|
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 _compiler = require("../compiler");
|
|
8
|
-
var _constants = require("../constants");
|
|
9
|
-
var _obfuscator = _interopRequireDefault(require("../obfuscator"));
|
|
7
|
+
exports["default"] = void 0;
|
|
10
8
|
var _order = require("../order");
|
|
9
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
10
|
+
var _obfuscator = _interopRequireDefault(require("../obfuscator"));
|
|
11
11
|
var _probability = require("../probability");
|
|
12
|
-
var
|
|
13
|
-
var
|
|
12
|
+
var _astUtils = require("../utils/ast-utils");
|
|
13
|
+
var _constants = require("../constants");
|
|
14
|
+
var _functionUtils = require("../utils/function-utils");
|
|
15
|
+
var _node = require("../utils/node");
|
|
14
16
|
var _template = _interopRequireDefault(require("../templates/template"));
|
|
15
|
-
var
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
var
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
* Converts function to `new Function("..code..")` syntax as an alternative to `eval`. Eval is disabled in many environments.
|
|
27
|
-
*
|
|
28
|
-
* `new Function("..code..")` runs in an isolated context, meaning all local variables are undefined and throw errors.
|
|
29
|
-
*
|
|
30
|
-
* Rigorous checks are in place to only include pure functions.
|
|
31
|
-
*
|
|
32
|
-
* `flatten` can attempt to make function reference-less. Recommended to have flatten enabled with RGF.
|
|
17
|
+
var _tamperProtectionTemplates = require("../templates/tamperProtectionTemplates");
|
|
18
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
19
|
+
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); }
|
|
20
|
+
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; }
|
|
21
|
+
/**
|
|
22
|
+
* RGF (Runtime-Generated-Function) uses the `new Function("code")` syntax to create executable code from strings.
|
|
23
|
+
*
|
|
24
|
+
* Limitations:
|
|
25
|
+
*
|
|
26
|
+
* 1. Does not apply to async or generator functions
|
|
27
|
+
* 2. Does not apply to functions that reference outside variables
|
|
33
28
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
29
|
+
var _default = exports["default"] = function _default(_ref) {
|
|
30
|
+
var Plugin = _ref.Plugin;
|
|
31
|
+
var me = Plugin(_order.Order.RGF, {
|
|
32
|
+
changeData: {
|
|
33
|
+
functions: 0
|
|
38
34
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
35
|
+
});
|
|
36
|
+
var rgfArrayName = me.getPlaceholder() + "_rgf";
|
|
37
|
+
var rgfEvalName = me.getPlaceholder() + "_rgf_eval";
|
|
38
|
+
var rgfArrayExpression = t.arrayExpression([]);
|
|
39
|
+
var active = true;
|
|
40
|
+
return {
|
|
41
|
+
visitor: {
|
|
42
|
+
Program: {
|
|
43
|
+
enter: function enter(path) {
|
|
44
|
+
path.scope.crawl();
|
|
45
|
+
},
|
|
46
|
+
exit: function exit(path) {
|
|
47
|
+
active = false;
|
|
48
|
+
if (rgfArrayExpression.elements.length === 0) return;
|
|
49
|
+
|
|
50
|
+
// Insert the RGF array at the top of the program
|
|
51
|
+
(0, _astUtils.prepend)(path, t.variableDeclaration("var", [t.variableDeclarator(t.identifier(rgfArrayName), rgfArrayExpression)]));
|
|
52
|
+
var rgfEvalIntegrity = me.getPlaceholder() + "_rgf_eval_integrity";
|
|
53
|
+
(0, _astUtils.prepend)(path, new _template["default"]("\n {EvalIntegrity}\n var ".concat(rgfEvalIntegrity, " = {EvalIntegrityName}();\n ")).compile({
|
|
54
|
+
EvalIntegrity: (0, _tamperProtectionTemplates.createEvalIntegrityTemplate)(me, path),
|
|
55
|
+
EvalIntegrityName: me.getPlaceholder()
|
|
56
|
+
}));
|
|
57
|
+
(0, _astUtils.append)(path, new _template["default"]("\n function ".concat(rgfEvalName, "(code) {\n if (").concat(rgfEvalIntegrity, ") {\n return eval(code);\n }\n }\n ")).addSymbols(_constants.UNSAFE).single());
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"FunctionDeclaration|FunctionExpression": {
|
|
61
|
+
exit: function exit(_path) {
|
|
62
|
+
var _me$options$lock;
|
|
63
|
+
if (!active) return;
|
|
64
|
+
var path = _path;
|
|
65
|
+
if (me.isSkipped(path)) return;
|
|
66
|
+
|
|
67
|
+
// Skip async and generator functions
|
|
68
|
+
if (path.node.async || path.node.generator) return;
|
|
69
|
+
var name = (0, _astUtils.getFunctionName)(path);
|
|
70
|
+
if (name === ((_me$options$lock = me.options.lock) === null || _me$options$lock === void 0 ? void 0 : _me$options$lock.countermeasures)) return;
|
|
71
|
+
if (me.obfuscator.isInternalVariable(name)) return;
|
|
72
|
+
me.log(name);
|
|
73
|
+
if (!(0, _probability.computeProbabilityMap)(me.options.rgf, name, path.getFunctionParent() === null)) return;
|
|
74
|
+
|
|
75
|
+
// Skip functions with references to outside variables
|
|
76
|
+
// Check the scope to see if this function relies on any variables defined outside the function
|
|
77
|
+
var identifierPreventingTransform;
|
|
78
|
+
path.traverse({
|
|
79
|
+
Identifier: function Identifier(idPath) {
|
|
80
|
+
if (!(0, _astUtils.isVariableIdentifier)(idPath)) return;
|
|
81
|
+
if (idPath.isBindingIdentifier() && (0, _astUtils.isDefiningIdentifier)(idPath)) return;
|
|
82
|
+
var name = idPath.node.name;
|
|
83
|
+
// RGF array name is allowed, it is not considered an outside reference
|
|
84
|
+
if (name === rgfArrayName) return;
|
|
85
|
+
if (_constants.reservedIdentifiers.has(name)) return;
|
|
86
|
+
if (me.options.globalVariables.has(name)) return;
|
|
87
|
+
var binding = idPath.scope.getBinding(name);
|
|
88
|
+
if (!binding) {
|
|
89
|
+
identifierPreventingTransform = name;
|
|
90
|
+
idPath.stop();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
53
93
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
if ((_this$options$lock = this.options.lock) !== null && _this$options$lock !== void 0 && _this$options$lock.tamperProtection) {
|
|
60
|
-
// The name of the variable flag if eval is safe to use
|
|
61
|
-
var tamperProtectionCheckName = this.getPlaceholder() + "_rgfEvalCheck";
|
|
62
|
-
variableDeclaration.declarations[0].init = (0, _gen.LogicalExpression)("&&", (0, _gen.Identifier)(tamperProtectionCheckName), {
|
|
63
|
-
...variableDeclaration.declarations[0].init
|
|
64
|
-
});
|
|
65
|
-
nodes.unshift(...new _template.default(`
|
|
66
|
-
var ${tamperProtectionCheckName} = false;
|
|
67
|
-
eval(${this.jsConfuserVar(tamperProtectionCheckName)} + "=true");
|
|
68
|
-
if(!${tamperProtectionCheckName}) {
|
|
69
|
-
{countermeasures}
|
|
94
|
+
// If the binding is not in the current scope, it is an outside reference
|
|
95
|
+
if (binding.scope !== path.scope) {
|
|
96
|
+
identifierPreventingTransform = name;
|
|
97
|
+
idPath.stop();
|
|
98
|
+
}
|
|
70
99
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
(0, _insert.prepend)(tree, ...nodes);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// The function.length helper function must be placed last
|
|
79
|
-
if (this.functionLengthName) {
|
|
80
|
-
(0, _insert.prepend)(tree, _functionLength.FunctionLengthTemplate.single({
|
|
81
|
-
name: this.functionLengthName,
|
|
82
|
-
ObjectDefineProperty: this.createInitVariable(_globals.ObjectDefineProperty, [tree])
|
|
83
|
-
}));
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
match(object, parents) {
|
|
87
|
-
return (object.type === "FunctionDeclaration" || object.type === "FunctionExpression") &&
|
|
88
|
-
// Does not apply to Arrow functions
|
|
89
|
-
!object.async &&
|
|
90
|
-
// Does not apply to async/generator functions
|
|
91
|
-
!object.generator;
|
|
92
|
-
}
|
|
93
|
-
transform(object, parents) {
|
|
94
|
-
var _this$options$lock2, _object$id;
|
|
95
|
-
// Discard getter/setter methods
|
|
96
|
-
if (parents[0].type === "Property" && parents[0].value === object) {
|
|
97
|
-
if (parents[0].method || parents[0].kind === "get" || parents[0].kind === "set") {
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Discard class methods
|
|
103
|
-
if (parents[0].type === "MethodDefinition" && parents[0].value === object) {
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Avoid applying to the countermeasures function
|
|
108
|
-
if (typeof ((_this$options$lock2 = this.options.lock) === null || _this$options$lock2 === void 0 ? void 0 : _this$options$lock2.countermeasures) === "string") {
|
|
109
|
-
// function countermeasures(){...}
|
|
110
|
-
if (object.type === "FunctionDeclaration" && object.id.type === "Identifier" && object.id.name === this.options.lock.countermeasures) {
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// var countermeasures = function(){...}
|
|
115
|
-
if (parents[0].type === "VariableDeclarator" && parents[0].init === object && parents[0].id.type === "Identifier" && parents[0].id.name === this.options.lock.countermeasures) {
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// Check user option
|
|
121
|
-
if (!(0, _probability.ComputeProbabilityMap)(this.options.rgf, x => x, object === null || object === void 0 ? void 0 : (_object$id = object.id) === null || _object$id === void 0 ? void 0 : _object$id.name)) return;
|
|
122
|
-
|
|
123
|
-
// Discard functions that use 'eval' function
|
|
124
|
-
if (object.$requiresEval) return;
|
|
125
|
-
|
|
126
|
-
// Check for 'this', 'arguments' (not allowed!)
|
|
127
|
-
var isIllegal = false;
|
|
128
|
-
(0, _traverse.walk)(object, parents, (o, p) => {
|
|
129
|
-
if (o.type === "ThisExpression" || o.type === "Super" || o.type === "Identifier" && o.name === "arguments") {
|
|
130
|
-
isIllegal = true;
|
|
131
|
-
return "EXIT";
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
if (isIllegal) return;
|
|
135
|
-
return () => {
|
|
136
|
-
var _this$options$lock3;
|
|
137
|
-
// Make sure function is 'reference-less'
|
|
138
|
-
var definedMap = new Map();
|
|
139
|
-
var isReferenceLess = true;
|
|
140
|
-
var identifierPreventingTransformation;
|
|
141
|
-
(0, _traverse.walk)(object, parents, (o, p) => {
|
|
142
|
-
if (o.type === "Identifier" && o.name !== this.arrayExpressionName && !_constants.reservedIdentifiers.has(o.name) && !this.options.globalVariables.has(o.name)) {
|
|
143
|
-
var info = (0, _identifiers.getIdentifierInfo)(o, p);
|
|
144
|
-
if (!info.spec.isReferenced) {
|
|
100
|
+
});
|
|
101
|
+
if (identifierPreventingTransform) {
|
|
102
|
+
me.log("Skipping function " + name + " due to reference to outside variable: " + identifierPreventingTransform);
|
|
145
103
|
return;
|
|
146
104
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
break;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
if (!isDefinedAbove) {
|
|
167
|
-
isReferenceLess = false;
|
|
168
|
-
identifierPreventingTransformation = o.name;
|
|
169
|
-
return "EXIT";
|
|
170
|
-
}
|
|
105
|
+
var embeddedName = me.getPlaceholder() + "_embedded";
|
|
106
|
+
var replacementName = me.getPlaceholder() + "_replacement";
|
|
107
|
+
var thisName = me.getPlaceholder() + "_this";
|
|
108
|
+
var lastNode = t.expressionStatement(t.identifier(embeddedName));
|
|
109
|
+
lastNode[_constants.SKIP] = true;
|
|
110
|
+
|
|
111
|
+
// Transform the function
|
|
112
|
+
var evalProgram = t.program([t.functionDeclaration(t.identifier(embeddedName), [], t.blockStatement([t.variableDeclaration("var", [t.variableDeclarator(t.arrayPattern([t.identifier(thisName), t.identifier(rgfArrayName)]), t.thisExpression())]), t.functionDeclaration(t.identifier(replacementName), path.node.params, path.node.body), t.returnStatement(t.callExpression(t.memberExpression(t.identifier(replacementName), t.identifier("apply")), [t.identifier(thisName), t.identifier("arguments")]))])), lastNode]);
|
|
113
|
+
var strictModeEnforcingBlock = path.find(function (p) {
|
|
114
|
+
return (0, _astUtils.isStrictMode)(p);
|
|
115
|
+
});
|
|
116
|
+
if (strictModeEnforcingBlock) {
|
|
117
|
+
// Preserve 'use strict' directive
|
|
118
|
+
// This is necessary to enure subsequent transforms (Control Flow Flattening) are aware of the strict mode directive
|
|
119
|
+
evalProgram.directives.push(t.directive(t.directiveLiteral("use strict")));
|
|
171
120
|
}
|
|
121
|
+
var evalFile = t.file(evalProgram);
|
|
122
|
+
var newObfuscator = new _obfuscator["default"](me.options, me.obfuscator);
|
|
123
|
+
var hasRan = new Set(me.obfuscator.plugins.filter(function (plugin, i) {
|
|
124
|
+
return i <= me.obfuscator.index;
|
|
125
|
+
}).map(function (plugin) {
|
|
126
|
+
return plugin.pluginInstance.order;
|
|
127
|
+
}));
|
|
128
|
+
newObfuscator.plugins = newObfuscator.plugins.filter(function (plugin) {
|
|
129
|
+
return plugin.pluginInstance.order == _order.Order.Preparation || !hasRan.has(plugin.pluginInstance.order);
|
|
130
|
+
});
|
|
131
|
+
newObfuscator.obfuscateAST(evalFile, {
|
|
132
|
+
disablePack: true
|
|
133
|
+
});
|
|
134
|
+
var generated = _obfuscator["default"].generateCode(evalFile);
|
|
135
|
+
var functionExpression = t.callExpression(t.identifier(rgfEvalName), [t.stringLiteral(generated)]);
|
|
136
|
+
var index = rgfArrayExpression.elements.length;
|
|
137
|
+
rgfArrayExpression.elements.push(functionExpression);
|
|
138
|
+
|
|
139
|
+
// Params no longer needed, using 'arguments' instead
|
|
140
|
+
var originalLength = (0, _functionUtils.computeFunctionLength)(path);
|
|
141
|
+
path.node.params = [];
|
|
142
|
+
|
|
143
|
+
// Function is now unsafe
|
|
144
|
+
path.node[_constants.UNSAFE] = true;
|
|
145
|
+
// Params changed and using 'arguments'
|
|
146
|
+
path.node[_constants.PREDICTABLE] = false;
|
|
147
|
+
me.skip(path);
|
|
148
|
+
|
|
149
|
+
// Update body to point to new function
|
|
150
|
+
path.get("body").replaceWith(t.blockStatement([t.returnStatement(t.callExpression(t.memberExpression(t.memberExpression(t.identifier(rgfArrayName), (0, _node.numericLiteral)(index), true), t.stringLiteral("apply"), true), [t.arrayExpression([t.thisExpression(), t.identifier(rgfArrayName)]), t.identifier("arguments")]))]));
|
|
151
|
+
me.setFunctionLength(path, originalLength);
|
|
152
|
+
me.changeData.functions++;
|
|
172
153
|
}
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
// This function is not 'reference-less', cannot be RGF'd
|
|
176
|
-
if (!isReferenceLess) {
|
|
177
|
-
if (object.id) {
|
|
178
|
-
var _object$id2;
|
|
179
|
-
this.log(`${object === null || object === void 0 ? void 0 : (_object$id2 = object.id) === null || _object$id2 === void 0 ? void 0 : _object$id2.name}() cannot be transformed because of ${identifierPreventingTransformation}`);
|
|
180
|
-
}
|
|
181
|
-
return;
|
|
182
154
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
// (^ the variables haven't been renamed yet)
|
|
187
|
-
var obfuscator = new _obfuscator.default({
|
|
188
|
-
...this.options,
|
|
189
|
-
stringEncoding: false,
|
|
190
|
-
compact: true
|
|
191
|
-
});
|
|
192
|
-
if (obfuscator.options.lock) {
|
|
193
|
-
obfuscator.options.lock = {
|
|
194
|
-
...obfuscator.options.lock
|
|
195
|
-
};
|
|
196
|
-
delete obfuscator.options.lock.countermeasures;
|
|
197
|
-
|
|
198
|
-
// Integrity will not recursively apply to RGF'd functions. This is intended.
|
|
199
|
-
var lockTransform = obfuscator.transforms["Lock"];
|
|
200
|
-
if (lockTransform) {
|
|
201
|
-
lockTransform.before = lockTransform.before.filter(beforeTransform => !(beforeTransform instanceof _integrity.default));
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
var transforms = obfuscator.array.filter(x => x.priority > this.priority);
|
|
205
|
-
var embeddedFunctionName = this.getPlaceholder();
|
|
206
|
-
var embeddedFunction = {
|
|
207
|
-
type: "FunctionDeclaration",
|
|
208
|
-
id: (0, _gen.Identifier)(embeddedFunctionName),
|
|
209
|
-
body: (0, _gen.BlockStatement)([...object.body.body]),
|
|
210
|
-
params: object.params,
|
|
211
|
-
async: false,
|
|
212
|
-
generator: false
|
|
213
|
-
};
|
|
214
|
-
|
|
215
|
-
// The new program will look like this
|
|
216
|
-
// new Function(`
|
|
217
|
-
// var rgf_array = this[0]
|
|
218
|
-
// function greet(message){
|
|
219
|
-
// console.log(message)
|
|
220
|
-
// }
|
|
221
|
-
// return greet.apply(this[1], arguments)
|
|
222
|
-
// `)
|
|
223
|
-
//
|
|
224
|
-
// And called like
|
|
225
|
-
// f.apply([ rgf_array, this ], arguments)
|
|
226
|
-
var tree = {
|
|
227
|
-
type: "Program",
|
|
228
|
-
body: [(0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(this.arrayExpressionName, (0, _gen.MemberExpression)((0, _gen.ThisExpression)(), (0, _gen.Literal)(0)))), embeddedFunction, (0, _gen.ReturnStatement)((0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)(embeddedFunctionName), (0, _gen.Literal)("apply"), true), [(0, _gen.MemberExpression)((0, _gen.ThisExpression)(), (0, _gen.Literal)(1)), (0, _gen.Identifier)("arguments")]))]
|
|
229
|
-
};
|
|
230
|
-
transforms.forEach(transform => {
|
|
231
|
-
transform.apply(tree);
|
|
232
|
-
});
|
|
233
|
-
var toString = (0, _compiler.compileJsSync)(tree, obfuscator.options);
|
|
234
|
-
|
|
235
|
-
// new Function(code)
|
|
236
|
-
var newFunctionExpression = (0, _gen.NewExpression)((0, _gen.Identifier)("Function"), [(0, _gen.Literal)(toString)]);
|
|
237
|
-
if ((_this$options$lock3 = this.options.lock) !== null && _this$options$lock3 !== void 0 && _this$options$lock3.tamperProtection) {
|
|
238
|
-
// If tamper protection is enabled, wrap the function in an eval
|
|
239
|
-
var randomName = this.getGenerator("randomized").generate();
|
|
240
|
-
newFunctionExpression = (0, _gen.CallExpression)((0, _gen.Identifier)("eval"), [(0, _gen.Literal)(`function ${randomName}(){ ${toString} } ${randomName}`)]);
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// The index where this function is placed in the array
|
|
244
|
-
var newFunctionExpressionIndex = this.arrayExpressionElements.length;
|
|
245
|
-
|
|
246
|
-
// Add it to the array
|
|
247
|
-
this.arrayExpressionElements.push(newFunctionExpression);
|
|
248
|
-
|
|
249
|
-
// The member expression to retrieve this function
|
|
250
|
-
var memberExpression = (0, _gen.MemberExpression)((0, _gen.Identifier)(this.arrayExpressionName), (0, _gen.Literal)(newFunctionExpressionIndex), true);
|
|
251
|
-
var originalFunctionLength = (0, _insert.computeFunctionLength)(object.params);
|
|
252
|
-
|
|
253
|
-
// Replace based on type
|
|
254
|
-
|
|
255
|
-
// (1) Function Declaration:
|
|
256
|
-
// - Replace body with call to new function
|
|
257
|
-
if (object.type === "FunctionDeclaration") {
|
|
258
|
-
object.body = (0, _gen.BlockStatement)([(0, _gen.ReturnStatement)((0, _gen.CallExpression)((0, _gen.MemberExpression)(memberExpression, (0, _gen.Literal)("apply"), true), [(0, _gen.ArrayExpression)([(0, _gen.Identifier)(this.arrayExpressionName), (0, _gen.ThisExpression)()]), (0, _gen.Identifier)("arguments")]))]);
|
|
259
|
-
|
|
260
|
-
// The parameters are no longer needed ('arguments' is used to capture them)
|
|
261
|
-
object.params = [];
|
|
262
|
-
|
|
263
|
-
// The function is no longer guaranteed to not have extraneous parameters passed in
|
|
264
|
-
object[_constants.predictableFunctionTag] = false;
|
|
265
|
-
if (this.options.preserveFunctionLength && originalFunctionLength !== 0) {
|
|
266
|
-
var body = parents[0];
|
|
267
|
-
body.splice(body.indexOf(object), 0, (0, _gen.ExpressionStatement)((0, _gen.CallExpression)((0, _gen.Identifier)(this.getFunctionLengthName(parents)), [(0, _gen.Identifier)(object.id.name), (0, _gen.Literal)(originalFunctionLength)])));
|
|
268
|
-
}
|
|
269
|
-
return;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// (2) Function Expression:
|
|
273
|
-
// - Replace expression with member expression pointing to new function
|
|
274
|
-
if (object.type === "FunctionExpression") {
|
|
275
|
-
if (this.options.preserveFunctionLength && originalFunctionLength !== 0) {
|
|
276
|
-
memberExpression = (0, _gen.CallExpression)((0, _gen.Identifier)(this.getFunctionLengthName(parents)), [memberExpression, (0, _gen.Literal)(originalFunctionLength)]);
|
|
277
|
-
}
|
|
278
|
-
this.replace(object, memberExpression);
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
exports.default = RGF;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
};
|