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,215 +1,268 @@
|
|
|
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
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
8
9
|
var _order = require("../../order");
|
|
9
|
-
var _traverse = require("../../traverse");
|
|
10
|
-
var _identifiers = require("../../util/identifiers");
|
|
11
|
-
var _insert = require("../../util/insert");
|
|
12
|
-
var _transform = _interopRequireDefault(require("../transform"));
|
|
13
10
|
var _constants = require("../../constants");
|
|
14
11
|
var _probability = require("../../probability");
|
|
15
|
-
var
|
|
16
|
-
|
|
12
|
+
var _astUtils = require("../../utils/ast-utils");
|
|
13
|
+
var _functionUtils = require("../../utils/function-utils");
|
|
14
|
+
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); }
|
|
15
|
+
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; }
|
|
16
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
17
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
17
18
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
18
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" ==
|
|
19
|
-
function _toPrimitive(t, r) { if ("object" !=
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
// Map of Context->Object of changes
|
|
35
|
-
_defineProperty(this, "changed", void 0);
|
|
36
|
-
// Ref to VariableAnalysis data
|
|
37
|
-
_defineProperty(this, "variableAnalysis", void 0);
|
|
38
|
-
// Option to re-use previously generated names
|
|
39
|
-
_defineProperty(this, "reusePreviousNames", true);
|
|
40
|
-
this.changed = new Map();
|
|
41
|
-
|
|
42
|
-
// 1.
|
|
43
|
-
this.variableAnalysis = new _variableAnalysis.default(o);
|
|
44
|
-
this.before.push(this.variableAnalysis);
|
|
45
|
-
this.generated = [];
|
|
46
|
-
}
|
|
47
|
-
match(object, parents) {
|
|
48
|
-
return (0, _insert.isContext)(object) || object.type === "Identifier";
|
|
49
|
-
}
|
|
50
|
-
transformContext(object, parents) {
|
|
51
|
-
// 2. Notice this is on 'onEnter' (top-down)
|
|
52
|
-
var isGlobal = object.type == "Program";
|
|
53
|
-
var type = isGlobal ? "root" : (0, _insert.isVarContext)(object) ? "var" : (0, _insert.isLexContext)(object) ? "lex" : undefined;
|
|
54
|
-
(0, _assert.ok)(type);
|
|
55
|
-
var newNames = Object.create(null);
|
|
56
|
-
var defined = this.variableAnalysis.defined.get(object) || new Set();
|
|
57
|
-
var references = this.variableAnalysis.references.get(object) || new Set();
|
|
58
|
-
|
|
59
|
-
// No changes needed here
|
|
60
|
-
if (!defined && !this.changed.has(object)) {
|
|
61
|
-
this.changed.set(object, Object.create(null));
|
|
62
|
-
return;
|
|
19
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
20
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
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 RENAMED = Symbol("Renamed");
|
|
29
|
+
var reusePreviousNames = true;
|
|
30
|
+
var _default = exports["default"] = function _default(_ref) {
|
|
31
|
+
var Plugin = _ref.Plugin;
|
|
32
|
+
var me = Plugin(_order.Order.RenameVariables, {
|
|
33
|
+
changeData: {
|
|
34
|
+
variables: 0
|
|
63
35
|
}
|
|
36
|
+
});
|
|
37
|
+
var definedMap = new Map();
|
|
38
|
+
var referencedMap = new Map();
|
|
39
|
+
var bindingMap = new Map();
|
|
40
|
+
var renamedVariables = new Map();
|
|
41
|
+
me.obfuscator.globalState.renamedVariables = renamedVariables;
|
|
42
|
+
var generated = Array.from(me.obfuscator.nameGen.generatedNames);
|
|
43
|
+
var VariableAnalysisVisitor = {
|
|
44
|
+
Program: {
|
|
45
|
+
enter: function enter(path) {
|
|
46
|
+
// Analyze all scopes
|
|
47
|
+
path.traverse({
|
|
48
|
+
Identifier: function Identifier(path) {
|
|
49
|
+
if (!(0, _astUtils.isVariableIdentifier)(path)) return;
|
|
50
|
+
var contextPaths = [(0, _astUtils.getParentFunctionOrProgram)(path)];
|
|
51
|
+
var isDefined = false;
|
|
52
|
+
if (path.isBindingIdentifier() && (0, _astUtils.isDefiningIdentifier)(path)) {
|
|
53
|
+
isDefined = true;
|
|
64
54
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
if (this.reusePreviousNames && this.generated.length && !isGlobal) {
|
|
70
|
-
var allReferences = new Set();
|
|
71
|
-
var nope = new Set(defined);
|
|
72
|
-
(0, _traverse.walk)(object, [], (o, p) => {
|
|
73
|
-
var ref = this.variableAnalysis.references.get(o);
|
|
74
|
-
if (ref) {
|
|
75
|
-
ref.forEach(x => allReferences.add(x));
|
|
76
|
-
}
|
|
77
|
-
var def = this.variableAnalysis.defined.get(o);
|
|
78
|
-
if (def) {
|
|
79
|
-
def.forEach(x => allReferences.add(x));
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
var passed = new Set();
|
|
83
|
-
parents.forEach(p => {
|
|
84
|
-
var changes = this.changed.get(p);
|
|
85
|
-
if (changes) {
|
|
86
|
-
Object.keys(changes).forEach(x => {
|
|
87
|
-
var name = changes[x];
|
|
88
|
-
if (!allReferences.has(x) && !references.has(x)) {
|
|
89
|
-
passed.add(name);
|
|
90
|
-
} else {
|
|
91
|
-
nope.add(name);
|
|
55
|
+
// Function ID is defined in the parent's function declaration
|
|
56
|
+
if (path.key === "id" && path.parentPath.isFunctionDeclaration()) {
|
|
57
|
+
contextPaths = [(0, _astUtils.getParentFunctionOrProgram)(path.parentPath)];
|
|
58
|
+
}
|
|
92
59
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
});
|
|
96
|
-
nope.forEach(x => passed.delete(x));
|
|
97
|
-
possible = passed;
|
|
98
|
-
}
|
|
60
|
+
contextPaths.forEach(function (contextPath) {
|
|
61
|
+
// console.log(contextPath.node.type, path.node.name, isDefined);
|
|
99
62
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
var generatedName = this.generateIdentifier();
|
|
119
|
-
newName = generatedName;
|
|
120
|
-
this.generated.push(generatedName);
|
|
63
|
+
if (isDefined) {
|
|
64
|
+
// Add to defined map
|
|
65
|
+
if (!definedMap.has(contextPath.node)) {
|
|
66
|
+
definedMap.set(contextPath.node, new Set());
|
|
67
|
+
}
|
|
68
|
+
definedMap.get(contextPath.node).add(path.node.name);
|
|
69
|
+
if (!bindingMap.has(contextPath.node)) {
|
|
70
|
+
bindingMap.set(contextPath.node, new Map());
|
|
71
|
+
}
|
|
72
|
+
bindingMap.get(contextPath.node).set(path.node.name, path);
|
|
73
|
+
} else {
|
|
74
|
+
// Add to reference map
|
|
75
|
+
if (!referencedMap.has(contextPath.node)) {
|
|
76
|
+
referencedMap.set(contextPath.node, new Set());
|
|
77
|
+
}
|
|
78
|
+
referencedMap.get(contextPath.node).add(path.node.name);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
121
81
|
}
|
|
122
|
-
}
|
|
82
|
+
});
|
|
123
83
|
|
|
124
|
-
|
|
125
|
-
} else {
|
|
126
|
-
// This variable name was deemed not to be renamed.
|
|
127
|
-
newNames[name] = name;
|
|
84
|
+
//
|
|
128
85
|
}
|
|
129
86
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
if (object.$renamed) {
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
var info = (0, _identifiers.getIdentifierInfo)(object, parents);
|
|
143
|
-
if (info.spec.isExported) {
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
if (!info.spec.isReferenced) {
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
var contexts = [object, ...parents].filter(x => (0, _insert.isContext)(x));
|
|
150
|
-
var newName = null;
|
|
151
|
-
|
|
152
|
-
// Function default parameter check!
|
|
153
|
-
var functionIndices = [];
|
|
154
|
-
for (var i in parents) {
|
|
155
|
-
if ((0, _insert.isFunction)(parents[i])) {
|
|
156
|
-
functionIndices.push(i);
|
|
87
|
+
};
|
|
88
|
+
var VariableRenamingVisitor = {
|
|
89
|
+
Identifier: function Identifier(identifierPath) {
|
|
90
|
+
if (!(0, _astUtils.isVariableIdentifier)(identifierPath)) return;
|
|
91
|
+
var node = identifierPath.node;
|
|
92
|
+
var identifierName = node.name;
|
|
93
|
+
if (node[RENAMED]) {
|
|
94
|
+
return;
|
|
157
95
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
96
|
+
var contextPaths = identifierPath.getAncestry();
|
|
97
|
+
|
|
98
|
+
// A Function ID is not in the same context as it's body
|
|
99
|
+
if (identifierPath.key === "id" && identifierPath.parentPath.isFunctionDeclaration()) {
|
|
100
|
+
contextPaths = contextPaths.filter(function (x) {
|
|
101
|
+
return x !== identifierPath.parentPath;
|
|
102
|
+
});
|
|
164
103
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
for (
|
|
170
|
-
var
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
104
|
+
var newName = null;
|
|
105
|
+
var _iterator = _createForOfIteratorHelper(contextPaths),
|
|
106
|
+
_step;
|
|
107
|
+
try {
|
|
108
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
109
|
+
var contextPath = _step.value;
|
|
110
|
+
var _node = contextPath.node;
|
|
111
|
+
var defined = definedMap.get(_node);
|
|
112
|
+
if (defined !== null && defined !== void 0 && defined.has(identifierName)) {
|
|
113
|
+
var renamed = renamedVariables.get(_node);
|
|
114
|
+
if (renamed !== null && renamed !== void 0 && renamed.has(identifierName)) {
|
|
115
|
+
newName = renamed.get(identifierName);
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
174
118
|
}
|
|
175
|
-
forIndex++;
|
|
176
|
-
}
|
|
177
|
-
if (!isReferencedHere) {
|
|
178
|
-
// This context is not referenced, so remove it
|
|
179
|
-
contexts = contexts.filter(context => context != parents[functionIndex]);
|
|
180
119
|
}
|
|
120
|
+
} catch (err) {
|
|
121
|
+
_iterator.e(err);
|
|
122
|
+
} finally {
|
|
123
|
+
_iterator.f();
|
|
181
124
|
}
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
break;
|
|
125
|
+
if (newName && typeof newName === "string") {
|
|
126
|
+
// __JS_CONFUSER_VAR__ function
|
|
127
|
+
if ((0, _functionUtils.isVariableFunctionIdentifier)(identifierPath)) {
|
|
128
|
+
identifierPath.parentPath.replaceWith(t.stringLiteral(newName));
|
|
129
|
+
return;
|
|
188
130
|
}
|
|
131
|
+
|
|
132
|
+
// 5. Update Identifier node's 'name' property
|
|
133
|
+
node.name = newName;
|
|
134
|
+
node[RENAMED] = true;
|
|
189
135
|
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
//
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
136
|
+
},
|
|
137
|
+
Scopable: function Scopable(scopePath) {
|
|
138
|
+
// 2. Notice this is on 'onEnter' (top-down)
|
|
139
|
+
var isGlobal = scopePath.isProgram();
|
|
140
|
+
var node = scopePath.scope.path.node;
|
|
141
|
+
if (renamedVariables.has(node)) return;
|
|
142
|
+
var defined = definedMap.get(node) || new Set();
|
|
143
|
+
var references = referencedMap.get(node) || new Set();
|
|
144
|
+
var bindings = bindingMap.get(node);
|
|
145
|
+
|
|
146
|
+
// No changes needed here
|
|
147
|
+
if (!defined && !renamedVariables.has(node)) {
|
|
148
|
+
renamedVariables.set(node, Object.create(null));
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
var newNames = new Map();
|
|
152
|
+
|
|
153
|
+
// Names possible to be re-used here
|
|
154
|
+
var possible = new Set();
|
|
155
|
+
|
|
156
|
+
// 3. Try to re-use names when possible
|
|
157
|
+
if (reusePreviousNames && generated.length && !isGlobal) {
|
|
158
|
+
var allReferences = new Set();
|
|
159
|
+
var nope = new Set(defined);
|
|
160
|
+
scopePath.traverse({
|
|
161
|
+
Scopable: function Scopable(path) {
|
|
162
|
+
var node = path.scope.path.node;
|
|
163
|
+
var ref = referencedMap.get(node);
|
|
164
|
+
if (ref) {
|
|
165
|
+
ref.forEach(function (x) {
|
|
166
|
+
return allReferences.add(x);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
var def = definedMap.get(node);
|
|
170
|
+
if (def) {
|
|
171
|
+
def.forEach(function (x) {
|
|
172
|
+
return allReferences.add(x);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
var passed = new Set();
|
|
178
|
+
var parentPaths = scopePath.getAncestry();
|
|
179
|
+
parentPaths.forEach(function (p) {
|
|
180
|
+
if (p === scopePath) return;
|
|
181
|
+
var changes = renamedVariables.get(p.node);
|
|
182
|
+
if (changes) {
|
|
183
|
+
var _iterator2 = _createForOfIteratorHelper(changes),
|
|
184
|
+
_step2;
|
|
185
|
+
try {
|
|
186
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
187
|
+
var _step2$value = _slicedToArray(_step2.value, 2),
|
|
188
|
+
oldName = _step2$value[0],
|
|
189
|
+
newName = _step2$value[1];
|
|
190
|
+
if (!allReferences.has(oldName) && !references.has(oldName)) {
|
|
191
|
+
passed.add(newName);
|
|
192
|
+
} else {
|
|
193
|
+
nope.add(newName);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
} catch (err) {
|
|
197
|
+
_iterator2.e(err);
|
|
198
|
+
} finally {
|
|
199
|
+
_iterator2.f();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
nope.forEach(function (x) {
|
|
204
|
+
return passed["delete"](x);
|
|
205
|
+
});
|
|
206
|
+
possible = passed;
|
|
207
|
+
}
|
|
208
|
+
function shouldRename(name) {
|
|
209
|
+
// __NO_JS_CONFUSER_RENAME__
|
|
210
|
+
if (name.startsWith(_constants.noRenameVariablePrefix)) return false;
|
|
211
|
+
|
|
212
|
+
// Placeholder variables should always be renamed
|
|
213
|
+
if (name.startsWith(_constants.placeholderVariablePrefix)) return true;
|
|
214
|
+
|
|
215
|
+
// Do not rename exports
|
|
216
|
+
if ((0, _astUtils.isExportedIdentifier)(bindings === null || bindings === void 0 ? void 0 : bindings.get(name))) return false;
|
|
217
|
+
if (name === me.obfuscator.getStringCompressionLibraryName()) return false;
|
|
218
|
+
|
|
219
|
+
// Global variables are additionally checked against user option
|
|
220
|
+
if (isGlobal) {
|
|
221
|
+
if (!(0, _probability.computeProbabilityMap)(me.options.renameGlobals, name)) return false;
|
|
197
222
|
}
|
|
223
|
+
if (!(0, _probability.computeProbabilityMap)(me.options.renameVariables, name, isGlobal)) return false;
|
|
224
|
+
return true;
|
|
198
225
|
}
|
|
199
226
|
|
|
200
|
-
//
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
227
|
+
// 4. Defined names to new names
|
|
228
|
+
var _iterator3 = _createForOfIteratorHelper(defined),
|
|
229
|
+
_step3;
|
|
230
|
+
try {
|
|
231
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
232
|
+
var name = _step3.value;
|
|
233
|
+
var newName = name;
|
|
234
|
+
if (shouldRename(name)) {
|
|
235
|
+
me.changeData.variables++;
|
|
236
|
+
|
|
237
|
+
// Create a new name from (1) or (2) methods
|
|
238
|
+
do {
|
|
239
|
+
if (possible.size) {
|
|
240
|
+
// (1) Re-use previously generated name
|
|
241
|
+
var first = possible.values().next().value;
|
|
242
|
+
possible["delete"](first);
|
|
243
|
+
newName = first;
|
|
244
|
+
} else {
|
|
245
|
+
// (2) Create a new name with global `nameGen`
|
|
246
|
+
var generatedName = me.obfuscator.nameGen.generate();
|
|
247
|
+
newName = generatedName;
|
|
248
|
+
generated.push(generatedName);
|
|
249
|
+
}
|
|
250
|
+
} while (scopePath.scope.hasGlobal(newName) || me.obfuscator.nameGen.notSafeForReuseNames.has(newName));
|
|
251
|
+
// Ensure global names aren't overridden
|
|
252
|
+
}
|
|
253
|
+
newNames.set(name, newName);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// console.log(node.type, newNames);
|
|
257
|
+
} catch (err) {
|
|
258
|
+
_iterator3.e(err);
|
|
259
|
+
} finally {
|
|
260
|
+
_iterator3.f();
|
|
261
|
+
}
|
|
262
|
+
renamedVariables.set(node, newNames);
|
|
212
263
|
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
|
|
264
|
+
};
|
|
265
|
+
return {
|
|
266
|
+
visitor: _objectSpread(_objectSpread({}, VariableAnalysisVisitor), VariableRenamingVisitor)
|
|
267
|
+
};
|
|
268
|
+
};
|