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
package/dist/transforms/stack.js
CHANGED
|
@@ -4,91 +4,69 @@ 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 _order = require("../order");
|
|
11
|
-
|
|
12
9
|
var _probability = require("../probability");
|
|
13
|
-
|
|
14
10
|
var _template = _interopRequireDefault(require("../templates/template"));
|
|
15
|
-
|
|
16
11
|
var _traverse = require("../traverse");
|
|
17
|
-
|
|
18
12
|
var _gen = require("../util/gen");
|
|
19
|
-
|
|
20
13
|
var _identifiers = require("../util/identifiers");
|
|
21
|
-
|
|
22
14
|
var _insert = require("../util/insert");
|
|
23
|
-
|
|
24
15
|
var _random = require("../util/random");
|
|
25
|
-
|
|
26
16
|
var _transform = _interopRequireDefault(require("./transform"));
|
|
27
|
-
|
|
28
17
|
var _constants = require("../constants");
|
|
29
|
-
|
|
30
18
|
var _functionLength = require("../templates/functionLength");
|
|
31
|
-
|
|
32
|
-
function _interopRequireDefault(
|
|
33
|
-
|
|
34
|
-
function
|
|
35
|
-
|
|
19
|
+
var _globals = require("../templates/globals");
|
|
20
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
21
|
+
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; }
|
|
22
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
23
|
+
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); }
|
|
36
24
|
class Stack extends _transform.default {
|
|
37
25
|
constructor(o) {
|
|
38
26
|
super(o, _order.ObfuscateOrder.Stack);
|
|
39
|
-
|
|
40
27
|
_defineProperty(this, "mangledExpressionsMade", void 0);
|
|
41
|
-
|
|
42
28
|
_defineProperty(this, "functionLengthName", void 0);
|
|
43
|
-
|
|
44
29
|
this.mangledExpressionsMade = 0;
|
|
45
30
|
}
|
|
46
|
-
|
|
47
31
|
match(object, parents) {
|
|
48
32
|
return (0, _insert.isFunction)(object) && !object.params.find(x => x.type !== "Identifier") && object.body.type === "BlockStatement" && !parents.find(x => x.$dispatcherSkip) && !object.$requiresEval;
|
|
49
33
|
}
|
|
50
|
-
|
|
51
34
|
transform(object, parents) {
|
|
52
35
|
var _this = this;
|
|
53
|
-
|
|
54
36
|
return () => {
|
|
55
37
|
var _getBlockBody$;
|
|
56
|
-
|
|
57
38
|
// Uncaught SyntaxError: Getter must not have any formal parameters.
|
|
58
39
|
// Uncaught SyntaxError: Setter must have exactly one formal parameter
|
|
59
40
|
var propIndex = parents.findIndex(x => x.type === "Property" || x.type === "MethodDefinition");
|
|
60
|
-
|
|
61
41
|
if (propIndex !== -1) {
|
|
62
42
|
if (parents[propIndex].value === (parents[propIndex - 1] || object)) {
|
|
63
43
|
if (parents[propIndex].kind !== "init" || parents[propIndex].method) {
|
|
64
44
|
return;
|
|
65
45
|
}
|
|
66
46
|
}
|
|
67
|
-
}
|
|
68
|
-
|
|
47
|
+
}
|
|
69
48
|
|
|
49
|
+
// Don't apply to functions with 'use strict' directive
|
|
70
50
|
if ((_getBlockBody$ = (0, _insert.getBlockBody)(object.body)[0]) !== null && _getBlockBody$ !== void 0 && _getBlockBody$.directive) {
|
|
71
51
|
return;
|
|
72
52
|
}
|
|
73
|
-
|
|
74
53
|
if (!(0, _probability.ComputeProbabilityMap)(this.options.stack)) {
|
|
75
54
|
return;
|
|
76
55
|
}
|
|
77
|
-
|
|
78
56
|
var defined = new Set();
|
|
79
57
|
var referenced = new Set();
|
|
80
58
|
var illegal = new Set();
|
|
59
|
+
|
|
81
60
|
/**
|
|
82
61
|
* Maps old names to new indices
|
|
83
62
|
*/
|
|
84
|
-
|
|
85
63
|
var subscripts = new Map();
|
|
86
64
|
var deadValues = Object.create(null);
|
|
87
65
|
var propertyGen = this.getGenerator();
|
|
88
|
-
|
|
89
66
|
function isTransformableFunction(functionNode) {
|
|
90
|
-
if (functionNode.$requiresEval) return false;
|
|
67
|
+
if (functionNode.$requiresEval) return false;
|
|
91
68
|
|
|
69
|
+
// Check for 'this'
|
|
92
70
|
var isIllegal = false;
|
|
93
71
|
(0, _traverse.walk)(functionNode.body, [], (o, p) => {
|
|
94
72
|
if (o.type === "ThisExpression") {
|
|
@@ -98,11 +76,9 @@ class Stack extends _transform.default {
|
|
|
98
76
|
});
|
|
99
77
|
return !isIllegal;
|
|
100
78
|
}
|
|
101
|
-
|
|
102
79
|
function setSubscript(string, index) {
|
|
103
80
|
subscripts.set(string, index + "");
|
|
104
81
|
}
|
|
105
|
-
|
|
106
82
|
object.params.forEach(param => {
|
|
107
83
|
(0, _assert.ok)(param.name);
|
|
108
84
|
defined.add(param.name);
|
|
@@ -115,56 +91,46 @@ class Stack extends _transform.default {
|
|
|
115
91
|
isIllegal = true;
|
|
116
92
|
return "EXIT";
|
|
117
93
|
}
|
|
118
|
-
|
|
119
94
|
if (o.type == "Identifier") {
|
|
120
95
|
var info = (0, _identifiers.getIdentifierInfo)(o, p);
|
|
121
|
-
|
|
122
96
|
if (!info.spec.isReferenced || info.spec.isExported) {
|
|
123
97
|
return;
|
|
124
98
|
}
|
|
125
|
-
|
|
126
99
|
var c = info.spec.isDefined ? (0, _insert.getDefiningContext)(o, p) : (0, _insert.getReferencingContexts)(o, p).find(x => (0, _insert.isVarContext)(x));
|
|
127
|
-
|
|
128
100
|
if (c !== object) {
|
|
129
101
|
// this.log(o.name + " is illegal due to different context");
|
|
130
102
|
illegal.add(o.name);
|
|
131
103
|
}
|
|
132
|
-
|
|
133
104
|
if (o.name.startsWith(_constants.noRenameVariablePrefix)) {
|
|
134
105
|
illegal.add(o.name);
|
|
135
106
|
}
|
|
136
|
-
|
|
137
107
|
if (info.isClauseParameter || info.isFunctionParameter || (0, _insert.isForInitialize)(o, p)) {
|
|
138
108
|
// this.log(
|
|
139
109
|
// o.name + " is illegal due to clause parameter/function parameter"
|
|
140
110
|
// );
|
|
141
111
|
illegal.add(o.name);
|
|
142
112
|
}
|
|
143
|
-
|
|
144
113
|
if (o.hidden) {
|
|
145
114
|
illegal.add(o.name);
|
|
146
115
|
}
|
|
147
|
-
|
|
148
116
|
if (info.spec.isDefined) {
|
|
149
117
|
if (defined.has(o.name)) {
|
|
150
118
|
illegal.add(o.name);
|
|
151
119
|
}
|
|
152
|
-
|
|
153
120
|
if (info.isFunctionDeclaration) {
|
|
154
121
|
(0, _assert.ok)(p[0].type === "FunctionDeclaration");
|
|
155
|
-
|
|
156
122
|
if (p[0] !== object.body.body[0] || !isTransformableFunction(p[0])) {
|
|
157
123
|
illegal.add(o.name);
|
|
158
124
|
}
|
|
159
|
-
}
|
|
160
|
-
|
|
125
|
+
}
|
|
161
126
|
|
|
127
|
+
// The new accessors will either be numbered: [index] or as a string .string
|
|
162
128
|
var newSubscript = (0, _random.choice)([subscripts.size, propertyGen.generate()]);
|
|
163
129
|
setSubscript(o.name, newSubscript);
|
|
164
|
-
defined.add(o.name);
|
|
130
|
+
defined.add(o.name);
|
|
165
131
|
|
|
132
|
+
// Stack can only process single VariableDeclarations
|
|
166
133
|
var varIndex = p.findIndex(x => x.type == "VariableDeclaration");
|
|
167
|
-
|
|
168
134
|
if (varIndex !== -1) {
|
|
169
135
|
// Invalid 'id' property (must be Identifier)
|
|
170
136
|
if (varIndex !== 2) {
|
|
@@ -173,7 +139,6 @@ class Stack extends _transform.default {
|
|
|
173
139
|
illegal.add(o.name);
|
|
174
140
|
} else {
|
|
175
141
|
var value = p[varIndex].declarations[0].init;
|
|
176
|
-
|
|
177
142
|
if (value && !isTransformableFunction(value)) {
|
|
178
143
|
illegal.add(o.name);
|
|
179
144
|
}
|
|
@@ -182,16 +147,13 @@ class Stack extends _transform.default {
|
|
|
182
147
|
} else if (info.spec.isReferenced) {
|
|
183
148
|
if (info.spec.isModified) {
|
|
184
149
|
var assignmentIndex = p.findIndex(x => x.type === "AssignmentExpression");
|
|
185
|
-
|
|
186
150
|
if (assignmentIndex !== -1) {
|
|
187
151
|
var value = p[assignmentIndex].right;
|
|
188
|
-
|
|
189
152
|
if (value && !isTransformableFunction(value)) {
|
|
190
153
|
illegal.add(o.name);
|
|
191
154
|
}
|
|
192
155
|
}
|
|
193
156
|
}
|
|
194
|
-
|
|
195
157
|
referenced.add(o.name);
|
|
196
158
|
}
|
|
197
159
|
}
|
|
@@ -207,55 +169,41 @@ class Stack extends _transform.default {
|
|
|
207
169
|
subscripts.delete(name);
|
|
208
170
|
}
|
|
209
171
|
});
|
|
210
|
-
|
|
211
172
|
if (object.params.find(x => illegal.has(x.name))) {
|
|
212
173
|
return;
|
|
213
174
|
}
|
|
214
|
-
|
|
215
175
|
if (!subscripts.size) {
|
|
216
176
|
return;
|
|
217
177
|
}
|
|
218
|
-
|
|
219
178
|
const numberLiteral = function (number) {
|
|
220
179
|
let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
221
180
|
(0, _assert.ok)(number === number);
|
|
222
|
-
|
|
223
181
|
if (typeof number !== "number" || !Object.keys(deadValues).length || depth > 4 || (0, _random.chance)(75 + depth * 15 + _this.mangledExpressionsMade / 25)) {
|
|
224
182
|
return (0, _gen.Literal)(number);
|
|
225
183
|
}
|
|
226
|
-
|
|
227
184
|
_this.mangledExpressionsMade++;
|
|
228
185
|
var opposingIndex = (0, _random.choice)(Object.keys(deadValues));
|
|
229
|
-
|
|
230
186
|
if (typeof opposingIndex === "undefined") {
|
|
231
187
|
return (0, _gen.Literal)(number);
|
|
232
188
|
}
|
|
233
|
-
|
|
234
189
|
var actualValue = deadValues[opposingIndex];
|
|
235
190
|
(0, _assert.ok)(typeof actualValue === "number");
|
|
236
191
|
return (0, _gen.BinaryExpression)("-", (0, _gen.MemberExpression)((0, _gen.Identifier)(stackName), numberLiteral(isNaN(parseFloat(opposingIndex)) ? opposingIndex : parseFloat(opposingIndex), depth + 1), true), numberLiteral(actualValue - number, depth + 1));
|
|
237
192
|
};
|
|
238
|
-
|
|
239
193
|
function getMemberExpression(index) {
|
|
240
194
|
(0, _assert.ok)(typeof index === "string", typeof index);
|
|
241
195
|
return (0, _gen.MemberExpression)((0, _gen.Identifier)(stackName), numberLiteral(isNaN(parseFloat(index)) ? index : parseFloat(index)), true);
|
|
242
196
|
}
|
|
243
|
-
|
|
244
197
|
var stackName = this.getPlaceholder() + "_stack";
|
|
245
|
-
|
|
246
198
|
const scan = (o, p) => {
|
|
247
199
|
if (o.type == "Identifier") {
|
|
248
200
|
var index = subscripts.get(o.name);
|
|
249
|
-
|
|
250
201
|
if (typeof index !== "undefined") {
|
|
251
202
|
var info = (0, _identifiers.getIdentifierInfo)(o, p);
|
|
252
|
-
|
|
253
203
|
if (!info.spec.isReferenced) {
|
|
254
204
|
return;
|
|
255
205
|
}
|
|
256
|
-
|
|
257
206
|
var member = getMemberExpression(index);
|
|
258
|
-
|
|
259
207
|
if (info.spec.isDefined) {
|
|
260
208
|
if (info.isVariableDeclaration) {
|
|
261
209
|
(0, _traverse.walk)(p[2], p.slice(3), (oo, pp) => {
|
|
@@ -271,7 +219,8 @@ class Stack extends _transform.default {
|
|
|
271
219
|
return scan(oo, pp);
|
|
272
220
|
}
|
|
273
221
|
});
|
|
274
|
-
this.replace(p[0], (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", member, {
|
|
222
|
+
this.replace(p[0], (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", member, {
|
|
223
|
+
...p[0],
|
|
275
224
|
type: "FunctionExpression",
|
|
276
225
|
id: null,
|
|
277
226
|
expression: false
|
|
@@ -283,46 +232,40 @@ class Stack extends _transform.default {
|
|
|
283
232
|
return scan(oo, pp);
|
|
284
233
|
}
|
|
285
234
|
});
|
|
286
|
-
this.replace(p[0], (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", member, {
|
|
235
|
+
this.replace(p[0], (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", member, {
|
|
236
|
+
...p[0],
|
|
287
237
|
type: "ClassExpression"
|
|
288
238
|
})));
|
|
289
239
|
return;
|
|
290
240
|
}
|
|
291
241
|
}
|
|
292
|
-
|
|
293
242
|
if (info.spec.isReferenced) {
|
|
294
243
|
this.replace(o, member);
|
|
295
244
|
}
|
|
296
245
|
}
|
|
297
246
|
}
|
|
298
|
-
|
|
299
|
-
if (o.type == "Literal" && typeof o.value === "number" && Math.floor(o.value) === o.value && Math.abs(o.value) < 100000 && p.find(x => (0, _insert.isFunction)(x)) === object && (0, _random.chance)(50)) {
|
|
247
|
+
if (o.type == "Literal" && typeof o.value === "number" && Math.floor(o.value) === o.value && Math.abs(o.value) < 100_000 && p.find(x => (0, _insert.isFunction)(x)) === object && (0, _random.chance)(50)) {
|
|
300
248
|
return () => {
|
|
301
249
|
this.replaceIdentifierOrLiteral(o, numberLiteral(o.value, 0), p);
|
|
302
250
|
};
|
|
303
251
|
}
|
|
304
252
|
};
|
|
305
|
-
|
|
306
253
|
var rotateNodes = Object.create(null);
|
|
307
254
|
object.body.body.forEach((stmt, index) => {
|
|
308
255
|
var isFirst = index == 0;
|
|
309
|
-
|
|
310
256
|
if (isFirst || (0, _random.chance)(50 - index * 10)) {
|
|
311
257
|
var exprs = [];
|
|
312
258
|
var changes = (0, _random.getRandomInteger)(1, 3);
|
|
313
|
-
|
|
314
259
|
for (var i = 0; i < changes; i++) {
|
|
315
260
|
var expr;
|
|
316
261
|
var type = (0, _random.choice)(["set", "deadValue"]);
|
|
317
262
|
var valueSet = new Set([...Array.from(subscripts.values()), ...Object.keys(deadValues)]);
|
|
318
263
|
var newIndex;
|
|
319
264
|
var i = 0;
|
|
320
|
-
|
|
321
265
|
do {
|
|
322
266
|
newIndex = (0, _random.choice)([propertyGen.generate(), (0, _random.getRandomInteger)(0, 250 + subscripts.size + i * 1000) + ""]);
|
|
323
267
|
i++;
|
|
324
268
|
} while (valueSet.has(newIndex));
|
|
325
|
-
|
|
326
269
|
switch (type) {
|
|
327
270
|
case "set":
|
|
328
271
|
var randomName = (0, _random.choice)(Array.from(subscripts.keys()));
|
|
@@ -331,76 +274,70 @@ class Stack extends _transform.default {
|
|
|
331
274
|
(0, _assert.ok)(typeof deadValues[newIndex] === "undefined", deadValues[newIndex]);
|
|
332
275
|
setSubscript(randomName, newIndex);
|
|
333
276
|
break;
|
|
334
|
-
|
|
335
277
|
case "deadValue":
|
|
336
|
-
var rand = (0, _random.getRandomInteger)(-150, 150);
|
|
278
|
+
var rand = (0, _random.getRandomInteger)(-150, 150);
|
|
337
279
|
|
|
280
|
+
// modify an already existing dead value index
|
|
338
281
|
if ((0, _random.chance)(50)) {
|
|
339
282
|
var alreadyExisting = (0, _random.choice)(Object.keys(deadValues));
|
|
340
|
-
|
|
341
283
|
if (typeof alreadyExisting === "string") {
|
|
342
284
|
newIndex = alreadyExisting;
|
|
343
285
|
}
|
|
344
286
|
}
|
|
345
|
-
|
|
346
287
|
expr = (0, _gen.AssignmentExpression)("=", getMemberExpression(newIndex), numberLiteral(rand));
|
|
347
288
|
deadValues[newIndex] = rand;
|
|
348
289
|
break;
|
|
349
290
|
}
|
|
350
|
-
|
|
351
291
|
exprs.push(expr);
|
|
352
292
|
}
|
|
353
|
-
|
|
354
293
|
rotateNodes[index] = (0, _gen.ExpressionStatement)((0, _gen.SequenceExpression)(exprs));
|
|
355
294
|
}
|
|
356
|
-
|
|
357
295
|
(0, _traverse.walk)(stmt, [object.body.body, object.body, object, ...parents], (o, p) => {
|
|
358
296
|
return scan(o, p);
|
|
359
297
|
});
|
|
360
|
-
|
|
361
298
|
if (stmt.type == "ReturnStatement") {
|
|
362
299
|
var opposing = (0, _random.choice)(Object.keys(deadValues));
|
|
363
|
-
|
|
364
300
|
if (typeof opposing === "string") {
|
|
365
301
|
this.replace(stmt, (0, _gen.IfStatement)((0, _gen.BinaryExpression)(">", getMemberExpression(opposing), numberLiteral(deadValues[opposing] + (0, _random.getRandomInteger)(40, 140))), [(0, _gen.ReturnStatement)(getMemberExpression((0, _random.getRandomInteger)(-250, 250) + ""))], [(0, _gen.ReturnStatement)(stmt.argument)]));
|
|
366
302
|
}
|
|
367
303
|
}
|
|
368
|
-
});
|
|
304
|
+
});
|
|
369
305
|
|
|
306
|
+
// Add in the rotation nodes
|
|
370
307
|
Object.keys(rotateNodes).forEach((index, i) => {
|
|
371
308
|
object.body.body.splice(parseInt(index) + i, 0, rotateNodes[index]);
|
|
372
|
-
});
|
|
373
|
-
|
|
374
|
-
var originalFunctionLength = (0, _insert.computeFunctionLength)(object.params); // Set the params for this function to be the stack array
|
|
309
|
+
});
|
|
375
310
|
|
|
376
|
-
|
|
311
|
+
// Preserve function.length property
|
|
312
|
+
var originalFunctionLength = (0, _insert.computeFunctionLength)(object.params);
|
|
377
313
|
|
|
378
|
-
|
|
314
|
+
// Set the params for this function to be the stack array
|
|
315
|
+
object.params = [(0, _gen.RestElement)((0, _gen.Identifier)(stackName))];
|
|
379
316
|
|
|
380
|
-
|
|
317
|
+
// Ensure the array is correct length
|
|
318
|
+
(0, _insert.prepend)(object.body, (0, _template.default)(`${stackName}["length"] = ${startingSize}`).single());
|
|
319
|
+
if (this.options.preserveFunctionLength && originalFunctionLength !== 0) {
|
|
381
320
|
if (!this.functionLengthName) {
|
|
382
321
|
this.functionLengthName = this.getPlaceholder();
|
|
383
322
|
(0, _insert.prepend)(parents[parents.length - 1] || object, _functionLength.FunctionLengthTemplate.single({
|
|
384
|
-
name: this.functionLengthName
|
|
323
|
+
name: this.functionLengthName,
|
|
324
|
+
ObjectDefineProperty: this.createInitVariable(_globals.ObjectDefineProperty, parents)
|
|
385
325
|
}));
|
|
386
326
|
}
|
|
387
|
-
|
|
388
327
|
if (object.type === "FunctionDeclaration") {
|
|
389
328
|
var body = parents[0];
|
|
390
|
-
|
|
391
329
|
if (Array.isArray(body)) {
|
|
392
330
|
var index = body.indexOf(object);
|
|
393
331
|
body.splice(index, 0, (0, _gen.ExpressionStatement)((0, _gen.CallExpression)((0, _gen.Identifier)(this.functionLengthName), [(0, _gen.Identifier)(object.id.name), (0, _gen.Literal)(originalFunctionLength)])));
|
|
394
332
|
}
|
|
395
333
|
} else {
|
|
396
334
|
(0, _assert.ok)(object.type === "FunctionExpression" || object.type === "ArrowFunctionExpression");
|
|
397
|
-
this.replace(object, (0, _gen.CallExpression)((0, _gen.Identifier)(this.functionLengthName), [{
|
|
335
|
+
this.replace(object, (0, _gen.CallExpression)((0, _gen.Identifier)(this.functionLengthName), [{
|
|
336
|
+
...object
|
|
398
337
|
}, (0, _gen.Literal)(originalFunctionLength)]));
|
|
399
338
|
}
|
|
400
339
|
}
|
|
401
340
|
};
|
|
402
341
|
}
|
|
403
|
-
|
|
404
342
|
}
|
|
405
|
-
|
|
406
343
|
exports.default = Stack;
|
|
@@ -3,29 +3,49 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
7
|
-
|
|
6
|
+
exports.EncodingImplementations = void 0;
|
|
7
|
+
exports.createEncodingImplementation = createEncodingImplementation;
|
|
8
|
+
exports.hasAllEncodings = hasAllEncodings;
|
|
8
9
|
var _template = _interopRequireDefault(require("../../templates/template"));
|
|
10
|
+
var _random = require("../../util/random");
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
/**
|
|
13
|
+
* Defines an encoding implementation the Obfuscator
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
let _hasAllEncodings = false;
|
|
17
|
+
function hasAllEncodings() {
|
|
18
|
+
return _hasAllEncodings;
|
|
19
|
+
}
|
|
20
|
+
function createEncodingImplementation() {
|
|
21
|
+
if (_hasAllEncodings) {
|
|
22
|
+
return EncodingImplementations[(0, _random.choice)(Object.keys(EncodingImplementations))];
|
|
23
|
+
}
|
|
9
24
|
|
|
10
|
-
|
|
25
|
+
// create base91 encoding
|
|
26
|
+
let strTable = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~"';
|
|
11
27
|
|
|
12
|
-
|
|
13
|
-
|
|
28
|
+
// shuffle table
|
|
29
|
+
strTable = (0, _random.shuffle)(strTable.split("")).join("");
|
|
30
|
+
let identity = "base91_" + strTable;
|
|
31
|
+
if (EncodingImplementations.hasOwnProperty(identity)) {
|
|
32
|
+
_hasAllEncodings = true;
|
|
33
|
+
return EncodingImplementations[identity];
|
|
34
|
+
}
|
|
35
|
+
var encodingImplementation = {
|
|
36
|
+
identity,
|
|
14
37
|
encode(str) {
|
|
15
|
-
const table =
|
|
38
|
+
const table = strTable;
|
|
16
39
|
const raw = Buffer.from(str, "utf-8");
|
|
17
40
|
const len = raw.length;
|
|
18
41
|
let ret = "";
|
|
19
42
|
let n = 0;
|
|
20
43
|
let b = 0;
|
|
21
|
-
|
|
22
44
|
for (let i = 0; i < len; i++) {
|
|
23
45
|
b |= raw[i] << n;
|
|
24
46
|
n += 8;
|
|
25
|
-
|
|
26
47
|
if (n > 13) {
|
|
27
48
|
let v = b & 8191;
|
|
28
|
-
|
|
29
49
|
if (v > 88) {
|
|
30
50
|
b >>= 13;
|
|
31
51
|
n -= 13;
|
|
@@ -34,58 +54,87 @@ const Encoding = {
|
|
|
34
54
|
b >>= 14;
|
|
35
55
|
n -= 14;
|
|
36
56
|
}
|
|
37
|
-
|
|
38
57
|
ret += table[v % 91] + table[v / 91 | 0];
|
|
39
58
|
}
|
|
40
59
|
}
|
|
41
|
-
|
|
42
60
|
if (n) {
|
|
43
61
|
ret += table[b % 91];
|
|
44
62
|
if (n > 7 || b > 90) ret += table[b / 91 | 0];
|
|
45
63
|
}
|
|
46
|
-
|
|
47
64
|
return ret;
|
|
48
65
|
},
|
|
49
|
-
|
|
50
66
|
decode(str) {
|
|
51
|
-
const table =
|
|
67
|
+
const table = strTable;
|
|
52
68
|
const raw = "" + (str || "");
|
|
53
69
|
const len = raw.length;
|
|
54
70
|
const ret = [];
|
|
55
71
|
let b = 0;
|
|
56
72
|
let n = 0;
|
|
57
73
|
let v = -1;
|
|
58
|
-
|
|
59
74
|
for (let i = 0; i < len; i++) {
|
|
60
75
|
const p = table.indexOf(raw[i]);
|
|
61
76
|
if (p === -1) continue;
|
|
62
|
-
|
|
63
77
|
if (v < 0) {
|
|
64
78
|
v = p;
|
|
65
79
|
} else {
|
|
66
80
|
v += p * 91;
|
|
67
81
|
b |= v << n;
|
|
68
82
|
n += (v & 8191) > 88 ? 13 : 14;
|
|
69
|
-
|
|
70
83
|
do {
|
|
71
84
|
ret.push(b & 0xff);
|
|
72
85
|
b >>= 8;
|
|
73
86
|
n -= 8;
|
|
74
87
|
} while (n > 7);
|
|
75
|
-
|
|
76
88
|
v = -1;
|
|
77
89
|
}
|
|
78
90
|
}
|
|
79
|
-
|
|
80
91
|
if (v > -1) {
|
|
81
92
|
ret.push((b | v << n) & 0xff);
|
|
82
93
|
}
|
|
83
|
-
|
|
84
94
|
return Buffer.from(ret).toString("utf-8");
|
|
85
95
|
},
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
96
|
+
template: (0, _template.default)(`
|
|
97
|
+
function {__fnName__}(str){
|
|
98
|
+
var table = '${strTable}';
|
|
99
|
+
|
|
100
|
+
var raw = "" + (str || "");
|
|
101
|
+
var len = raw.length;
|
|
102
|
+
var ret = [];
|
|
103
|
+
|
|
104
|
+
var b = 0;
|
|
105
|
+
var n = 0;
|
|
106
|
+
var v = -1;
|
|
107
|
+
|
|
108
|
+
for (var i = 0; i < len; i++) {
|
|
109
|
+
var p = table.indexOf(raw[i]);
|
|
110
|
+
if (p === -1) continue;
|
|
111
|
+
if (v < 0) {
|
|
112
|
+
v = p;
|
|
113
|
+
} else {
|
|
114
|
+
v += p * 91;
|
|
115
|
+
b |= v << n;
|
|
116
|
+
n += (v & 8191) > 88 ? 13 : 14;
|
|
117
|
+
do {
|
|
118
|
+
ret.push(b & 0xff);
|
|
119
|
+
b >>= 8;
|
|
120
|
+
n -= 8;
|
|
121
|
+
} while (n > 7);
|
|
122
|
+
v = -1;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (v > -1) {
|
|
127
|
+
ret.push((b | (v << n)) & 0xff);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return {__bufferToString__}(ret);
|
|
131
|
+
}
|
|
132
|
+
`).ignoreMissingVariables()
|
|
133
|
+
};
|
|
134
|
+
EncodingImplementations[identity] = encodingImplementation;
|
|
135
|
+
return encodingImplementation;
|
|
136
|
+
}
|
|
137
|
+
const EncodingImplementations = exports.EncodingImplementations = {
|
|
89
138
|
/* ascii85: { This implementation is flaky and causes decoding errors
|
|
90
139
|
encode(a) {
|
|
91
140
|
var b, c, d, e, f, g, h, i, j, k;
|
|
@@ -174,7 +223,4 @@ const Encoding = {
|
|
|
174
223
|
}
|
|
175
224
|
`),
|
|
176
225
|
}, */
|
|
177
|
-
|
|
178
|
-
};
|
|
179
|
-
var _default = Encoding;
|
|
180
|
-
exports.default = _default;
|
|
226
|
+
};
|