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