js-confuser 1.7.0 → 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 +57 -0
- package/README.md +12 -29
- 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 +110 -108
- 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 +45 -79
- package/dist/transforms/extraction/objectExtraction.js +27 -54
- 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 +98 -66
- 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 +11 -74
- 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/docs/ControlFlowFlattening.md +1 -1
- package/docs/ES5.md +197 -0
- 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 +101 -69
- package/src/transforms/es5/antiClass.ts +10 -1
- package/src/transforms/extraction/classExtraction.ts +168 -0
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +13 -10
- package/src/transforms/extraction/objectExtraction.ts +7 -14
- 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 +103 -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/identifiers.ts +6 -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 +82 -0
- package/test/transforms/extraction/classExtraction.test.ts +86 -0
- package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +29 -8
- package/test/transforms/extraction/objectExtraction.test.ts +37 -15
- package/test/transforms/identifier/globalConcealing.test.ts +42 -2
- package/test/transforms/identifier/movedDeclarations.test.ts +61 -0
- package/test/transforms/lock/integrity.test.ts +24 -0
- package/test/transforms/minify.test.ts +37 -0
- package/test/transforms/rgf.test.ts +50 -0
- package/test/util/identifiers.test.ts +21 -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,21 +4,13 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _assert = require("assert");
|
|
9
|
-
|
|
10
8
|
var _template = _interopRequireDefault(require("../../templates/template"));
|
|
11
|
-
|
|
12
9
|
var _traverse = require("../../traverse");
|
|
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 _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
-
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
22
14
|
/**
|
|
23
15
|
* Removes destructuring from function parameters.
|
|
24
16
|
*
|
|
@@ -45,27 +37,25 @@ class AntiDestructuringParameters extends _transform.default {
|
|
|
45
37
|
constructor(o) {
|
|
46
38
|
super(o);
|
|
47
39
|
}
|
|
48
|
-
|
|
49
40
|
match(object, parents) {
|
|
50
41
|
return (object.param || object.params) && object.body;
|
|
51
42
|
}
|
|
52
|
-
|
|
53
43
|
transform(object, parents) {
|
|
54
44
|
return () => {
|
|
55
45
|
if (object.param) {
|
|
56
46
|
// Catch clause
|
|
57
47
|
if (object.param.type != "Identifier") {
|
|
58
48
|
var catchName = this.getPlaceholder();
|
|
59
|
-
var cloned = {
|
|
49
|
+
var cloned = {
|
|
50
|
+
...object.param
|
|
60
51
|
};
|
|
61
52
|
object.param = (0, _gen.Identifier)(catchName);
|
|
62
53
|
(0, _insert.getBlockBody)(object.body).unshift((0, _gen.VariableDeclaration)([(0, _gen.VariableDeclarator)(cloned, (0, _gen.Identifier)(catchName))]));
|
|
63
54
|
}
|
|
64
|
-
|
|
65
55
|
return;
|
|
66
|
-
}
|
|
67
|
-
|
|
56
|
+
}
|
|
68
57
|
|
|
58
|
+
// For function parameters
|
|
69
59
|
var isDestructed = false;
|
|
70
60
|
var parameters = object.params;
|
|
71
61
|
(0, _traverse.walk)(parameters, [object, ...parents], (o, p) => {
|
|
@@ -74,26 +64,27 @@ class AntiDestructuringParameters extends _transform.default {
|
|
|
74
64
|
return "EXIT";
|
|
75
65
|
}
|
|
76
66
|
});
|
|
77
|
-
|
|
78
67
|
if (isDestructed) {
|
|
79
68
|
if (object.expression) {
|
|
80
|
-
object.body = (0, _gen.BlockStatement)([(0, _gen.ReturnStatement)({
|
|
69
|
+
object.body = (0, _gen.BlockStatement)([(0, _gen.ReturnStatement)({
|
|
70
|
+
...object.body
|
|
81
71
|
})]);
|
|
82
72
|
} else if (object.body.type != "BlockStatement") {
|
|
83
|
-
object.body = (0, _gen.BlockStatement)([{
|
|
73
|
+
object.body = (0, _gen.BlockStatement)([{
|
|
74
|
+
...object.body
|
|
84
75
|
}]);
|
|
85
76
|
}
|
|
77
|
+
var arrayPattern = (0, _gen.ArrayPattern)(parameters);
|
|
86
78
|
|
|
87
|
-
|
|
88
|
-
|
|
79
|
+
// `arguments` is not allowed in arrow functions
|
|
89
80
|
if (object.type == "ArrowFunctionExpression" && !object.params.find(x => x.type == "RestElement")) {
|
|
90
81
|
// new names
|
|
82
|
+
|
|
91
83
|
object.params = Array(object.params.length).fill(0).map(() => (0, _gen.Identifier)(this.getPlaceholder()));
|
|
92
84
|
(0, _insert.getBlockBody)(object.body).unshift((0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(arrayPattern, (0, _gen.ArrayExpression)(object.params))));
|
|
93
85
|
} else {
|
|
94
86
|
object.params = [];
|
|
95
|
-
(0, _insert.getBlockBody)(object.body).unshift((0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(arrayPattern, (0, _template.default)(
|
|
96
|
-
|
|
87
|
+
(0, _insert.getBlockBody)(object.body).unshift((0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(arrayPattern, (0, _template.default)(`Array.prototype.slice.call(arguments)`).single().expression)));
|
|
97
88
|
if (object.type == "ArrowFunctionExpression") {
|
|
98
89
|
object.type = "FunctionExpression";
|
|
99
90
|
object.expression = false;
|
|
@@ -103,23 +94,19 @@ class AntiDestructuringParameters extends _transform.default {
|
|
|
103
94
|
}
|
|
104
95
|
};
|
|
105
96
|
}
|
|
106
|
-
|
|
107
97
|
}
|
|
98
|
+
|
|
108
99
|
/**
|
|
109
100
|
* Removes destructuring so the script can work in ES5 environments.
|
|
110
101
|
*/
|
|
111
|
-
|
|
112
|
-
|
|
113
102
|
class AntiDestructuring extends _transform.default {
|
|
114
103
|
constructor(o) {
|
|
115
104
|
super(o);
|
|
116
105
|
this.before.push(new AntiDestructuringParameters(o));
|
|
117
106
|
}
|
|
118
|
-
|
|
119
107
|
match(object, parents) {
|
|
120
108
|
return object.type == "AssignmentExpression" || object.type == "VariableDeclarator";
|
|
121
109
|
}
|
|
122
|
-
|
|
123
110
|
transform(object, parents) {
|
|
124
111
|
var block = (0, _traverse.getBlock)(object, parents);
|
|
125
112
|
var body = (0, _insert.getBlockBody)(block);
|
|
@@ -128,9 +115,7 @@ class AntiDestructuring extends _transform.default {
|
|
|
128
115
|
var names = new Set();
|
|
129
116
|
var operator = "=";
|
|
130
117
|
var id = null; // The object being set
|
|
131
|
-
|
|
132
118
|
var extracting = null; // The object being extracted from
|
|
133
|
-
|
|
134
119
|
if (object.type == "AssignmentExpression") {
|
|
135
120
|
id = object.left;
|
|
136
121
|
extracting = object.right;
|
|
@@ -141,20 +126,16 @@ class AntiDestructuring extends _transform.default {
|
|
|
141
126
|
} else {
|
|
142
127
|
(0, _assert.ok)(false);
|
|
143
128
|
}
|
|
144
|
-
|
|
145
129
|
var should = false;
|
|
146
130
|
(0, _traverse.walk)(id, [], (o, p) => {
|
|
147
131
|
if (o.type && o.type.includes("Pattern")) {
|
|
148
132
|
should = true;
|
|
149
133
|
}
|
|
150
134
|
});
|
|
151
|
-
|
|
152
135
|
if (should) {
|
|
153
136
|
(0, _insert.prepend)(block, (0, _gen.VariableDeclaration)([(0, _gen.VariableDeclarator)((0, _gen.Identifier)(temp))]));
|
|
154
|
-
|
|
155
137
|
const recursive = (x, realm) => {
|
|
156
138
|
realm = (0, _insert.clone)(realm);
|
|
157
|
-
|
|
158
139
|
if (x.type == "Identifier") {
|
|
159
140
|
exprs.push((0, _gen.AssignmentExpression)(operator, (0, _insert.clone)(x), realm));
|
|
160
141
|
names.add(x.name);
|
|
@@ -171,7 +152,6 @@ class AntiDestructuring extends _transform.default {
|
|
|
171
152
|
if (i != x.elements.length - 1) {
|
|
172
153
|
this.error(new Error("Uncaught SyntaxError: Rest element must be last element"));
|
|
173
154
|
}
|
|
174
|
-
|
|
175
155
|
recursive(element.argument, (0, _gen.CallExpression)((0, _gen.MemberExpression)(realm, (0, _gen.Identifier)("slice"), false), [(0, _gen.Literal)(i)]));
|
|
176
156
|
} else {
|
|
177
157
|
recursive(element, (0, _gen.MemberExpression)(realm, (0, _gen.Literal)(i), true));
|
|
@@ -185,11 +165,9 @@ class AntiDestructuring extends _transform.default {
|
|
|
185
165
|
throw new Error("unknown type: " + x.type);
|
|
186
166
|
}
|
|
187
167
|
};
|
|
188
|
-
|
|
189
168
|
recursive(id, (0, _gen.Identifier)(temp));
|
|
190
169
|
return () => {
|
|
191
170
|
var seq = (0, _gen.SequenceExpression)([(0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(temp), (0, _insert.clone)(extracting) || (0, _gen.Identifier)("undefined")), ...exprs]);
|
|
192
|
-
|
|
193
171
|
if (object.type == "VariableDeclarator") {
|
|
194
172
|
var i = (0, _insert.getIndexDirect)(object, parents[0]);
|
|
195
173
|
var extra = Array.from(names).map(x => {
|
|
@@ -211,7 +189,5 @@ class AntiDestructuring extends _transform.default {
|
|
|
211
189
|
};
|
|
212
190
|
}
|
|
213
191
|
}
|
|
214
|
-
|
|
215
192
|
}
|
|
216
|
-
|
|
217
193
|
exports.default = AntiDestructuring;
|
|
@@ -4,41 +4,35 @@ 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 _insert = require("../../util/insert");
|
|
13
|
-
|
|
14
10
|
var _traverse = require("../../traverse");
|
|
15
|
-
|
|
16
11
|
var _template = _interopRequireDefault(require("../../templates/template"));
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
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; }
|
|
14
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
15
|
+
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); }
|
|
16
|
+
var HelperFunctions = (0, _template.default)(`
|
|
17
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
17
18
|
|
|
18
|
-
function
|
|
19
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
19
20
|
|
|
20
21
|
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; }
|
|
21
|
-
|
|
22
|
-
var HelperFunctions = (0, _template.default)("\n function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _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; }\n ");
|
|
23
|
-
|
|
22
|
+
`);
|
|
24
23
|
class AntiSpread extends _transform.default {
|
|
25
24
|
constructor(o) {
|
|
26
25
|
super(o);
|
|
27
|
-
|
|
28
26
|
_defineProperty(this, "helper", void 0);
|
|
29
|
-
|
|
30
27
|
this.helper = false;
|
|
31
28
|
}
|
|
32
|
-
|
|
33
29
|
match(object, parents) {
|
|
34
30
|
return object.type == "ObjectExpression" || object.type == "ArrayExpression";
|
|
35
31
|
}
|
|
36
|
-
|
|
37
32
|
transform(object, parents) {
|
|
38
33
|
return () => {
|
|
39
34
|
if (object.type == "ArrayExpression") {
|
|
40
35
|
var spreadIndex = object.elements.findIndex(x => x.type == "SpreadElement");
|
|
41
|
-
|
|
42
36
|
if (spreadIndex !== -1) {
|
|
43
37
|
var after = object.elements.slice(spreadIndex);
|
|
44
38
|
var groups = [];
|
|
@@ -49,11 +43,9 @@ class AntiSpread extends _transform.default {
|
|
|
49
43
|
if (!groups.length) {
|
|
50
44
|
groups.push((0, _gen.ArrayExpression)([]));
|
|
51
45
|
}
|
|
52
|
-
|
|
53
46
|
if (groups[groups.length - 1].type != "ArrayExpression") {
|
|
54
47
|
groups.push((0, _gen.ArrayExpression)([]));
|
|
55
48
|
}
|
|
56
|
-
|
|
57
49
|
groups[groups.length - 1].elements.push(element);
|
|
58
50
|
}
|
|
59
51
|
});
|
|
@@ -64,24 +56,20 @@ class AntiSpread extends _transform.default {
|
|
|
64
56
|
}
|
|
65
57
|
} else if (object.type == "ObjectExpression") {
|
|
66
58
|
var spreadIndex;
|
|
67
|
-
|
|
68
59
|
while (true) {
|
|
69
60
|
spreadIndex = object.properties.findIndex(x => x.type == "SpreadElement");
|
|
70
|
-
|
|
71
61
|
if (spreadIndex === -1) {
|
|
72
62
|
break;
|
|
73
|
-
}
|
|
74
|
-
|
|
63
|
+
}
|
|
75
64
|
|
|
65
|
+
// add helper functions only once
|
|
76
66
|
if (!this.helper) {
|
|
77
67
|
this.helper = true;
|
|
78
68
|
(0, _insert.prepend)(parents[parents.length - 1], ...HelperFunctions.compile());
|
|
79
69
|
}
|
|
80
|
-
|
|
81
70
|
var before = object.properties.slice(0, spreadIndex);
|
|
82
71
|
var after = object.properties.slice(spreadIndex + 1);
|
|
83
72
|
var call = (0, _gen.CallExpression)((0, _gen.Identifier)("_objectSpread"), [(0, _gen.ObjectExpression)(before), object.properties[spreadIndex].argument]);
|
|
84
|
-
|
|
85
73
|
if (after.length) {
|
|
86
74
|
var newObject = (0, _gen.ObjectExpression)(after);
|
|
87
75
|
this.replace(object, (0, _gen.CallExpression)((0, _gen.Identifier)("_objectSpread"), [call, newObject]));
|
|
@@ -94,23 +82,17 @@ class AntiSpread extends _transform.default {
|
|
|
94
82
|
}
|
|
95
83
|
};
|
|
96
84
|
}
|
|
97
|
-
|
|
98
85
|
}
|
|
99
|
-
|
|
100
86
|
class AntiES6Object extends _transform.default {
|
|
101
87
|
constructor(o) {
|
|
102
88
|
super(o);
|
|
103
|
-
|
|
104
89
|
_defineProperty(this, "makerFn", void 0);
|
|
105
|
-
|
|
106
90
|
this.makerFn = null;
|
|
107
91
|
this.after.push(new AntiSpread(o));
|
|
108
92
|
}
|
|
109
|
-
|
|
110
93
|
match(object, parents) {
|
|
111
94
|
return object.type == "ObjectExpression";
|
|
112
95
|
}
|
|
113
|
-
|
|
114
96
|
transform(object, parents) {
|
|
115
97
|
return () => {
|
|
116
98
|
var block = (0, _traverse.getBlock)(object, parents);
|
|
@@ -119,54 +101,66 @@ class AntiES6Object extends _transform.default {
|
|
|
119
101
|
if (property.type == "SpreadElement") {
|
|
120
102
|
needsChanging = true;
|
|
121
103
|
return;
|
|
122
|
-
}
|
|
123
|
-
|
|
104
|
+
}
|
|
124
105
|
|
|
106
|
+
// AntiShorthand
|
|
125
107
|
object.shorthand = false;
|
|
126
|
-
|
|
127
108
|
if (!property.key) {
|
|
128
109
|
this.error(new Error("Property missing key"));
|
|
129
110
|
}
|
|
130
|
-
|
|
131
111
|
if (!["Literal", "Identifier"].includes(property.key.type)) {
|
|
132
112
|
property.computed = true;
|
|
133
113
|
}
|
|
134
|
-
|
|
135
114
|
if (property.computed && property.key.type == "Literal") {
|
|
136
115
|
property.computed = false;
|
|
137
116
|
}
|
|
138
|
-
|
|
139
117
|
if (property.kind != "init" || property.method || property.computed) {
|
|
140
118
|
needsChanging = true;
|
|
141
119
|
}
|
|
142
120
|
});
|
|
143
|
-
|
|
144
121
|
if (needsChanging) {
|
|
145
122
|
if (!this.makerFn) {
|
|
146
123
|
this.makerFn = this.getPlaceholder();
|
|
147
|
-
(0, _insert.prepend)(parents[parents.length - 1] || block, (0, _template.default)(
|
|
148
|
-
name
|
|
149
|
-
}));
|
|
150
|
-
} // {a: 1} Es5 compliant properties
|
|
151
|
-
|
|
124
|
+
(0, _insert.prepend)(parents[parents.length - 1] || block, (0, _template.default)(`
|
|
125
|
+
function {name}(base, computedProps, getters, setters){
|
|
152
126
|
|
|
153
|
-
|
|
127
|
+
for ( var i = 0; i < computedProps.length; i++ ) {
|
|
128
|
+
base[computedProps[i][0]] = computedProps[i][1];
|
|
129
|
+
}
|
|
154
130
|
|
|
155
|
-
|
|
131
|
+
var keys=Object.create(null);
|
|
132
|
+
Object.keys(getters).forEach(key=>(keys[key] = 1))
|
|
133
|
+
Object.keys(setters).forEach(key=>(keys[key] = 1))
|
|
134
|
+
|
|
135
|
+
Object.keys(keys).forEach(key=>{
|
|
136
|
+
Object.defineProperty(base, key, {
|
|
137
|
+
set: setters[key],
|
|
138
|
+
get: getters[key],
|
|
139
|
+
configurable: true
|
|
140
|
+
});
|
|
141
|
+
})
|
|
142
|
+
return base;
|
|
143
|
+
}
|
|
144
|
+
`).single({
|
|
145
|
+
name: this.makerFn
|
|
146
|
+
}));
|
|
147
|
+
}
|
|
156
148
|
|
|
149
|
+
// {a: 1} Es5 compliant properties
|
|
150
|
+
var baseProps = [];
|
|
151
|
+
// {[a]: 1} -> Computed props to array [a, 1]
|
|
152
|
+
var computedProps = [];
|
|
153
|
+
// {get a(){}} -> Property descriptors
|
|
157
154
|
var getters = (0, _gen.ObjectExpression)([]);
|
|
158
155
|
var setters = (0, _gen.ObjectExpression)([]);
|
|
159
156
|
object.properties.forEach(prop => {
|
|
160
157
|
var key = prop.key;
|
|
161
|
-
|
|
162
158
|
if (!key) {
|
|
163
159
|
return;
|
|
164
160
|
}
|
|
165
|
-
|
|
166
161
|
if (key.type == "Identifier" && !prop.computed) {
|
|
167
162
|
key = (0, _gen.Literal)(key.name);
|
|
168
163
|
}
|
|
169
|
-
|
|
170
164
|
if (prop.computed) {
|
|
171
165
|
var array = [prop.key, prop.value];
|
|
172
166
|
computedProps.push((0, _gen.ArrayExpression)(array));
|
|
@@ -181,14 +175,11 @@ class AntiES6Object extends _transform.default {
|
|
|
181
175
|
baseProps.push(prop);
|
|
182
176
|
}
|
|
183
177
|
});
|
|
184
|
-
|
|
185
178
|
if (setters.properties.length || getters.properties.length || computedProps.length) {
|
|
186
179
|
this.objectAssign(object, (0, _gen.CallExpression)((0, _gen.Identifier)(this.makerFn), [(0, _gen.ObjectExpression)(baseProps), (0, _gen.ArrayExpression)(computedProps), getters, setters]));
|
|
187
180
|
}
|
|
188
181
|
}
|
|
189
182
|
};
|
|
190
183
|
}
|
|
191
|
-
|
|
192
184
|
}
|
|
193
|
-
|
|
194
185
|
exports.default = AntiES6Object;
|
|
@@ -4,41 +4,32 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _gen = require("../../util/gen");
|
|
9
|
-
|
|
10
8
|
var _insert = require("../../util/insert");
|
|
11
|
-
|
|
12
9
|
var _transform = _interopRequireDefault(require("../transform"));
|
|
13
|
-
|
|
14
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
-
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
11
|
// fn(...args) -> fn.apply(this, [...args])
|
|
17
12
|
class AntiSpreadOperator extends _transform.default {
|
|
18
13
|
constructor(o) {
|
|
19
14
|
super(o);
|
|
20
15
|
}
|
|
21
|
-
|
|
22
16
|
match(object, parents) {
|
|
23
17
|
return object.type == "CallExpression" && object.arguments.find(x => x.type == "SpreadElement");
|
|
24
18
|
}
|
|
25
|
-
|
|
26
19
|
transform(object, parents) {
|
|
27
20
|
return () => {
|
|
28
21
|
var ref;
|
|
29
|
-
|
|
30
22
|
if (object.callee.type == "MemberExpression") {
|
|
31
23
|
ref = this.getPlaceholder();
|
|
32
|
-
object.callee.object = (0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(ref), {
|
|
24
|
+
object.callee.object = (0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(ref), {
|
|
25
|
+
...object.callee.object
|
|
33
26
|
});
|
|
34
27
|
(0, _insert.prepend)(parents[parents.length - 1], (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(ref)));
|
|
35
28
|
}
|
|
36
|
-
|
|
37
|
-
|
|
29
|
+
this.replace(object, (0, _gen.CallExpression)((0, _gen.MemberExpression)({
|
|
30
|
+
...object.callee
|
|
38
31
|
}, (0, _gen.Identifier)("apply"), false), [ref ? (0, _gen.Identifier)(ref) : (0, _gen.ThisExpression)(), (0, _gen.ArrayExpression)(object.arguments)]));
|
|
39
32
|
};
|
|
40
33
|
}
|
|
41
|
-
|
|
42
34
|
}
|
|
43
|
-
|
|
44
35
|
exports.default = AntiSpreadOperator;
|
|
@@ -4,37 +4,28 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _template = _interopRequireDefault(require("../../templates/template"));
|
|
9
|
-
|
|
10
8
|
var _gen = require("../../util/gen");
|
|
11
|
-
|
|
12
9
|
var _insert = require("../../util/insert");
|
|
13
|
-
|
|
14
10
|
var _transform = _interopRequireDefault(require("../transform"));
|
|
15
|
-
|
|
16
|
-
function
|
|
17
|
-
|
|
18
|
-
function
|
|
19
|
-
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
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" == typeof i ? i : i + ""; }
|
|
14
|
+
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); }
|
|
20
15
|
class AntiTemplate extends _transform.default {
|
|
21
16
|
constructor(o) {
|
|
22
17
|
super(o);
|
|
23
|
-
|
|
24
18
|
_defineProperty(this, "makerFn", void 0);
|
|
25
19
|
}
|
|
26
|
-
|
|
27
20
|
match(object, parents) {
|
|
28
21
|
return object.type == "TemplateLiteral" || object.type == "TaggedTemplateExpression";
|
|
29
22
|
}
|
|
30
|
-
|
|
31
23
|
transform(object, parents) {
|
|
32
24
|
return () => {
|
|
33
25
|
if (object.type == "TemplateLiteral") {
|
|
34
26
|
if (parents[0].type == "TaggedTemplateExpression" && parents[0].quasi == object) {
|
|
35
27
|
return;
|
|
36
28
|
}
|
|
37
|
-
|
|
38
29
|
if (object.quasis.length == 1 && object.expressions.length == 0) {
|
|
39
30
|
this.replace(object, (0, _gen.Literal)(object.quasis[0].value.cooked));
|
|
40
31
|
} else {
|
|
@@ -42,7 +33,6 @@ class AntiTemplate extends _transform.default {
|
|
|
42
33
|
object.quasis.forEach((q, i) => {
|
|
43
34
|
var expr = object.expressions[i];
|
|
44
35
|
var str = (0, _gen.Literal)(q.value.cooked);
|
|
45
|
-
|
|
46
36
|
if (!binaryExpression) {
|
|
47
37
|
binaryExpression = (0, _gen.BinaryExpression)("+", str, expr);
|
|
48
38
|
} else {
|
|
@@ -57,19 +47,20 @@ class AntiTemplate extends _transform.default {
|
|
|
57
47
|
}
|
|
58
48
|
} else if (object.type == "TaggedTemplateExpression") {
|
|
59
49
|
var literal = object.quasi;
|
|
60
|
-
|
|
61
50
|
if (!this.makerFn) {
|
|
62
51
|
this.makerFn = "es6_template" + this.getPlaceholder();
|
|
63
|
-
(0, _insert.prepend)(parents[parents.length - 1], (0, _template.default)(
|
|
52
|
+
(0, _insert.prepend)(parents[parents.length - 1], (0, _template.default)(`
|
|
53
|
+
function {name}(arr, raw){
|
|
54
|
+
arr.raw = raw;
|
|
55
|
+
return arr;
|
|
56
|
+
}
|
|
57
|
+
`).single({
|
|
64
58
|
name: this.makerFn
|
|
65
59
|
}));
|
|
66
60
|
}
|
|
67
|
-
|
|
68
61
|
this.replace(object, (0, _gen.CallExpression)(object.tag, [(0, _gen.CallExpression)((0, _gen.Identifier)(this.makerFn), [(0, _gen.ArrayExpression)(literal.quasis.map(x => (0, _gen.Literal)(x.value.cooked))), (0, _gen.ArrayExpression)(literal.quasis.map(x => (0, _gen.Literal)(x.value.raw)))]), ...literal.expressions]));
|
|
69
62
|
}
|
|
70
63
|
};
|
|
71
64
|
}
|
|
72
|
-
|
|
73
65
|
}
|
|
74
|
-
|
|
75
66
|
exports.default = AntiTemplate;
|
|
@@ -4,35 +4,20 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = exports.AntiArrowFunction = void 0;
|
|
7
|
-
|
|
8
7
|
var _transform = _interopRequireDefault(require("../transform"));
|
|
9
|
-
|
|
10
8
|
var _gen = require("../../util/gen");
|
|
11
|
-
|
|
12
9
|
var _insert = require("../../util/insert");
|
|
13
|
-
|
|
14
10
|
var _traverse = require("../../traverse");
|
|
15
|
-
|
|
16
11
|
var _order = require("../../order");
|
|
17
|
-
|
|
18
12
|
var _assert = require("assert");
|
|
19
|
-
|
|
20
13
|
var _constants = require("../../constants");
|
|
21
|
-
|
|
22
14
|
var _antiDestructuring = _interopRequireDefault(require("./antiDestructuring"));
|
|
23
|
-
|
|
24
15
|
var _antiTemplate = _interopRequireDefault(require("./antiTemplate"));
|
|
25
|
-
|
|
26
16
|
var _antiClass = _interopRequireDefault(require("./antiClass"));
|
|
27
|
-
|
|
28
17
|
var _antiES6Object = _interopRequireDefault(require("./antiES6Object"));
|
|
29
|
-
|
|
30
18
|
var _antiSpreadOperator = _interopRequireDefault(require("./antiSpreadOperator"));
|
|
31
|
-
|
|
32
19
|
var _es = require("../../templates/es5");
|
|
33
|
-
|
|
34
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
35
|
-
|
|
20
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
36
21
|
/**
|
|
37
22
|
* `Const` and `Let` are not allowed in ES5.
|
|
38
23
|
*/
|
|
@@ -40,39 +25,31 @@ class AntiConstLet extends _transform.default {
|
|
|
40
25
|
constructor(o) {
|
|
41
26
|
super(o);
|
|
42
27
|
}
|
|
43
|
-
|
|
44
28
|
match(object, parents) {
|
|
45
29
|
return object.type == "VariableDeclaration" && object.kind != "var";
|
|
46
30
|
}
|
|
47
|
-
|
|
48
31
|
transform(object) {
|
|
49
32
|
object.kind = "var";
|
|
50
33
|
}
|
|
51
|
-
|
|
52
34
|
}
|
|
35
|
+
|
|
53
36
|
/**
|
|
54
37
|
* Converts arrow functions
|
|
55
38
|
*/
|
|
56
|
-
|
|
57
|
-
|
|
58
39
|
class AntiArrowFunction extends _transform.default {
|
|
59
40
|
constructor(o) {
|
|
60
41
|
super(o);
|
|
61
42
|
}
|
|
62
|
-
|
|
63
43
|
match(object, parents) {
|
|
64
44
|
return object.type == "ArrowFunctionExpression";
|
|
65
45
|
}
|
|
66
|
-
|
|
67
46
|
transform(object, parents) {
|
|
68
47
|
return () => {
|
|
69
48
|
var usesThis = false;
|
|
70
|
-
|
|
71
49
|
if (object.body.type != "BlockStatement" && object.expression) {
|
|
72
50
|
object.body = (0, _gen.BlockStatement)([(0, _gen.ReturnStatement)((0, _insert.clone)(object.body))]);
|
|
73
51
|
object.expression = false;
|
|
74
52
|
}
|
|
75
|
-
|
|
76
53
|
(0, _traverse.walk)(object.body, [object, ...parents], (o, p) => {
|
|
77
54
|
if (p.filter(x => (0, _traverse.isBlock)(x))[0] == object.body) {
|
|
78
55
|
if (o.type == "ThisExpression" || o.type == "Identifier" && o.name == "this") {
|
|
@@ -85,24 +62,20 @@ class AntiArrowFunction extends _transform.default {
|
|
|
85
62
|
(0, _assert.ok)(!object.body.body.find(x => Array.isArray(x)), "All elements should be statements");
|
|
86
63
|
object.type = "FunctionExpression";
|
|
87
64
|
object.expression = false;
|
|
88
|
-
|
|
89
65
|
if (usesThis) {
|
|
90
66
|
this.objectAssign(object, (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _insert.clone)(object), (0, _gen.Identifier)("bind"), false), [(0, _gen.ThisExpression)()]));
|
|
91
67
|
}
|
|
92
68
|
};
|
|
93
69
|
}
|
|
94
|
-
|
|
95
70
|
}
|
|
71
|
+
|
|
96
72
|
/**
|
|
97
73
|
* The ES5 options aims to convert ES6 and up features down to ES5-compatible code.
|
|
98
74
|
*
|
|
99
75
|
* The obfuscator regularly adds ES6 code (variable destructuring, spread element, etc.)
|
|
100
76
|
* This transformations goal is undo only these things.
|
|
101
77
|
*/
|
|
102
|
-
|
|
103
|
-
|
|
104
78
|
exports.AntiArrowFunction = AntiArrowFunction;
|
|
105
|
-
|
|
106
79
|
class ES5 extends _transform.default {
|
|
107
80
|
constructor(o) {
|
|
108
81
|
super(o, _order.ObfuscateOrder.ES5);
|
|
@@ -114,20 +87,16 @@ class ES5 extends _transform.default {
|
|
|
114
87
|
this.before.push(new _antiDestructuring.default(o));
|
|
115
88
|
this.before.push(new AntiConstLet(o));
|
|
116
89
|
}
|
|
117
|
-
|
|
118
90
|
apply(tree) {
|
|
119
91
|
super.apply(tree);
|
|
120
|
-
|
|
121
92
|
var nodesToAdd = _es.ES5Template.compile();
|
|
122
|
-
|
|
123
93
|
(0, _insert.prepend)(tree, ...nodesToAdd);
|
|
124
|
-
}
|
|
125
|
-
|
|
94
|
+
}
|
|
126
95
|
|
|
96
|
+
// FixedExpressions
|
|
127
97
|
match(object, parents) {
|
|
128
98
|
return !!object.type;
|
|
129
99
|
}
|
|
130
|
-
|
|
131
100
|
transform(object, parents) {
|
|
132
101
|
return () => {
|
|
133
102
|
// Object.keyword -> Object["keyword"]
|
|
@@ -138,9 +107,9 @@ class ES5 extends _transform.default {
|
|
|
138
107
|
object.computed = true;
|
|
139
108
|
}
|
|
140
109
|
}
|
|
141
|
-
}
|
|
142
|
-
|
|
110
|
+
}
|
|
143
111
|
|
|
112
|
+
// { keyword: ... } -> { "keyword": ... }
|
|
144
113
|
if (object.type == "Property") {
|
|
145
114
|
if (!object.computed && object.key.type == "Identifier") {
|
|
146
115
|
if (_constants.reservedKeywords.has(object.key.name)) {
|
|
@@ -150,7 +119,5 @@ class ES5 extends _transform.default {
|
|
|
150
119
|
}
|
|
151
120
|
};
|
|
152
121
|
}
|
|
153
|
-
|
|
154
122
|
}
|
|
155
|
-
|
|
156
123
|
exports.default = ES5;
|