js-confuser 1.7.1 → 1.7.2
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/CHANGELOG.md +38 -0
- package/README.md +12 -27
- package/dist/compiler.js +2 -8
- package/dist/constants.js +17 -10
- package/dist/index.js +7 -30
- package/dist/obfuscator.js +15 -62
- package/dist/options.js +21 -38
- 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 +100 -5
- package/dist/templates/crash.js +51 -9
- 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 +71 -30
- package/dist/transforms/antiTooling.js +26 -22
- package/dist/transforms/calculator.js +18 -54
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +236 -333
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +46 -25
- package/dist/transforms/deadCode.js +528 -27
- package/dist/transforms/dispatcher.js +106 -110
- 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 +8 -26
- package/dist/transforms/identifier/globalConcealing.js +35 -54
- package/dist/transforms/identifier/movedDeclarations.js +66 -38
- package/dist/transforms/identifier/renameVariables.js +29 -68
- package/dist/transforms/identifier/variableAnalysis.js +21 -48
- package/dist/transforms/lock/antiDebug.js +20 -25
- package/dist/transforms/lock/integrity.js +48 -47
- package/dist/transforms/lock/lock.js +62 -113
- package/dist/transforms/minify.js +77 -108
- package/dist/transforms/opaquePredicates.js +11 -48
- package/dist/transforms/preparation.js +17 -50
- package/dist/transforms/renameLabels.js +5 -22
- package/dist/transforms/rgf.js +93 -69
- package/dist/transforms/shuffle.js +41 -46
- package/dist/transforms/stack.js +35 -98
- package/dist/transforms/string/encoding.js +73 -27
- package/dist/transforms/string/stringCompression.js +44 -68
- package/dist/transforms/string/stringConcealing.js +125 -134
- package/dist/transforms/string/stringEncoding.js +6 -26
- package/dist/transforms/string/stringSplitting.js +5 -30
- package/dist/transforms/transform.js +50 -100
- 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 +0 -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 +5 -36
- package/dist/util/scope.js +6 -3
- package/package.json +3 -3
- package/src/constants.ts +12 -0
- package/src/options.ts +13 -0
- package/src/order.ts +2 -2
- package/src/templates/bufferToString.ts +49 -11
- package/src/templates/functionLength.ts +21 -3
- package/src/templates/globals.ts +3 -0
- package/src/templates/template.ts +85 -25
- package/src/transforms/antiTooling.ts +33 -11
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +2 -2
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +46 -10
- package/src/transforms/deadCode.ts +0 -16
- package/src/transforms/dispatcher.ts +91 -69
- package/src/transforms/es5/antiClass.ts +10 -1
- package/src/transforms/extraction/classExtraction.ts +168 -0
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +9 -10
- package/src/transforms/extraction/objectExtraction.ts +4 -15
- package/src/transforms/flatten.ts +20 -5
- package/src/transforms/identifier/globalConcealing.ts +29 -65
- package/src/transforms/identifier/movedDeclarations.ts +90 -24
- package/src/transforms/minify.ts +27 -12
- package/src/transforms/rgf.ts +94 -5
- package/src/transforms/stack.ts +12 -3
- package/src/transforms/string/encoding.ts +85 -51
- package/src/transforms/string/stringCompression.ts +5 -8
- package/src/transforms/string/stringConcealing.ts +139 -113
- package/src/transforms/string/stringEncoding.ts +1 -2
- package/src/transforms/string/stringSplitting.ts +1 -2
- package/src/transforms/transform.ts +30 -1
- package/src/util/compare.ts +39 -5
- package/src/util/gen.ts +10 -3
- package/src/util/insert.ts +17 -0
- package/src/util/scope.ts +14 -2
- package/test/code/Cash.test.ts +10 -4
- 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 +111 -55
- 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 +19 -0
- package/test/transforms/identifier/movedDeclarations.test.ts +61 -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
51
|
return (isTestExpression(object, parents) || object.type == "SwitchCase") && !parents.find(x => x.$dispatcherSkip || 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"))], (0, _template.default)(
|
|
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"))], (0, _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,14 @@ 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(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
|
-
|
|
14
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
24
15
|
/**
|
|
25
16
|
* Preparation arranges the user's code into an AST the obfuscator can easily transform.
|
|
26
17
|
*
|
|
@@ -45,23 +36,21 @@ class Preparation extends _transform.default {
|
|
|
45
36
|
constructor(o) {
|
|
46
37
|
super(o, _order.ObfuscateOrder.Preparation);
|
|
47
38
|
}
|
|
48
|
-
|
|
49
39
|
match(object, parents) {
|
|
50
40
|
return !!object.type;
|
|
51
41
|
}
|
|
52
|
-
|
|
53
42
|
transform(object, parents) {
|
|
54
43
|
// ExplicitIdentifiers
|
|
55
44
|
if (object.type === "Identifier") {
|
|
56
45
|
return this.transformExplicitIdentifiers(object, parents);
|
|
57
|
-
}
|
|
58
|
-
|
|
46
|
+
}
|
|
59
47
|
|
|
48
|
+
// ExplicitDeclarations
|
|
60
49
|
if (object.type === "VariableDeclaration") {
|
|
61
50
|
return this.transformExplicitDeclarations(object, parents);
|
|
62
|
-
}
|
|
63
|
-
|
|
51
|
+
}
|
|
64
52
|
|
|
53
|
+
// Block
|
|
65
54
|
switch (object.type) {
|
|
66
55
|
/**
|
|
67
56
|
* People use shortcuts and its harder to parse.
|
|
@@ -73,13 +62,10 @@ class Preparation extends _transform.default {
|
|
|
73
62
|
if (object.consequent.type != "BlockStatement") {
|
|
74
63
|
object.consequent = (0, _gen.BlockStatement)([(0, _insert.clone)(object.consequent)]);
|
|
75
64
|
}
|
|
76
|
-
|
|
77
65
|
if (object.alternate && object.alternate.type != "BlockStatement") {
|
|
78
66
|
object.alternate = (0, _gen.BlockStatement)([(0, _insert.clone)(object.alternate)]);
|
|
79
67
|
}
|
|
80
|
-
|
|
81
68
|
break;
|
|
82
|
-
|
|
83
69
|
case "WhileStatement":
|
|
84
70
|
case "WithStatement":
|
|
85
71
|
case "ForStatement":
|
|
@@ -88,31 +74,27 @@ class Preparation extends _transform.default {
|
|
|
88
74
|
if (object.body.type != "BlockStatement") {
|
|
89
75
|
object.body = (0, _gen.BlockStatement)([(0, _insert.clone)(object.body)]);
|
|
90
76
|
}
|
|
91
|
-
|
|
92
77
|
break;
|
|
93
|
-
|
|
94
78
|
case "ArrowFunctionExpression":
|
|
95
79
|
if (object.body.type !== "BlockStatement" && object.expression) {
|
|
96
80
|
object.body = (0, _gen.BlockStatement)([(0, _gen.ReturnStatement)((0, _insert.clone)(object.body))]);
|
|
97
81
|
object.expression = false;
|
|
98
82
|
}
|
|
99
|
-
|
|
100
83
|
break;
|
|
101
|
-
}
|
|
102
|
-
|
|
84
|
+
}
|
|
103
85
|
|
|
86
|
+
// Label
|
|
104
87
|
if ((0, _compare.isLoop)(object) || object.type == "BlockStatement" && parents[0] && parents[0].type == "LabeledStatement" && parents[0].body === object) {
|
|
105
88
|
return this.transformLabel(object, parents);
|
|
106
89
|
}
|
|
107
90
|
}
|
|
91
|
+
|
|
108
92
|
/**
|
|
109
93
|
* Ensures every break; statement has a label to point to.
|
|
110
94
|
*
|
|
111
95
|
* This is because Control Flow Flattening adds For Loops which label-less break statements point to the nearest,
|
|
112
96
|
* when they actually need to point to the original statement.
|
|
113
97
|
*/
|
|
114
|
-
|
|
115
|
-
|
|
116
98
|
transformLabel(object, parents) {
|
|
117
99
|
return () => {
|
|
118
100
|
var currentLabel = parents[0].type == "LabeledStatement" && parents[0].label.name;
|
|
@@ -122,98 +104,85 @@ class Preparation extends _transform.default {
|
|
|
122
104
|
function isContinuableStatement(x) {
|
|
123
105
|
return (0, _compare.isLoop)(x) && x.type !== "SwitchStatement";
|
|
124
106
|
}
|
|
125
|
-
|
|
126
107
|
function isBreakableStatement(x) {
|
|
127
108
|
return (0, _compare.isLoop)(x) || o.label && x.type == "BlockStatement";
|
|
128
109
|
}
|
|
129
|
-
|
|
130
110
|
var fn = o.type == "ContinueStatement" ? isContinuableStatement : isBreakableStatement;
|
|
131
111
|
var loop = p.find(fn);
|
|
132
|
-
|
|
133
112
|
if (object == loop) {
|
|
134
113
|
if (!o.label) {
|
|
135
114
|
o.label = (0, _gen.Identifier)(label);
|
|
136
115
|
}
|
|
137
116
|
}
|
|
138
117
|
}
|
|
139
|
-
});
|
|
118
|
+
});
|
|
140
119
|
|
|
120
|
+
// Append label statement as this loop has none
|
|
141
121
|
if (!currentLabel) {
|
|
142
|
-
this.replace(object, (0, _gen.LabeledStatement)(label, {
|
|
122
|
+
this.replace(object, (0, _gen.LabeledStatement)(label, {
|
|
123
|
+
...object
|
|
143
124
|
}));
|
|
144
125
|
}
|
|
145
126
|
};
|
|
146
127
|
}
|
|
128
|
+
|
|
147
129
|
/**
|
|
148
130
|
* Transforms Identifiers (a.IDENTIFIER, {IDENTIFIER:...}) into string properties
|
|
149
131
|
*/
|
|
150
|
-
|
|
151
|
-
|
|
152
132
|
transformExplicitIdentifiers(object, parents) {
|
|
153
133
|
// Mark functions containing 'eval'
|
|
154
134
|
// Some transformations avoid functions that have 'eval' to not break them
|
|
155
135
|
if (object.name === "eval") {
|
|
156
136
|
var fn = (0, _insert.getFunction)(object, parents);
|
|
157
|
-
|
|
158
137
|
if (fn) {
|
|
159
138
|
fn.$requiresEval = true;
|
|
160
139
|
}
|
|
161
140
|
}
|
|
162
|
-
|
|
163
141
|
var info = (0, _identifiers.getIdentifierInfo)(object, parents);
|
|
164
|
-
|
|
165
142
|
if (info.isPropertyKey || info.isAccessor) {
|
|
166
|
-
var propIndex = parents.findIndex(x => x.type == "MethodDefinition" || x.type == "Property");
|
|
143
|
+
var propIndex = parents.findIndex(x => x.type == "MethodDefinition" || x.type == "Property");
|
|
167
144
|
|
|
145
|
+
// Don't change constructor!
|
|
168
146
|
if (propIndex !== -1) {
|
|
169
147
|
if (parents[propIndex].type == "MethodDefinition" && parents[propIndex].kind == "constructor") {
|
|
170
148
|
return;
|
|
171
149
|
}
|
|
172
150
|
}
|
|
173
|
-
|
|
174
151
|
this.replace(object, (0, _gen.Literal)(object.name));
|
|
175
152
|
parents[0].computed = true;
|
|
176
153
|
parents[0].shorthand = false;
|
|
177
154
|
}
|
|
178
155
|
}
|
|
156
|
+
|
|
179
157
|
/**
|
|
180
158
|
* Transforms VariableDeclaration into single declarations.
|
|
181
159
|
*/
|
|
182
|
-
|
|
183
|
-
|
|
184
160
|
transformExplicitDeclarations(object, parents) {
|
|
185
161
|
// for ( var x in ... ) {...}
|
|
186
162
|
var forIndex = parents.findIndex(x => x.type == "ForInStatement" || x.type == "ForOfStatement");
|
|
187
|
-
|
|
188
163
|
if (forIndex != -1 && parents[forIndex].left == (parents[forIndex - 1] || object)) {
|
|
189
164
|
object.declarations.forEach(x => {
|
|
190
165
|
x.init = null;
|
|
191
166
|
});
|
|
192
167
|
return;
|
|
193
168
|
}
|
|
194
|
-
|
|
195
169
|
var body = parents[0];
|
|
196
|
-
|
|
197
170
|
if ((0, _compare.isLoop)(body) || body.type == "LabeledStatement") {
|
|
198
171
|
return;
|
|
199
172
|
}
|
|
200
|
-
|
|
201
173
|
if (body.type == "ExportNamedDeclaration") {
|
|
202
174
|
return;
|
|
203
175
|
}
|
|
204
|
-
|
|
205
176
|
if (!Array.isArray(body)) {
|
|
206
177
|
this.error(new Error("body is " + body.type));
|
|
207
178
|
}
|
|
208
|
-
|
|
209
179
|
if (object.declarations.length > 1) {
|
|
210
180
|
// Make singular
|
|
211
|
-
var index = body.indexOf(object);
|
|
212
181
|
|
|
182
|
+
var index = body.indexOf(object);
|
|
213
183
|
if (index == -1) {
|
|
214
184
|
this.error(new Error("index is -1"));
|
|
215
185
|
}
|
|
216
|
-
|
|
217
186
|
var after = object.declarations.slice(1);
|
|
218
187
|
body.splice(index + 1, 0, ...after.map(x => {
|
|
219
188
|
return {
|
|
@@ -225,7 +194,5 @@ class Preparation extends _transform.default {
|
|
|
225
194
|
object.declarations.length = 1;
|
|
226
195
|
}
|
|
227
196
|
}
|
|
228
|
-
|
|
229
197
|
}
|
|
230
|
-
|
|
231
198
|
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;
|