js-confuser 1.7.1 → 1.7.3
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/workflows/node.js.yml +1 -1
- package/CHANGELOG.md +73 -0
- package/README.md +32 -31
- package/dist/compiler.js +2 -8
- package/dist/constants.js +22 -10
- package/dist/index.js +15 -30
- package/dist/obfuscator.js +15 -62
- package/dist/options.js +33 -40
- package/dist/order.js +4 -7
- package/dist/parser.js +5 -13
- package/dist/precedence.js +6 -8
- package/dist/presets.js +4 -6
- package/dist/probability.js +13 -24
- package/dist/templates/bufferToString.js +121 -5
- package/dist/templates/core.js +35 -0
- package/dist/templates/crash.js +22 -11
- package/dist/templates/es5.js +125 -6
- package/dist/templates/functionLength.js +24 -6
- package/dist/templates/globals.js +9 -0
- package/dist/templates/template.js +189 -43
- package/dist/transforms/antiTooling.js +26 -22
- package/dist/transforms/calculator.js +19 -55
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +242 -333
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +46 -25
- package/dist/transforms/deadCode.js +542 -31
- package/dist/transforms/dispatcher.js +112 -112
- package/dist/transforms/es5/antiClass.js +70 -44
- package/dist/transforms/es5/antiDestructuring.js +14 -38
- package/dist/transforms/es5/antiES6Object.js +39 -48
- package/dist/transforms/es5/antiSpreadOperator.js +5 -14
- package/dist/transforms/es5/antiTemplate.js +10 -19
- package/dist/transforms/es5/es5.js +7 -40
- package/dist/transforms/extraction/classExtraction.js +83 -0
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +41 -80
- package/dist/transforms/extraction/objectExtraction.js +24 -56
- package/dist/transforms/finalizer.js +6 -20
- package/dist/transforms/flatten.js +51 -99
- package/dist/transforms/identifier/globalAnalysis.js +21 -26
- package/dist/transforms/identifier/globalConcealing.js +72 -56
- package/dist/transforms/identifier/movedDeclarations.js +66 -38
- package/dist/transforms/identifier/renameVariables.js +36 -68
- package/dist/transforms/identifier/variableAnalysis.js +21 -48
- package/dist/transforms/lock/antiDebug.js +20 -25
- package/dist/transforms/lock/integrity.js +53 -52
- package/dist/transforms/lock/lock.js +161 -126
- package/dist/transforms/minify.js +77 -108
- package/dist/transforms/opaquePredicates.js +12 -49
- package/dist/transforms/preparation.js +28 -49
- package/dist/transforms/renameLabels.js +5 -22
- package/dist/transforms/rgf.js +125 -72
- package/dist/transforms/shuffle.js +42 -47
- package/dist/transforms/stack.js +41 -98
- package/dist/transforms/string/encoding.js +76 -27
- package/dist/transforms/string/stringCompression.js +75 -68
- package/dist/transforms/string/stringConcealing.js +127 -135
- package/dist/transforms/string/stringEncoding.js +6 -26
- package/dist/transforms/string/stringSplitting.js +5 -30
- package/dist/transforms/transform.js +76 -104
- package/dist/traverse.js +11 -18
- package/dist/util/compare.js +27 -29
- package/dist/util/gen.js +32 -86
- package/dist/util/guard.js +5 -1
- package/dist/util/identifiers.js +9 -72
- package/dist/util/insert.js +27 -77
- package/dist/util/math.js +0 -3
- package/dist/util/object.js +3 -7
- package/dist/util/random.js +31 -36
- package/dist/util/scope.js +6 -3
- package/docs/Countermeasures.md +13 -6
- package/docs/Integrity.md +35 -28
- package/docs/RGF.md +6 -1
- package/docs/RenameVariables.md +116 -0
- package/docs/TamperProtection.md +100 -0
- package/docs/Template.md +117 -0
- package/package.json +3 -3
- package/src/constants.ts +17 -0
- package/src/index.ts +7 -5
- package/src/options.ts +60 -7
- package/src/order.ts +2 -2
- package/src/templates/bufferToString.ts +79 -11
- package/src/templates/core.ts +29 -0
- package/src/templates/crash.ts +6 -38
- package/src/templates/es5.ts +1 -1
- package/src/templates/functionLength.ts +21 -3
- package/src/templates/globals.ts +3 -0
- package/src/templates/template.ts +205 -46
- package/src/transforms/antiTooling.ts +33 -11
- package/src/transforms/calculator.ts +4 -2
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +12 -5
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +46 -10
- package/src/transforms/deadCode.ts +74 -42
- package/src/transforms/dispatcher.ts +99 -73
- package/src/transforms/es5/antiClass.ts +25 -12
- package/src/transforms/es5/antiDestructuring.ts +1 -1
- package/src/transforms/es5/antiES6Object.ts +2 -2
- package/src/transforms/es5/antiTemplate.ts +1 -1
- package/src/transforms/extraction/classExtraction.ts +168 -0
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +11 -16
- package/src/transforms/extraction/objectExtraction.ts +4 -15
- package/src/transforms/flatten.ts +20 -5
- package/src/transforms/identifier/globalAnalysis.ts +18 -1
- package/src/transforms/identifier/globalConcealing.ts +119 -72
- package/src/transforms/identifier/movedDeclarations.ts +90 -24
- package/src/transforms/identifier/renameVariables.ts +16 -1
- package/src/transforms/lock/antiDebug.ts +2 -2
- package/src/transforms/lock/integrity.ts +13 -11
- package/src/transforms/lock/lock.ts +122 -30
- package/src/transforms/minify.ts +28 -13
- package/src/transforms/opaquePredicates.ts +2 -2
- package/src/transforms/preparation.ts +16 -0
- package/src/transforms/rgf.ts +139 -12
- package/src/transforms/shuffle.ts +3 -3
- package/src/transforms/stack.ts +19 -4
- package/src/transforms/string/encoding.ts +88 -51
- package/src/transforms/string/stringCompression.ts +86 -17
- package/src/transforms/string/stringConcealing.ts +148 -118
- package/src/transforms/string/stringEncoding.ts +1 -2
- package/src/transforms/string/stringSplitting.ts +1 -2
- package/src/transforms/transform.ts +63 -46
- package/src/types.ts +2 -0
- package/src/util/compare.ts +39 -5
- package/src/util/gen.ts +10 -3
- package/src/util/guard.ts +10 -0
- package/src/util/insert.ts +17 -0
- package/src/util/random.ts +81 -1
- package/src/util/scope.ts +14 -2
- package/test/code/Cash.test.ts +94 -5
- package/test/code/StrictMode.src.js +65 -0
- package/test/code/StrictMode.test.js +37 -0
- package/test/compare.test.ts +62 -2
- package/test/options.test.ts +129 -55
- package/test/templates/template.test.ts +211 -1
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +37 -18
- package/test/transforms/dispatcher.test.ts +55 -0
- package/test/transforms/extraction/classExtraction.test.ts +86 -0
- package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +8 -0
- package/test/transforms/extraction/objectExtraction.test.ts +2 -0
- package/test/transforms/identifier/globalConcealing.test.ts +89 -0
- package/test/transforms/identifier/movedDeclarations.test.ts +61 -0
- package/test/transforms/identifier/renameVariables.test.ts +75 -1
- package/test/transforms/lock/tamperProtection.test.ts +336 -0
- package/test/transforms/minify.test.ts +37 -0
- package/test/transforms/rgf.test.ts +50 -0
- package/dist/transforms/controlFlowFlattening/choiceFlowObfuscation.js +0 -62
- package/dist/transforms/controlFlowFlattening/controlFlowObfuscation.js +0 -159
- package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +0 -106
- package/dist/transforms/eval.js +0 -84
- package/dist/transforms/hexadecimalNumbers.js +0 -63
- package/dist/transforms/hideInitializingCode.js +0 -270
- package/dist/transforms/identifier/nameRecycling.js +0 -218
- package/dist/transforms/label.js +0 -67
- package/dist/transforms/preparation/nameConflicts.js +0 -116
- package/dist/transforms/preparation/preparation.js +0 -188
|
@@ -4,115 +4,88 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _transform = _interopRequireDefault(require("./transform"));
|
|
9
|
-
|
|
10
8
|
var _gen = require("../util/gen");
|
|
11
|
-
|
|
12
9
|
var _random = require("../util/random");
|
|
13
|
-
|
|
14
10
|
var _order = require("../order");
|
|
15
|
-
|
|
16
11
|
var _insert = require("../util/insert");
|
|
17
|
-
|
|
18
12
|
var _template = _interopRequireDefault(require("../templates/template"));
|
|
19
|
-
|
|
20
13
|
var _probability = require("../probability");
|
|
21
|
-
|
|
22
14
|
var _assert = require("assert");
|
|
23
|
-
|
|
24
|
-
function
|
|
25
|
-
|
|
26
|
-
function
|
|
27
|
-
|
|
15
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
|
+
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; }
|
|
17
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
18
|
+
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); }
|
|
28
19
|
const testTypes = new Set(["ForStatement", "WhileStatement", "DoWhileStatement", "IfStatement", "ConditionExpression"]);
|
|
29
|
-
|
|
30
20
|
function isTestExpression(object, parents) {
|
|
31
21
|
if (!object || !parents[0]) {
|
|
32
22
|
return false;
|
|
33
23
|
}
|
|
34
|
-
|
|
35
24
|
if (testTypes.has(parents[0].type) && parents[0].test === object) {
|
|
36
25
|
return true;
|
|
37
26
|
}
|
|
38
|
-
|
|
39
27
|
return false;
|
|
40
28
|
}
|
|
29
|
+
|
|
41
30
|
/**
|
|
42
31
|
* Changes test expression (such as if statements, for loops) to add predicates.
|
|
43
32
|
*
|
|
44
33
|
* Predicates are computed at runtime.
|
|
45
34
|
*/
|
|
46
|
-
|
|
47
|
-
|
|
48
35
|
class OpaquePredicates extends _transform.default {
|
|
49
36
|
constructor(o) {
|
|
50
37
|
super(o, _order.ObfuscateOrder.OpaquePredicates);
|
|
51
|
-
|
|
52
38
|
_defineProperty(this, "undefinedVar", void 0);
|
|
53
|
-
|
|
54
39
|
_defineProperty(this, "nullVar", void 0);
|
|
55
|
-
|
|
56
40
|
_defineProperty(this, "numberVar", void 0);
|
|
57
|
-
|
|
58
41
|
_defineProperty(this, "predicateName", void 0);
|
|
59
|
-
|
|
60
42
|
_defineProperty(this, "predicate", void 0);
|
|
61
|
-
|
|
62
43
|
_defineProperty(this, "predicates", void 0);
|
|
63
|
-
|
|
64
44
|
_defineProperty(this, "gen", void 0);
|
|
65
|
-
|
|
66
45
|
_defineProperty(this, "made", void 0);
|
|
67
|
-
|
|
68
46
|
this.predicates = Object.create(null);
|
|
69
47
|
this.gen = this.getGenerator();
|
|
70
48
|
this.made = 0;
|
|
71
49
|
}
|
|
72
|
-
|
|
73
50
|
match(object, parents) {
|
|
74
|
-
return (isTestExpression(object, parents) || object.type == "SwitchCase") && !parents.find(x => x.$
|
|
51
|
+
return (isTestExpression(object, parents) || object.type == "SwitchCase") && !parents.find(x => x.$multiTransformSkip || x.type == "AwaitExpression");
|
|
75
52
|
}
|
|
76
|
-
|
|
77
53
|
transform(object, parents) {
|
|
78
54
|
return () => {
|
|
79
55
|
if (!(0, _probability.ComputeProbabilityMap)(this.options.opaquePredicates)) {
|
|
80
56
|
return;
|
|
81
57
|
}
|
|
82
|
-
|
|
83
58
|
this.made++;
|
|
84
|
-
|
|
85
59
|
if (this.made > 150) {
|
|
86
60
|
return;
|
|
87
61
|
}
|
|
88
|
-
|
|
89
62
|
if (!this.predicate) {
|
|
90
63
|
this.predicateName = this.getPlaceholder();
|
|
91
64
|
this.predicate = (0, _gen.ObjectExpression)([]);
|
|
92
65
|
var tempName = this.getPlaceholder();
|
|
93
66
|
(0, _insert.prepend)(parents[parents.length - 1] || object, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(this.predicateName, (0, _gen.CallExpression)((0, _gen.FunctionExpression)([], [(0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(tempName, this.predicate)), (0, _gen.ReturnStatement)((0, _gen.Identifier)(tempName))]), []))));
|
|
94
67
|
}
|
|
95
|
-
|
|
96
68
|
var expr = (0, _random.choice)(Object.values(this.predicates));
|
|
97
|
-
|
|
98
69
|
if (!expr || Math.random() < 0.5 / (Object.keys(this.predicates).length || 1)) {
|
|
99
70
|
var prop = this.gen.generate();
|
|
100
71
|
var accessor = (0, _gen.MemberExpression)((0, _gen.Identifier)(this.predicateName), (0, _gen.Identifier)(prop), false);
|
|
101
|
-
|
|
102
72
|
switch ((0, _random.choice)(["array", "number", "string"])) {
|
|
103
73
|
case "array":
|
|
104
74
|
var arrayProp = this.gen.generate();
|
|
105
75
|
this.predicate.properties.push((0, _gen.Property)((0, _gen.Identifier)(arrayProp), (0, _gen.ArrayExpression)([])));
|
|
106
76
|
var paramName = this.getPlaceholder();
|
|
107
|
-
this.predicate.properties.push((0, _gen.Property)((0, _gen.Identifier)(prop), (0, _gen.FunctionExpression)([(0, _gen.AssignmentPattern)((0, _gen.Identifier)(paramName), (0, _gen.Literal)("length"))],
|
|
77
|
+
this.predicate.properties.push((0, _gen.Property)((0, _gen.Identifier)(prop), (0, _gen.FunctionExpression)([(0, _gen.AssignmentPattern)((0, _gen.Identifier)(paramName), (0, _gen.Literal)("length"))], new _template.default(`
|
|
78
|
+
if ( !${this.predicateName}.${arrayProp}[0] ) {
|
|
79
|
+
${this.predicateName}.${arrayProp}.push(${(0, _random.getRandomInteger)(-100, 100)});
|
|
80
|
+
}
|
|
81
|
+
return ${this.predicateName}.${arrayProp}[${paramName}];
|
|
82
|
+
`).compile())));
|
|
108
83
|
expr = (0, _gen.CallExpression)(accessor, []);
|
|
109
84
|
break;
|
|
110
|
-
|
|
111
85
|
case "number":
|
|
112
86
|
this.predicate.properties.push((0, _gen.Property)((0, _gen.Identifier)(prop), (0, _gen.Literal)((0, _random.getRandomInteger)(15, 90))));
|
|
113
87
|
expr = (0, _gen.BinaryExpression)(">", accessor, (0, _gen.Literal)((0, _random.getRandomInteger)(-90, 10)));
|
|
114
88
|
break;
|
|
115
|
-
|
|
116
89
|
case "string":
|
|
117
90
|
var str = this.gen.generate();
|
|
118
91
|
var index = (0, _random.getRandomInteger)(0, str.length);
|
|
@@ -121,21 +94,16 @@ class OpaquePredicates extends _transform.default {
|
|
|
121
94
|
expr = (0, _gen.BinaryExpression)("==", (0, _gen.CallExpression)((0, _gen.MemberExpression)(accessor, (0, _gen.Literal)(fn), true), [(0, _gen.Literal)(index)]), (0, _gen.Literal)(str[fn](index)));
|
|
122
95
|
break;
|
|
123
96
|
}
|
|
124
|
-
|
|
125
97
|
(0, _assert.ok)(expr);
|
|
126
98
|
this.predicates[prop] = expr;
|
|
127
|
-
|
|
128
99
|
if (Math.random() > 0.8) {
|
|
129
100
|
(0, _random.shuffle)(this.predicate.properties);
|
|
130
101
|
}
|
|
131
102
|
}
|
|
132
|
-
|
|
133
103
|
var cloned = (0, _insert.clone)(expr);
|
|
134
|
-
|
|
135
104
|
if (object.type == "SwitchCase" && object.test) {
|
|
136
105
|
var matching = (0, _gen.Identifier)((0, _random.choice)(["undefined", "null"]));
|
|
137
106
|
var test = object.test;
|
|
138
|
-
|
|
139
107
|
if (test.type == "Literal") {
|
|
140
108
|
if (typeof test.value === "number") {
|
|
141
109
|
matching = (0, _gen.Literal)((0, _random.getRandomInteger)(-250, 250));
|
|
@@ -143,13 +111,10 @@ class OpaquePredicates extends _transform.default {
|
|
|
143
111
|
matching = (0, _gen.Literal)((0, _random.getRandomString)(4));
|
|
144
112
|
}
|
|
145
113
|
}
|
|
146
|
-
|
|
147
114
|
var conditionalExpression = (0, _gen.ConditionalExpression)(cloned, (0, _insert.clone)(test), matching);
|
|
148
|
-
|
|
149
115
|
if (Math.random() > 0.5) {
|
|
150
116
|
conditionalExpression = (0, _gen.ConditionalExpression)((0, _gen.UnaryExpression)("!", cloned), matching, (0, _insert.clone)(test));
|
|
151
117
|
}
|
|
152
|
-
|
|
153
118
|
this.replace(test, conditionalExpression);
|
|
154
119
|
} else if (isTestExpression(object, parents)) {
|
|
155
120
|
if (object.type == "Literal" && !object.regex) {
|
|
@@ -164,7 +129,5 @@ class OpaquePredicates extends _transform.default {
|
|
|
164
129
|
}
|
|
165
130
|
};
|
|
166
131
|
}
|
|
167
|
-
|
|
168
132
|
}
|
|
169
|
-
|
|
170
133
|
exports.default = OpaquePredicates;
|
|
@@ -4,23 +4,15 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _transform = _interopRequireDefault(require("./transform"));
|
|
9
|
-
|
|
10
8
|
var _gen = require("../util/gen");
|
|
11
|
-
|
|
12
9
|
var _order = require("../order");
|
|
13
|
-
|
|
14
10
|
var _insert = require("../util/insert");
|
|
15
|
-
|
|
16
11
|
var _identifiers = require("../util/identifiers");
|
|
17
|
-
|
|
18
12
|
var _compare = require("../util/compare");
|
|
19
|
-
|
|
20
13
|
var _traverse = require("../traverse");
|
|
21
|
-
|
|
22
|
-
function _interopRequireDefault(
|
|
23
|
-
|
|
14
|
+
var _constants = require("../constants");
|
|
15
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
24
16
|
/**
|
|
25
17
|
* Preparation arranges the user's code into an AST the obfuscator can easily transform.
|
|
26
18
|
*
|
|
@@ -45,23 +37,32 @@ class Preparation extends _transform.default {
|
|
|
45
37
|
constructor(o) {
|
|
46
38
|
super(o, _order.ObfuscateOrder.Preparation);
|
|
47
39
|
}
|
|
48
|
-
|
|
49
40
|
match(object, parents) {
|
|
50
41
|
return !!object.type;
|
|
51
42
|
}
|
|
52
|
-
|
|
53
43
|
transform(object, parents) {
|
|
54
44
|
// ExplicitIdentifiers
|
|
55
45
|
if (object.type === "Identifier") {
|
|
56
46
|
return this.transformExplicitIdentifiers(object, parents);
|
|
57
|
-
}
|
|
47
|
+
}
|
|
58
48
|
|
|
49
|
+
// __JS_CONFUSER_VAR__ - Remove when Rename Variables is disabled
|
|
50
|
+
if (object.type === "CallExpression" && object.callee.type === "Identifier" && object.callee.name === _constants.variableFunctionName) {
|
|
51
|
+
if (object.arguments[0].type === "Identifier") {
|
|
52
|
+
if (!this.obfuscator.transforms["RenameVariables"]) {
|
|
53
|
+
return () => {
|
|
54
|
+
this.replace(object, (0, _gen.Literal)(object.arguments[0].name));
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
59
|
|
|
60
|
+
// ExplicitDeclarations
|
|
60
61
|
if (object.type === "VariableDeclaration") {
|
|
61
62
|
return this.transformExplicitDeclarations(object, parents);
|
|
62
|
-
}
|
|
63
|
-
|
|
63
|
+
}
|
|
64
64
|
|
|
65
|
+
// Block
|
|
65
66
|
switch (object.type) {
|
|
66
67
|
/**
|
|
67
68
|
* People use shortcuts and its harder to parse.
|
|
@@ -73,13 +74,10 @@ class Preparation extends _transform.default {
|
|
|
73
74
|
if (object.consequent.type != "BlockStatement") {
|
|
74
75
|
object.consequent = (0, _gen.BlockStatement)([(0, _insert.clone)(object.consequent)]);
|
|
75
76
|
}
|
|
76
|
-
|
|
77
77
|
if (object.alternate && object.alternate.type != "BlockStatement") {
|
|
78
78
|
object.alternate = (0, _gen.BlockStatement)([(0, _insert.clone)(object.alternate)]);
|
|
79
79
|
}
|
|
80
|
-
|
|
81
80
|
break;
|
|
82
|
-
|
|
83
81
|
case "WhileStatement":
|
|
84
82
|
case "WithStatement":
|
|
85
83
|
case "ForStatement":
|
|
@@ -88,31 +86,27 @@ class Preparation extends _transform.default {
|
|
|
88
86
|
if (object.body.type != "BlockStatement") {
|
|
89
87
|
object.body = (0, _gen.BlockStatement)([(0, _insert.clone)(object.body)]);
|
|
90
88
|
}
|
|
91
|
-
|
|
92
89
|
break;
|
|
93
|
-
|
|
94
90
|
case "ArrowFunctionExpression":
|
|
95
91
|
if (object.body.type !== "BlockStatement" && object.expression) {
|
|
96
92
|
object.body = (0, _gen.BlockStatement)([(0, _gen.ReturnStatement)((0, _insert.clone)(object.body))]);
|
|
97
93
|
object.expression = false;
|
|
98
94
|
}
|
|
99
|
-
|
|
100
95
|
break;
|
|
101
|
-
}
|
|
102
|
-
|
|
96
|
+
}
|
|
103
97
|
|
|
98
|
+
// Label
|
|
104
99
|
if ((0, _compare.isLoop)(object) || object.type == "BlockStatement" && parents[0] && parents[0].type == "LabeledStatement" && parents[0].body === object) {
|
|
105
100
|
return this.transformLabel(object, parents);
|
|
106
101
|
}
|
|
107
102
|
}
|
|
103
|
+
|
|
108
104
|
/**
|
|
109
105
|
* Ensures every break; statement has a label to point to.
|
|
110
106
|
*
|
|
111
107
|
* This is because Control Flow Flattening adds For Loops which label-less break statements point to the nearest,
|
|
112
108
|
* when they actually need to point to the original statement.
|
|
113
109
|
*/
|
|
114
|
-
|
|
115
|
-
|
|
116
110
|
transformLabel(object, parents) {
|
|
117
111
|
return () => {
|
|
118
112
|
var currentLabel = parents[0].type == "LabeledStatement" && parents[0].label.name;
|
|
@@ -122,98 +116,85 @@ class Preparation extends _transform.default {
|
|
|
122
116
|
function isContinuableStatement(x) {
|
|
123
117
|
return (0, _compare.isLoop)(x) && x.type !== "SwitchStatement";
|
|
124
118
|
}
|
|
125
|
-
|
|
126
119
|
function isBreakableStatement(x) {
|
|
127
120
|
return (0, _compare.isLoop)(x) || o.label && x.type == "BlockStatement";
|
|
128
121
|
}
|
|
129
|
-
|
|
130
122
|
var fn = o.type == "ContinueStatement" ? isContinuableStatement : isBreakableStatement;
|
|
131
123
|
var loop = p.find(fn);
|
|
132
|
-
|
|
133
124
|
if (object == loop) {
|
|
134
125
|
if (!o.label) {
|
|
135
126
|
o.label = (0, _gen.Identifier)(label);
|
|
136
127
|
}
|
|
137
128
|
}
|
|
138
129
|
}
|
|
139
|
-
});
|
|
130
|
+
});
|
|
140
131
|
|
|
132
|
+
// Append label statement as this loop has none
|
|
141
133
|
if (!currentLabel) {
|
|
142
|
-
this.replace(object, (0, _gen.LabeledStatement)(label, {
|
|
134
|
+
this.replace(object, (0, _gen.LabeledStatement)(label, {
|
|
135
|
+
...object
|
|
143
136
|
}));
|
|
144
137
|
}
|
|
145
138
|
};
|
|
146
139
|
}
|
|
140
|
+
|
|
147
141
|
/**
|
|
148
142
|
* Transforms Identifiers (a.IDENTIFIER, {IDENTIFIER:...}) into string properties
|
|
149
143
|
*/
|
|
150
|
-
|
|
151
|
-
|
|
152
144
|
transformExplicitIdentifiers(object, parents) {
|
|
153
145
|
// Mark functions containing 'eval'
|
|
154
146
|
// Some transformations avoid functions that have 'eval' to not break them
|
|
155
147
|
if (object.name === "eval") {
|
|
156
148
|
var fn = (0, _insert.getFunction)(object, parents);
|
|
157
|
-
|
|
158
149
|
if (fn) {
|
|
159
150
|
fn.$requiresEval = true;
|
|
160
151
|
}
|
|
161
152
|
}
|
|
162
|
-
|
|
163
153
|
var info = (0, _identifiers.getIdentifierInfo)(object, parents);
|
|
164
|
-
|
|
165
154
|
if (info.isPropertyKey || info.isAccessor) {
|
|
166
|
-
var propIndex = parents.findIndex(x => x.type == "MethodDefinition" || x.type == "Property");
|
|
155
|
+
var propIndex = parents.findIndex(x => x.type == "MethodDefinition" || x.type == "Property");
|
|
167
156
|
|
|
157
|
+
// Don't change constructor!
|
|
168
158
|
if (propIndex !== -1) {
|
|
169
159
|
if (parents[propIndex].type == "MethodDefinition" && parents[propIndex].kind == "constructor") {
|
|
170
160
|
return;
|
|
171
161
|
}
|
|
172
162
|
}
|
|
173
|
-
|
|
174
163
|
this.replace(object, (0, _gen.Literal)(object.name));
|
|
175
164
|
parents[0].computed = true;
|
|
176
165
|
parents[0].shorthand = false;
|
|
177
166
|
}
|
|
178
167
|
}
|
|
168
|
+
|
|
179
169
|
/**
|
|
180
170
|
* Transforms VariableDeclaration into single declarations.
|
|
181
171
|
*/
|
|
182
|
-
|
|
183
|
-
|
|
184
172
|
transformExplicitDeclarations(object, parents) {
|
|
185
173
|
// for ( var x in ... ) {...}
|
|
186
174
|
var forIndex = parents.findIndex(x => x.type == "ForInStatement" || x.type == "ForOfStatement");
|
|
187
|
-
|
|
188
175
|
if (forIndex != -1 && parents[forIndex].left == (parents[forIndex - 1] || object)) {
|
|
189
176
|
object.declarations.forEach(x => {
|
|
190
177
|
x.init = null;
|
|
191
178
|
});
|
|
192
179
|
return;
|
|
193
180
|
}
|
|
194
|
-
|
|
195
181
|
var body = parents[0];
|
|
196
|
-
|
|
197
182
|
if ((0, _compare.isLoop)(body) || body.type == "LabeledStatement") {
|
|
198
183
|
return;
|
|
199
184
|
}
|
|
200
|
-
|
|
201
185
|
if (body.type == "ExportNamedDeclaration") {
|
|
202
186
|
return;
|
|
203
187
|
}
|
|
204
|
-
|
|
205
188
|
if (!Array.isArray(body)) {
|
|
206
189
|
this.error(new Error("body is " + body.type));
|
|
207
190
|
}
|
|
208
|
-
|
|
209
191
|
if (object.declarations.length > 1) {
|
|
210
192
|
// Make singular
|
|
211
|
-
var index = body.indexOf(object);
|
|
212
193
|
|
|
194
|
+
var index = body.indexOf(object);
|
|
213
195
|
if (index == -1) {
|
|
214
196
|
this.error(new Error("index is -1"));
|
|
215
197
|
}
|
|
216
|
-
|
|
217
198
|
var after = object.declarations.slice(1);
|
|
218
199
|
body.splice(index + 1, 0, ...after.map(x => {
|
|
219
200
|
return {
|
|
@@ -225,7 +206,5 @@ class Preparation extends _transform.default {
|
|
|
225
206
|
object.declarations.length = 1;
|
|
226
207
|
}
|
|
227
208
|
}
|
|
228
|
-
|
|
229
209
|
}
|
|
230
|
-
|
|
231
210
|
exports.default = Preparation;
|
|
@@ -4,39 +4,28 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _order = require("../order");
|
|
9
|
-
|
|
10
8
|
var _traverse = require("../traverse");
|
|
11
|
-
|
|
12
9
|
var _compare = require("../util/compare");
|
|
13
|
-
|
|
14
10
|
var _gen = require("../util/gen");
|
|
15
|
-
|
|
16
11
|
var _insert = require("../util/insert");
|
|
17
|
-
|
|
18
12
|
var _transform = _interopRequireDefault(require("./transform"));
|
|
19
|
-
|
|
20
|
-
function
|
|
21
|
-
|
|
22
|
-
function
|
|
23
|
-
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
+
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; }
|
|
15
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
16
|
+
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); }
|
|
24
17
|
/**
|
|
25
18
|
* Renames the labels to shorter names.
|
|
26
19
|
*/
|
|
27
20
|
class RenameLabels extends _transform.default {
|
|
28
21
|
constructor(o) {
|
|
29
22
|
super(o, _order.ObfuscateOrder.RenameLabels);
|
|
30
|
-
|
|
31
23
|
_defineProperty(this, "gen", void 0);
|
|
32
|
-
|
|
33
24
|
this.gen = this.getGenerator("randomized");
|
|
34
25
|
}
|
|
35
|
-
|
|
36
26
|
match(object, parents) {
|
|
37
27
|
return object.type == "LabeledStatement";
|
|
38
28
|
}
|
|
39
|
-
|
|
40
29
|
transform(object, parents) {
|
|
41
30
|
return () => {
|
|
42
31
|
var newName = null;
|
|
@@ -47,32 +36,28 @@ class RenameLabels extends _transform.default {
|
|
|
47
36
|
function isContinuableStatement(x, stmtParents) {
|
|
48
37
|
return (0, _compare.isLoop)(x) && x.type !== "SwitchStatement";
|
|
49
38
|
}
|
|
50
|
-
|
|
51
39
|
function isBreakableStatement(x, stmtParents) {
|
|
52
40
|
return (0, _compare.isLoop)(x) || x.type == "BlockStatement" && o.label && stmtParents[0] && stmtParents[0].type == "LabeledStatement";
|
|
53
41
|
}
|
|
54
|
-
|
|
55
42
|
var fn = o.type == "ContinueStatement" ? isContinuableStatement : isBreakableStatement;
|
|
56
43
|
var labelStatement = p.find((node, i) => {
|
|
57
44
|
return fn(node, p.slice(i + 1));
|
|
58
45
|
});
|
|
59
|
-
|
|
60
46
|
if (o.label && o.label.name == object.label.name) {
|
|
61
47
|
if (object.body == labelStatement && isRemovable) {
|
|
62
48
|
// In same loop
|
|
49
|
+
|
|
63
50
|
o.label = null;
|
|
64
51
|
} else {
|
|
65
52
|
if (!newName) {
|
|
66
53
|
newName = this.gen.generate();
|
|
67
54
|
}
|
|
68
|
-
|
|
69
55
|
o.label = (0, _gen.Identifier)(newName);
|
|
70
56
|
labelNeverUsed = false;
|
|
71
57
|
}
|
|
72
58
|
}
|
|
73
59
|
}
|
|
74
60
|
});
|
|
75
|
-
|
|
76
61
|
if (newName) {
|
|
77
62
|
object.label = (0, _gen.Identifier)(newName);
|
|
78
63
|
} else if (isRemovable || labelNeverUsed) {
|
|
@@ -80,7 +65,5 @@ class RenameLabels extends _transform.default {
|
|
|
80
65
|
}
|
|
81
66
|
};
|
|
82
67
|
}
|
|
83
|
-
|
|
84
68
|
}
|
|
85
|
-
|
|
86
69
|
exports.default = RenameLabels;
|