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,242 +1,158 @@
|
|
|
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 _traverse = require("../../traverse");
|
|
9
|
-
var _gen = require("../../util/gen");
|
|
10
|
-
var _insert = require("../../util/insert");
|
|
7
|
+
exports["default"] = void 0;
|
|
11
8
|
var _order = require("../../order");
|
|
12
|
-
var
|
|
13
|
-
var
|
|
9
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
10
|
+
var _astUtils = require("../../utils/ast-utils");
|
|
14
11
|
var _probability = require("../../probability");
|
|
15
|
-
|
|
16
|
-
var
|
|
17
|
-
function
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
* ```
|
|
38
|
-
*/
|
|
39
|
-
class ObjectExtraction extends _transform.default {
|
|
40
|
-
constructor(o) {
|
|
41
|
-
super(o, _order.ObfuscateOrder.ObjectExtraction);
|
|
42
|
-
}
|
|
43
|
-
match(object, parents) {
|
|
44
|
-
return (0, _insert.isVarContext)(object);
|
|
45
|
-
}
|
|
46
|
-
transform(context, contextParents) {
|
|
47
|
-
// ObjectExpression Extractor
|
|
12
|
+
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); }
|
|
13
|
+
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; }
|
|
14
|
+
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; } } }; }
|
|
15
|
+
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; } }
|
|
16
|
+
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; }
|
|
17
|
+
var _default = exports["default"] = function _default(_ref) {
|
|
18
|
+
var Plugin = _ref.Plugin;
|
|
19
|
+
var me = Plugin(_order.Order.ObjectExtraction, {
|
|
20
|
+
changeData: {
|
|
21
|
+
objects: 0
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
return {
|
|
25
|
+
visitor: {
|
|
26
|
+
Program: {
|
|
27
|
+
enter: function enter(path) {
|
|
28
|
+
path.scope.crawl();
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
VariableDeclaration: function VariableDeclaration(varDecPath) {
|
|
32
|
+
if (varDecPath.node.declarations.length !== 1) return;
|
|
33
|
+
var declaration = varDecPath.get("declarations.0");
|
|
48
34
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
var objectDefiningIdentifiers = Object.create(null);
|
|
53
|
-
var illegal = new Set();
|
|
54
|
-
(0, _traverse.walk)(context, contextParents, (object, parents) => {
|
|
55
|
-
if (object.type == "ObjectExpression") {
|
|
56
|
-
// this.log(object, parents);
|
|
57
|
-
if (parents[0].type == "VariableDeclarator" && parents[0].init == object && parents[0].id.type == "Identifier") {
|
|
58
|
-
var name = parents[0].id.name;
|
|
59
|
-
if (name) {
|
|
60
|
-
if ((0, _insert.getVarContext)(object, parents) != context) {
|
|
61
|
-
illegal.add(name);
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
if (!object.properties.length) {
|
|
65
|
-
illegal.add(name);
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
35
|
+
// Must be simple variable declaration (No destructuring)
|
|
36
|
+
var identifier = declaration.get("id");
|
|
37
|
+
if (!identifier.isIdentifier()) return;
|
|
68
38
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
39
|
+
// Must be an object expression
|
|
40
|
+
var objectExpression = declaration.get("init");
|
|
41
|
+
if (!objectExpression.isObjectExpression()) return;
|
|
42
|
+
|
|
43
|
+
// Not allowed to reassign the object
|
|
44
|
+
var binding = varDecPath.scope.getBinding(identifier.node.name);
|
|
45
|
+
if (!binding || binding.constantViolations.length > 0) return;
|
|
46
|
+
var pendingReplacements = [];
|
|
47
|
+
var newObjectName = me.getPlaceholder() + "_" + identifier.node.name;
|
|
48
|
+
var newPropertyMappings = new Map();
|
|
49
|
+
|
|
50
|
+
// Create new property names from the original object properties
|
|
51
|
+
var newDeclarations = [];
|
|
52
|
+
var _iterator = _createForOfIteratorHelper(objectExpression.get("properties")),
|
|
53
|
+
_step;
|
|
54
|
+
try {
|
|
55
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
56
|
+
var property = _step.value;
|
|
57
|
+
if (!property.isObjectProperty()) return;
|
|
58
|
+
var propertyKey = (0, _astUtils.getObjectPropertyAsString)(property.node);
|
|
59
|
+
if (!propertyKey) {
|
|
60
|
+
// Property key is not a static string, not allowed
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
var newPropertyName = newPropertyMappings.get(propertyKey);
|
|
64
|
+
if (newPropertyName) {
|
|
65
|
+
// Duplicate property, not allowed
|
|
66
|
+
return;
|
|
67
|
+
} else {
|
|
68
|
+
newPropertyName = newObjectName + "_" + (t.isValidIdentifier(propertyKey) ? propertyKey : me.getPlaceholder());
|
|
69
|
+
newPropertyMappings.set(propertyKey, newPropertyName);
|
|
70
|
+
}
|
|
74
71
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
72
|
+
// Check function for referencing 'this'
|
|
73
|
+
var value = property.get("value");
|
|
74
|
+
if (value.isFunction()) {
|
|
75
|
+
var referencesThis = false;
|
|
76
|
+
value.traverse({
|
|
77
|
+
ThisExpression: function ThisExpression(thisPath) {
|
|
78
|
+
referencesThis = true;
|
|
80
79
|
}
|
|
81
80
|
});
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
this.log(name + " has non-init/computed property: " + nonInitOrComputed.key.name || nonInitOrComputed.key.value);
|
|
86
|
-
} else {
|
|
87
|
-
this.log(name + " has spread-element or other type of property");
|
|
88
|
-
}
|
|
89
|
-
illegal.add(name);
|
|
81
|
+
if (referencesThis) {
|
|
82
|
+
// Function references 'this', not allowed
|
|
83
|
+
// When extracted, this will not refer to the original object
|
|
90
84
|
return;
|
|
91
|
-
} else {
|
|
92
|
-
var illegalName = object.properties.map(x => x.computed ? x.key.value : x.key.name || x.key.value).find(x => !x || !(0, _compare.isValidIdentifier)(x));
|
|
93
|
-
if (illegalName) {
|
|
94
|
-
this.log(name + " has an illegal property '" + illegalName + "'");
|
|
95
|
-
illegal.add(name);
|
|
96
|
-
return;
|
|
97
|
-
} else {
|
|
98
|
-
var isIllegal = false;
|
|
99
|
-
(0, _traverse.walk)(object, parents, (o, p) => {
|
|
100
|
-
if (o.type == "ThisExpression" || o.type == "Super") {
|
|
101
|
-
isIllegal = true;
|
|
102
|
-
return "EXIT";
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
if (isIllegal) {
|
|
106
|
-
illegal.add(name);
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
objectDefs[name] = [object, parents];
|
|
110
|
-
objectDefiningIdentifiers[name] = [parents[0].id, [...parents]];
|
|
111
|
-
}
|
|
112
85
|
}
|
|
113
86
|
}
|
|
87
|
+
newDeclarations.push(t.variableDeclarator(t.identifier(newPropertyName), value.node));
|
|
114
88
|
}
|
|
89
|
+
} catch (err) {
|
|
90
|
+
_iterator.e(err);
|
|
91
|
+
} finally {
|
|
92
|
+
_iterator.f();
|
|
115
93
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
94
|
+
var isObjectSafe = true;
|
|
95
|
+
(0, _astUtils.getParentFunctionOrProgram)(varDecPath).traverse({
|
|
96
|
+
Identifier: {
|
|
97
|
+
exit: function exit(idPath) {
|
|
98
|
+
if (idPath.node.name !== identifier.node.name) return;
|
|
99
|
+
if (idPath === identifier) return; // Skip the original declaration
|
|
121
100
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
101
|
+
var memberExpression = idPath.parentPath;
|
|
102
|
+
if (!memberExpression || !memberExpression.isMemberExpression()) {
|
|
103
|
+
isObjectSafe = false;
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
var property = (0, _astUtils.getMemberExpressionPropertyAsString)(memberExpression.node);
|
|
107
|
+
if (!property) {
|
|
108
|
+
isObjectSafe = false;
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
127
111
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
var def = objectDefs[object.name];
|
|
136
|
-
if (def) {
|
|
137
|
-
var isIllegal = false;
|
|
138
|
-
if (info.spec.isDefined) {
|
|
139
|
-
if (objectDefiningIdentifiers[object.name][0] !== object) {
|
|
140
|
-
this.log(object.name, "you can't redefine the object");
|
|
141
|
-
isIllegal = true;
|
|
142
|
-
}
|
|
143
|
-
} else {
|
|
144
|
-
var isMemberExpression = parents[0].type == "MemberExpression" && parents[0].object == object;
|
|
145
|
-
if (parents.find(x => x.type == "AssignmentExpression") && !isMemberExpression || parents.find(x => x.type == "UnaryExpression" && x.operator == "delete")) {
|
|
146
|
-
this.log(object.name, "you can't re-assign the object");
|
|
147
|
-
isIllegal = true;
|
|
148
|
-
} else if (isMemberExpression) {
|
|
149
|
-
var key = parents[0].property.value || parents[0].property.name;
|
|
150
|
-
if (parents[0].computed && parents[0].property.type !== "Literal") {
|
|
151
|
-
this.log(object.name, "object[expr] detected, only object['key'] is allowed");
|
|
152
|
-
isIllegal = true;
|
|
153
|
-
} else if (!parents[0].computed && parents[0].property.type !== "Identifier") {
|
|
154
|
-
this.log(object.name, "object.<expr> detected, only object.key is allowed");
|
|
155
|
-
isIllegal = true;
|
|
156
|
-
} else if (!key || !def[0].properties.some(x => (x.key.value || x.key.name) == key)) {
|
|
157
|
-
// check if initialized property
|
|
158
|
-
// not in initialized object.
|
|
159
|
-
this.log(object.name, "not in initialized object.", def[0].properties, key);
|
|
160
|
-
isIllegal = true;
|
|
161
|
-
}
|
|
162
|
-
if (!isIllegal && key) {
|
|
163
|
-
// allowed.
|
|
164
|
-
// start the array if first time
|
|
165
|
-
if (!objectDefChanges[object.name]) {
|
|
166
|
-
objectDefChanges[object.name] = [];
|
|
167
|
-
}
|
|
168
|
-
// add to array
|
|
169
|
-
objectDefChanges[object.name].push({
|
|
170
|
-
key: key,
|
|
171
|
-
object: object,
|
|
172
|
-
parents: parents
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
} else {
|
|
176
|
-
this.log(object.name, "you must access a property on the when referring to the identifier (accessors must be hard-coded literals), parent is " + parents[0].type);
|
|
177
|
-
isIllegal = true;
|
|
178
|
-
}
|
|
112
|
+
// Delete expression check
|
|
113
|
+
if (memberExpression.parentPath.isUnaryExpression({
|
|
114
|
+
operator: "delete"
|
|
115
|
+
})) {
|
|
116
|
+
// Deleting object properties is not allowed
|
|
117
|
+
isObjectSafe = false;
|
|
118
|
+
return;
|
|
179
119
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
120
|
+
var newPropertyName = newPropertyMappings.get(property);
|
|
121
|
+
if (!newPropertyName) {
|
|
122
|
+
// Property added later on, not allowed
|
|
123
|
+
isObjectSafe = false;
|
|
124
|
+
return;
|
|
185
125
|
}
|
|
126
|
+
var extractedIdentifier = t.identifier(newPropertyName);
|
|
127
|
+
pendingReplacements.push({
|
|
128
|
+
path: memberExpression,
|
|
129
|
+
replaceWith: extractedIdentifier
|
|
130
|
+
});
|
|
186
131
|
}
|
|
187
132
|
}
|
|
188
133
|
});
|
|
189
|
-
Object.keys(objectDefs).forEach(name => {
|
|
190
|
-
if (!(0, _probability.ComputeProbabilityMap)(this.options.objectExtraction, x => x, name)) {
|
|
191
|
-
//continue;
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
var [object, parents] = objectDefs[name];
|
|
195
|
-
var declarator = parents[0];
|
|
196
|
-
var declaration = parents[2];
|
|
197
|
-
(0, _assert.ok)(declarator.type === "VariableDeclarator");
|
|
198
|
-
(0, _assert.ok)(declaration.type === "VariableDeclaration");
|
|
199
|
-
var properties = object.properties;
|
|
200
|
-
// change the prop names while extracting
|
|
201
|
-
var newPropNames = {};
|
|
202
|
-
var variableDeclarators = [];
|
|
203
|
-
properties.forEach(property => {
|
|
204
|
-
var keyName = property.key.name || property.key.value;
|
|
205
|
-
var nn = name + "_" + keyName;
|
|
206
|
-
newPropNames[keyName] = nn;
|
|
207
|
-
var v = property.value;
|
|
208
|
-
variableDeclarators.push((0, _gen.VariableDeclarator)(nn, this.addComment(v, `${name}.${keyName}`)));
|
|
209
|
-
});
|
|
210
|
-
declaration.declarations.splice(declaration.declarations.indexOf(declarator), 1, ...variableDeclarators);
|
|
211
|
-
|
|
212
|
-
// const can only be safely changed to let
|
|
213
|
-
if (declaration.kind === "const") {
|
|
214
|
-
declaration.kind = "let";
|
|
215
|
-
}
|
|
216
134
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
} else {
|
|
227
|
-
// Provide error with more information:
|
|
228
|
-
console.log(memberExpression);
|
|
229
|
-
this.error(new Error(`should be MemberExpression, found type=${memberExpression.type}`));
|
|
230
|
-
}
|
|
231
|
-
} else {
|
|
232
|
-
console.log(objectDefChanges[name], newPropNames);
|
|
233
|
-
this.error(new Error(`"${change.key}" not found in [${Object.keys(newPropNames).join(", ")}] while flattening ${name}.`));
|
|
234
|
-
}
|
|
235
|
-
});
|
|
236
|
-
this.log(`Extracted ${Object.keys(newPropNames).length} properties from ${name}, affecting ${Object.keys(objectDefChanges[name] || {}).length} line(s) of code.`);
|
|
135
|
+
// Object references are too complex to safely extract
|
|
136
|
+
if (!isObjectSafe) return;
|
|
137
|
+
if (!(0, _probability.computeProbabilityMap)(me.options.objectExtraction, identifier.node.name)) return;
|
|
138
|
+
var newDeclarationKind = varDecPath.node.kind === "const" ? "let" : varDecPath.node.kind;
|
|
139
|
+
varDecPath.replaceWithMultiple(newDeclarations.map(function (declaration) {
|
|
140
|
+
return t.variableDeclaration(newDeclarationKind, [declaration]);
|
|
141
|
+
})).forEach(function (path) {
|
|
142
|
+
// Make sure to register the new declarations
|
|
143
|
+
path.scope.registerDeclaration(path);
|
|
237
144
|
});
|
|
145
|
+
|
|
146
|
+
// Replace all references to new singular identifiers
|
|
147
|
+
for (var _i = 0, _pendingReplacements = pendingReplacements; _i < _pendingReplacements.length; _i++) {
|
|
148
|
+
var _pendingReplacements$ = _pendingReplacements[_i],
|
|
149
|
+
path = _pendingReplacements$.path,
|
|
150
|
+
replaceWith = _pendingReplacements$.replaceWith;
|
|
151
|
+
path.replaceWith(replaceWith);
|
|
152
|
+
}
|
|
153
|
+
me.log("Extracted object", identifier.node.name);
|
|
154
|
+
me.changeData.objects++;
|
|
238
155
|
}
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
exports.default = ObjectExtraction;
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
};
|
|
@@ -3,66 +3,63 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports
|
|
6
|
+
exports["default"] = void 0;
|
|
7
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
7
8
|
var _order = require("../order");
|
|
8
|
-
var _gen = require("../util/gen");
|
|
9
9
|
var _stringEncoding = _interopRequireDefault(require("./string/stringEncoding"));
|
|
10
|
-
var
|
|
11
|
-
|
|
10
|
+
var _constants = require("../constants");
|
|
11
|
+
var _assert = require("assert");
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
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 _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); }
|
|
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; }
|
|
12
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; }
|
|
13
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" ==
|
|
14
|
-
function _toPrimitive(t, r) { if ("object" !=
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (this.options.hexadecimalNumbers && this.isNumberLiteral(object)) {
|
|
45
|
-
return () => {
|
|
46
|
-
// Technically, a Literal will never be negative because it's supposed to be inside a UnaryExpression with a "-" operator.
|
|
47
|
-
// This code handles it regardless
|
|
48
|
-
var isNegative = object.value < 0;
|
|
49
|
-
var hex = Math.abs(object.value).toString(16);
|
|
50
|
-
var newStr = (isNegative ? "-" : "") + "0x" + hex;
|
|
51
|
-
this.replace(object, (0, _gen.Identifier)(newStr));
|
|
52
|
-
};
|
|
53
|
-
}
|
|
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
|
+
var _default = exports["default"] = function _default(_ref) {
|
|
22
|
+
var Plugin = _ref.Plugin;
|
|
23
|
+
var me = Plugin(_order.Order.Finalizer);
|
|
24
|
+
var stringEncodingPlugin = (0, _stringEncoding["default"])(me);
|
|
25
|
+
return {
|
|
26
|
+
visitor: _objectSpread(_objectSpread(_objectSpread({}, stringEncodingPlugin.visitor), me.obfuscator.hasPlugin(_order.Order.RenameVariables) ? {} : {
|
|
27
|
+
CallExpression: {
|
|
28
|
+
exit: function exit(path) {
|
|
29
|
+
if (path.get("callee").isIdentifier({
|
|
30
|
+
name: _constants.variableFunctionName
|
|
31
|
+
})) {
|
|
32
|
+
var args = path.get("arguments");
|
|
33
|
+
(0, _assert.ok)(args.length === 1);
|
|
34
|
+
var arg = args[0];
|
|
35
|
+
(0, _assert.ok)(arg.isIdentifier());
|
|
36
|
+
var name = arg.node.name;
|
|
37
|
+
path.replaceWith(t.stringLiteral(name));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}), {}, {
|
|
42
|
+
// Hexadecimal numbers
|
|
43
|
+
NumberLiteral: {
|
|
44
|
+
exit: function exit(path) {
|
|
45
|
+
if (me.options.hexadecimalNumbers) {
|
|
46
|
+
var value = path.node.value;
|
|
47
|
+
if (Number.isNaN(value) || !Number.isFinite(value) || Math.floor(value) !== value) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
54
50
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
|
|
51
|
+
// Technically, a Literal will never be negative because it's supposed to be inside a UnaryExpression with a "-" operator.
|
|
52
|
+
// This code handles it regardless
|
|
53
|
+
var isNegative = value < 0;
|
|
54
|
+
var hex = Math.abs(value).toString(16);
|
|
55
|
+
var newStr = (isNegative ? "-" : "") + "0x" + hex;
|
|
56
|
+
var id = t.identifier(newStr);
|
|
57
|
+
id[_constants.GEN_NODE] = true;
|
|
58
|
+
path.replaceWith(id);
|
|
59
|
+
path.skip();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
})
|
|
64
|
+
};
|
|
65
|
+
};
|