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
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _assert = require("assert");
|
|
9
|
-
|
|
10
|
-
var _order = require("../../order");
|
|
11
|
-
|
|
12
|
-
var _probability = require("../../probability");
|
|
13
|
-
|
|
14
|
-
var _traverse = require("../../traverse");
|
|
15
|
-
|
|
16
|
-
var _gen = require("../../util/gen");
|
|
17
|
-
|
|
18
|
-
var _identifiers = require("../../util/identifiers");
|
|
19
|
-
|
|
20
|
-
var _insert = require("../../util/insert");
|
|
21
|
-
|
|
22
|
-
var _transform = _interopRequireDefault(require("../transform"));
|
|
23
|
-
|
|
24
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Statement-based variable recycling.
|
|
28
|
-
*
|
|
29
|
-
* ```js
|
|
30
|
-
* // Input
|
|
31
|
-
* function percentage(decimal) {
|
|
32
|
-
* var multiplied = x * 100;
|
|
33
|
-
* var floored = Math.floor(multiplied);
|
|
34
|
-
* var output = floored + "%"
|
|
35
|
-
* return output;
|
|
36
|
-
* }
|
|
37
|
-
*
|
|
38
|
-
* // Output
|
|
39
|
-
* function percentage(decimal) {
|
|
40
|
-
* var multiplied = x * 100;
|
|
41
|
-
* var floored = Math.floor(multiplied);
|
|
42
|
-
* multiplied = floored + "%";
|
|
43
|
-
* return multiplied;
|
|
44
|
-
* }
|
|
45
|
-
* ```
|
|
46
|
-
*/
|
|
47
|
-
class NameRecycling extends _transform.default {
|
|
48
|
-
constructor(o) {
|
|
49
|
-
super(o, _order.ObfuscateOrder.NameRecycling);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
match(object, parents) {
|
|
53
|
-
return (0, _traverse.isBlock)(object);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
transform(object, parents) {
|
|
57
|
-
return () => {
|
|
58
|
-
if ((0, _identifiers.containsLexicallyBoundVariables)(object, parents)) {
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
var context = (0, _insert.getVarContext)(object, parents);
|
|
63
|
-
var stmts = [...object.body];
|
|
64
|
-
(0, _assert.ok)(Array.isArray(stmts));
|
|
65
|
-
var definedMap = new Map();
|
|
66
|
-
var referencedMap = new Map();
|
|
67
|
-
var nodeMap = new Map();
|
|
68
|
-
var lastReferenceMap = new Map();
|
|
69
|
-
var defined = new Set();
|
|
70
|
-
var illegal = new Set();
|
|
71
|
-
var fn = (0, _insert.isFunction)(parents[0]) ? parents[0] : null;
|
|
72
|
-
|
|
73
|
-
if (fn) {
|
|
74
|
-
definedMap.set(-1, new Set((0, _identifiers.getFunctionParameters)(fn, parents.slice(1)).map(x => x[0].name)));
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
stmts.forEach((stmt, i) => {
|
|
78
|
-
var definedHere = new Set();
|
|
79
|
-
var referencedHere = new Set();
|
|
80
|
-
var nodesHere = new Map();
|
|
81
|
-
(0, _traverse.walk)(stmt, [object.body, object, ...parents], (o, p) => {
|
|
82
|
-
if (o.type == "Identifier") {
|
|
83
|
-
return () => {
|
|
84
|
-
var info = (0, _identifiers.getIdentifierInfo)(o, p);
|
|
85
|
-
|
|
86
|
-
if (!info.spec.isReferenced) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
var comparingContext = info.spec.isDefined ? (0, _insert.getDefiningContext)(o, p) : (0, _insert.getReferencingContexts)(o, p).find(x => (0, _insert.isVarContext)(x));
|
|
91
|
-
|
|
92
|
-
if (comparingContext !== context) {
|
|
93
|
-
illegal.add(o.name);
|
|
94
|
-
this.log(o.name, "is different context");
|
|
95
|
-
} else {
|
|
96
|
-
if (!nodesHere.has(o.name)) {
|
|
97
|
-
nodesHere.set(o.name, [[o, p]]);
|
|
98
|
-
} else {
|
|
99
|
-
nodesHere.get(o.name).push([o, p]);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
if (info.spec.isDefined) {
|
|
103
|
-
// Function Declarations can be used before they're defined, if so, don't change this
|
|
104
|
-
if (info.isFunctionDeclaration && lastReferenceMap.has(o.name)) {
|
|
105
|
-
illegal.add(o.name);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (defined.has(o.name) || (0, _traverse.getBlock)(o, p) !== object || info.isImportSpecifier) {
|
|
109
|
-
illegal.add(o.name);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
defined.add(o.name);
|
|
113
|
-
definedHere.add(o.name);
|
|
114
|
-
} else {
|
|
115
|
-
referencedHere.add(o.name);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
lastReferenceMap.set(o.name, i);
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
}); // console.log(i, definedHere);
|
|
123
|
-
|
|
124
|
-
definedMap.set(i, definedHere);
|
|
125
|
-
referencedMap.set(i, referencedHere);
|
|
126
|
-
nodeMap.set(i, nodesHere);
|
|
127
|
-
});
|
|
128
|
-
this.log(illegal);
|
|
129
|
-
illegal.forEach(name => {
|
|
130
|
-
nodeMap.forEach(value => {
|
|
131
|
-
value.delete(name);
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
var available = new Set();
|
|
135
|
-
var newNames = Object.create(null);
|
|
136
|
-
stmts.forEach((stmt, i) => {
|
|
137
|
-
var nodes = nodeMap.get(i);
|
|
138
|
-
nodes.forEach((locations, name) => {
|
|
139
|
-
var newName = newNames[name];
|
|
140
|
-
|
|
141
|
-
if (!newName) {
|
|
142
|
-
var canChange = false;
|
|
143
|
-
|
|
144
|
-
if (object.type == "Program" && !(0, _probability.ComputeProbabilityMap)(this.options.renameGlobals, x => x, name)) {
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
if (defined.has(name) && definedMap.get(i).has(name)) {
|
|
149
|
-
canChange = true;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
if (!canChange) {
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
if (available.size) {
|
|
157
|
-
newName = available.keys().next().value;
|
|
158
|
-
available.delete(newName);
|
|
159
|
-
(0, _assert.ok)(name !== newName);
|
|
160
|
-
newNames[name] = newName;
|
|
161
|
-
defined.delete(name);
|
|
162
|
-
this.log(name, "->", newName);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
nodes.forEach((locations, name) => {
|
|
167
|
-
var newName = newNames[name];
|
|
168
|
-
|
|
169
|
-
if (newName) {
|
|
170
|
-
locations.forEach(_ref => {
|
|
171
|
-
let [object, parents] = _ref;
|
|
172
|
-
object.name = newName;
|
|
173
|
-
var declaratorIndex = parents.findIndex(p => p.type == "VariableDeclarator");
|
|
174
|
-
|
|
175
|
-
if (declaratorIndex !== -1 && parents[declaratorIndex].id === (parents[declaratorIndex - 1] || object)) {
|
|
176
|
-
var value = parents[declaratorIndex].init || (0, _gen.Identifier)("undefined");
|
|
177
|
-
var expr = (0, _gen.AssignmentExpression)("=", parents[declaratorIndex].id, value);
|
|
178
|
-
|
|
179
|
-
if (parents[declaratorIndex + 1].length === 1) {
|
|
180
|
-
if ((0, _insert.isForInitialize)(parents[declaratorIndex + 2], parents.slice(3))) {
|
|
181
|
-
this.replace(parents[declaratorIndex + 2], expr);
|
|
182
|
-
} else {
|
|
183
|
-
this.replace(parents[declaratorIndex + 2], (0, _gen.ExpressionStatement)(expr));
|
|
184
|
-
}
|
|
185
|
-
} else {
|
|
186
|
-
this.replace(parents[declaratorIndex], (0, _gen.VariableDeclarator)(this.getPlaceholder(), expr));
|
|
187
|
-
}
|
|
188
|
-
} else {
|
|
189
|
-
if (parents[0].type == "FunctionDeclaration") {
|
|
190
|
-
this.replace(parents[0], (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(newName), { ...parents[0],
|
|
191
|
-
type: "FunctionExpression",
|
|
192
|
-
id: null
|
|
193
|
-
})));
|
|
194
|
-
} else if (parents[0].type == "ClassDeclaration") {
|
|
195
|
-
this.replace(parents[0], (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(newName), { ...parents[0],
|
|
196
|
-
type: "ClassExpression"
|
|
197
|
-
})));
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
if (defined.has(name)) {
|
|
204
|
-
var lastRef = lastReferenceMap.get(name);
|
|
205
|
-
var isDecommissioned = lastRef === i;
|
|
206
|
-
|
|
207
|
-
if (isDecommissioned) {
|
|
208
|
-
available.add(name);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
});
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
exports.default = NameRecycling;
|
package/dist/transforms/label.js
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _transform = _interopRequireDefault(require("./transform"));
|
|
9
|
-
|
|
10
|
-
var _gen = require("../util/gen");
|
|
11
|
-
|
|
12
|
-
var _traverse = require("../traverse");
|
|
13
|
-
|
|
14
|
-
var _compare = require("../util/compare");
|
|
15
|
-
|
|
16
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Ensures every break; statement has a label to point to.
|
|
20
|
-
*
|
|
21
|
-
* This is because Control Flow Flattening adds For Loops which label-less break statements point to the nearest,
|
|
22
|
-
* when they actually need to point to the original statement.
|
|
23
|
-
*/
|
|
24
|
-
class Label extends _transform.default {
|
|
25
|
-
constructor(o) {
|
|
26
|
-
super(o);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
match(object, parents) {
|
|
30
|
-
return (0, _compare.isLoop)(object) || object.type == "BlockStatement" && parents[0] && parents[0].type == "LabeledStatement" && parents[0].body === object;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
transform(object, parents) {
|
|
34
|
-
return () => {
|
|
35
|
-
var currentLabel = parents[0].type == "LabeledStatement" && parents[0].label.name;
|
|
36
|
-
var label = currentLabel || this.getPlaceholder();
|
|
37
|
-
(0, _traverse.walk)(object, parents, (o, p) => {
|
|
38
|
-
if (o.type == "BreakStatement" || o.type == "ContinueStatement") {
|
|
39
|
-
function isContinuableStatement(x) {
|
|
40
|
-
return (0, _compare.isLoop)(x) && x.type !== "SwitchStatement";
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function isBreakableStatement(x) {
|
|
44
|
-
return (0, _compare.isLoop)(x) || o.label && x.type == "BlockStatement";
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
var fn = o.type == "ContinueStatement" ? isContinuableStatement : isBreakableStatement;
|
|
48
|
-
var loop = p.find(fn);
|
|
49
|
-
|
|
50
|
-
if (object == loop) {
|
|
51
|
-
if (!o.label) {
|
|
52
|
-
o.label = (0, _gen.Identifier)(label);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}); // Append label statement as this loop has none
|
|
57
|
-
|
|
58
|
-
if (!currentLabel) {
|
|
59
|
-
this.replace(object, (0, _gen.LabeledStatement)(label, { ...object
|
|
60
|
-
}));
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
exports.default = Label;
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = exports.NameMappingAnalysis = void 0;
|
|
7
|
-
|
|
8
|
-
var _constants = require("../../constants");
|
|
9
|
-
|
|
10
|
-
var _identifiers = require("../../util/identifiers");
|
|
11
|
-
|
|
12
|
-
var _transform = _interopRequireDefault(require("../transform"));
|
|
13
|
-
|
|
14
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
-
|
|
16
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
17
|
-
|
|
18
|
-
class NameMappingAnalysis extends _transform.default {
|
|
19
|
-
constructor(o) {
|
|
20
|
-
super(o);
|
|
21
|
-
|
|
22
|
-
_defineProperty(this, "names", void 0);
|
|
23
|
-
|
|
24
|
-
this.names = new Map();
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
match(object, parents) {
|
|
28
|
-
return object.type == "Identifier" && !_constants.reservedIdentifiers.has(object.name);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
transform(object, parents) {
|
|
32
|
-
var info = (0, _identifiers.getIdentifierInfo)(object, parents);
|
|
33
|
-
|
|
34
|
-
if (info.spec.isReferenced && !info.spec.isDefined) {
|
|
35
|
-
object.$definedAt = (0, _identifiers.getDefiningIdentifier)(object, parents);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (info.spec.isDefined) {
|
|
39
|
-
if (!this.names.has(object.name)) {
|
|
40
|
-
this.names.set(object.name, new Set([object]));
|
|
41
|
-
} else {
|
|
42
|
-
this.names.get(object.name).add(object);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Renames variables & removes conflicts.
|
|
50
|
-
*
|
|
51
|
-
* - This helps transformations like `Dispatcher` not replace re-declared identifiers.
|
|
52
|
-
*/
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
exports.NameMappingAnalysis = NameMappingAnalysis;
|
|
56
|
-
|
|
57
|
-
class NameConflicts extends _transform.default {
|
|
58
|
-
constructor(o) {
|
|
59
|
-
super(o);
|
|
60
|
-
|
|
61
|
-
_defineProperty(this, "nameMappingAnalysis", void 0);
|
|
62
|
-
|
|
63
|
-
_defineProperty(this, "changes", void 0);
|
|
64
|
-
|
|
65
|
-
_defineProperty(this, "references", void 0);
|
|
66
|
-
|
|
67
|
-
this.before.push(this.nameMappingAnalysis = new NameMappingAnalysis(o));
|
|
68
|
-
this.changes = new Map();
|
|
69
|
-
this.references = new Map();
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
match(object, parents) {
|
|
73
|
-
return object.type == "Identifier" && !_constants.reservedIdentifiers.has(object.name) && !this.options.globalVariables.has(object.name);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
transform(object, parents) {
|
|
77
|
-
var info = (0, _identifiers.getIdentifierInfo)(object, parents);
|
|
78
|
-
|
|
79
|
-
if (info.isMethodDefinition) {
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (object.$definedAt) {
|
|
84
|
-
object.name = this.changes.get(object.$definedAt[0]) || object.name;
|
|
85
|
-
|
|
86
|
-
if (!this.references.has(object.$definedAt[0])) {
|
|
87
|
-
this.references.set(object.$definedAt[0], new Set([object]));
|
|
88
|
-
} else {
|
|
89
|
-
this.references.get(object.$definedAt[0]).add(object);
|
|
90
|
-
}
|
|
91
|
-
} else if (info.spec.isDefined) {
|
|
92
|
-
var set = this.nameMappingAnalysis.names.get(object.name);
|
|
93
|
-
|
|
94
|
-
if (set && set.size > 1) {
|
|
95
|
-
var index = Array.from(set).indexOf(object);
|
|
96
|
-
var newName = "_".repeat(index) + object.name;
|
|
97
|
-
|
|
98
|
-
if (index > 4 || this.nameMappingAnalysis.names.has(newName)) {
|
|
99
|
-
newName = this.getPlaceholder() + "_" + object.name;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
object.name = newName;
|
|
103
|
-
this.changes.set(object, newName);
|
|
104
|
-
|
|
105
|
-
if (this.references.has(object)) {
|
|
106
|
-
this.references.get(object).forEach(ref => {
|
|
107
|
-
ref.name = newName;
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
exports.default = NameConflicts;
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _transform = _interopRequireDefault(require("../transform"));
|
|
9
|
-
|
|
10
|
-
var _gen = require("../../util/gen");
|
|
11
|
-
|
|
12
|
-
var _order = require("../../order");
|
|
13
|
-
|
|
14
|
-
var _insert = require("../../util/insert");
|
|
15
|
-
|
|
16
|
-
var _identifiers = require("../../util/identifiers");
|
|
17
|
-
|
|
18
|
-
var _label = _interopRequireDefault(require("../label"));
|
|
19
|
-
|
|
20
|
-
var _compare = require("../../util/compare");
|
|
21
|
-
|
|
22
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* The file contains all preparation transformations
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* People use shortcuts and its harder to parse.
|
|
30
|
-
*
|
|
31
|
-
* - `if (a) b()` -> `if (a) { b() }`
|
|
32
|
-
* - Ensures all bodies are `BlockStatement`, not individual expression statements
|
|
33
|
-
*/
|
|
34
|
-
class Block extends _transform.default {
|
|
35
|
-
constructor(o) {
|
|
36
|
-
super(o);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
match(object, parents) {
|
|
40
|
-
return !Array.isArray(object);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
transform(object, parents) {
|
|
44
|
-
switch (object.type) {
|
|
45
|
-
case "IfStatement":
|
|
46
|
-
if (object.consequent.type != "BlockStatement") {
|
|
47
|
-
object.consequent = (0, _gen.BlockStatement)([(0, _insert.clone)(object.consequent)]);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if (object.alternate && object.alternate.type != "BlockStatement") {
|
|
51
|
-
object.alternate = (0, _gen.BlockStatement)([(0, _insert.clone)(object.alternate)]);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
break;
|
|
55
|
-
|
|
56
|
-
case "WhileStatement":
|
|
57
|
-
case "WithStatement":
|
|
58
|
-
case "ForStatement":
|
|
59
|
-
case "ForOfStatement":
|
|
60
|
-
case "ForInStatement":
|
|
61
|
-
if (object.body.type != "BlockStatement") {
|
|
62
|
-
object.body = (0, _gen.BlockStatement)([(0, _insert.clone)(object.body)]);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
break;
|
|
66
|
-
|
|
67
|
-
case "ArrowFunctionExpression":
|
|
68
|
-
if (object.body.type !== "BlockStatement" && object.expression) {
|
|
69
|
-
object.body = (0, _gen.BlockStatement)([(0, _gen.ReturnStatement)((0, _insert.clone)(object.body))]);
|
|
70
|
-
object.expression = false;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
break;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
class ExplicitIdentifiers extends _transform.default {
|
|
80
|
-
constructor(o) {
|
|
81
|
-
super(o);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
match(object, parents) {
|
|
85
|
-
return object.type == "Identifier";
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
transform(object, parents) {
|
|
89
|
-
if (object.name === "eval") {
|
|
90
|
-
var fn = (0, _insert.getFunction)(object, parents);
|
|
91
|
-
|
|
92
|
-
if (fn) {
|
|
93
|
-
fn.$requiresEval = true;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
var info = (0, _identifiers.getIdentifierInfo)(object, parents);
|
|
98
|
-
|
|
99
|
-
if (info.isPropertyKey || info.isAccessor) {
|
|
100
|
-
var propIndex = parents.findIndex(x => x.type == "MethodDefinition" || x.type == "Property");
|
|
101
|
-
|
|
102
|
-
if (propIndex !== -1) {
|
|
103
|
-
if (parents[propIndex].type == "MethodDefinition" && parents[propIndex].kind == "constructor") {
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
} // this.log(object.name, "->", `'${object.name}'`);
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
this.replace(object, (0, _gen.Literal)(object.name));
|
|
110
|
-
parents[0].computed = true;
|
|
111
|
-
parents[0].shorthand = false;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
class ExplicitDeclarations extends _transform.default {
|
|
118
|
-
constructor(o) {
|
|
119
|
-
super(o);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
match(object, parents) {
|
|
123
|
-
return object.type == "VariableDeclaration";
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
transform(object, parents) {
|
|
127
|
-
// for ( var x in ... ) {...}
|
|
128
|
-
var forIndex = parents.findIndex(x => x.type == "ForInStatement" || x.type == "ForOfStatement");
|
|
129
|
-
|
|
130
|
-
if (forIndex != -1 && parents[forIndex].left == (parents[forIndex - 1] || object)) {
|
|
131
|
-
object.declarations.forEach(x => {
|
|
132
|
-
x.init = null;
|
|
133
|
-
});
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
var body = parents[0];
|
|
138
|
-
|
|
139
|
-
if ((0, _compare.isLoop)(body) || body.type == "LabeledStatement") {
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
if (body.type == "ExportNamedDeclaration") {
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
if (!Array.isArray(body)) {
|
|
148
|
-
this.error(new Error("body is " + body.type));
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
if (object.declarations.length > 1) {
|
|
152
|
-
// Make singular
|
|
153
|
-
var index = body.indexOf(object);
|
|
154
|
-
|
|
155
|
-
if (index == -1) {
|
|
156
|
-
this.error(new Error("index is -1"));
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
var after = object.declarations.slice(1);
|
|
160
|
-
body.splice(index + 1, 0, ...after.map(x => {
|
|
161
|
-
return {
|
|
162
|
-
type: "VariableDeclaration",
|
|
163
|
-
declarations: [(0, _insert.clone)(x)],
|
|
164
|
-
kind: object.kind
|
|
165
|
-
};
|
|
166
|
-
}));
|
|
167
|
-
object.declarations.length = 1;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
class Preparation extends _transform.default {
|
|
174
|
-
constructor(o) {
|
|
175
|
-
super(o, _order.ObfuscateOrder.Preparation);
|
|
176
|
-
this.before.push(new Block(o));
|
|
177
|
-
this.before.push(new _label.default(o));
|
|
178
|
-
this.before.push(new ExplicitIdentifiers(o));
|
|
179
|
-
this.before.push(new ExplicitDeclarations(o));
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
match() {
|
|
183
|
-
return false;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
exports.default = Preparation;
|