js-confuser 2.0.0-alpha.2 → 2.0.0-alpha.4
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/.prettierrc +4 -0
- package/CHANGELOG.md +42 -8
- package/Migration.md +23 -8
- package/README.md +2 -2
- package/dist/constants.js +11 -2
- package/dist/index.js +49 -6
- package/dist/obfuscator.js +121 -10
- package/dist/order.js +0 -1
- package/dist/probability.js +1 -96
- package/dist/templates/getGlobalTemplate.js +4 -1
- package/dist/templates/integrityTemplate.js +1 -1
- package/dist/templates/stringCompressionTemplate.js +3 -3
- package/dist/templates/tamperProtectionTemplates.js +1 -1
- package/dist/templates/template.js +17 -12
- package/dist/transforms/controlFlowFlattening.js +112 -83
- package/dist/transforms/deadCode.js +21 -22
- package/dist/transforms/dispatcher.js +62 -37
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +5 -0
- package/dist/transforms/extraction/objectExtraction.js +1 -2
- package/dist/transforms/finalizer.js +1 -1
- package/dist/transforms/flatten.js +2 -19
- package/dist/transforms/identifier/globalConcealing.js +3 -4
- package/dist/transforms/identifier/movedDeclarations.js +12 -5
- package/dist/transforms/identifier/renameVariables.js +40 -6
- package/dist/transforms/lock/integrity.js +9 -1
- package/dist/transforms/lock/lock.js +16 -9
- package/dist/transforms/minify.js +64 -27
- package/dist/transforms/opaquePredicates.js +6 -7
- package/dist/transforms/pack.js +32 -5
- package/dist/transforms/plugin.js +20 -39
- package/dist/transforms/preparation.js +25 -36
- package/dist/transforms/renameLabels.js +1 -2
- package/dist/transforms/rgf.js +36 -16
- package/dist/transforms/shuffle.js +10 -11
- package/dist/transforms/string/stringCompression.js +14 -10
- package/dist/transforms/string/stringConcealing.js +7 -5
- package/dist/transforms/string/stringEncoding.js +4 -2
- package/dist/transforms/string/stringSplitting.js +4 -2
- package/dist/transforms/variableMasking.js +3 -2
- package/dist/utils/NameGen.js +5 -2
- package/dist/utils/PredicateGen.js +62 -0
- package/dist/utils/ast-utils.js +24 -9
- package/dist/utils/random-utils.js +10 -0
- package/dist/validateOptions.js +2 -2
- package/index.d.ts +16 -2
- package/package.json +2 -2
- package/src/constants.ts +15 -5
- package/src/index.ts +15 -5
- package/src/obfuscationResult.ts +7 -1
- package/src/obfuscator.ts +152 -12
- package/src/options.ts +26 -8
- package/src/order.ts +0 -2
- package/src/templates/getGlobalTemplate.ts +5 -1
- package/src/templates/integrityTemplate.ts +14 -19
- package/src/templates/stringCompressionTemplate.ts +4 -28
- package/src/templates/tamperProtectionTemplates.ts +7 -3
- package/src/templates/template.ts +5 -3
- package/src/transforms/controlFlowFlattening.ts +139 -83
- package/src/transforms/deadCode.ts +27 -30
- package/src/transforms/dispatcher.ts +24 -5
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +10 -1
- package/src/transforms/extraction/objectExtraction.ts +1 -2
- package/src/transforms/finalizer.ts +1 -1
- package/src/transforms/flatten.ts +3 -22
- package/src/transforms/identifier/globalConcealing.ts +26 -17
- package/src/transforms/identifier/movedDeclarations.ts +18 -6
- package/src/transforms/identifier/renameVariables.ts +48 -6
- package/src/transforms/lock/integrity.ts +11 -1
- package/src/transforms/lock/lock.ts +26 -10
- package/src/transforms/minify.ts +85 -38
- package/src/transforms/opaquePredicates.ts +6 -9
- package/src/transforms/pack.ts +41 -5
- package/src/transforms/plugin.ts +47 -69
- package/src/transforms/preparation.ts +33 -46
- package/src/transforms/renameLabels.ts +1 -2
- package/src/transforms/rgf.ts +52 -23
- package/src/transforms/shuffle.ts +28 -26
- package/src/transforms/string/encoding.ts +1 -1
- package/src/transforms/string/stringCompression.ts +22 -13
- package/src/transforms/string/stringConcealing.ts +13 -7
- package/src/transforms/string/stringEncoding.ts +6 -2
- package/src/transforms/string/stringSplitting.ts +9 -4
- package/src/transforms/variableMasking.ts +2 -2
- package/src/utils/NameGen.ts +13 -3
- package/src/utils/PredicateGen.ts +61 -0
- package/src/utils/ast-utils.ts +16 -9
- package/src/utils/random-utils.ts +14 -0
- package/src/validateOptions.ts +7 -4
- package/src/probability.ts +0 -110
- package/src/transforms/functionOutlining.ts +0 -225
- package/src/utils/ControlObject.ts +0 -141
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
4
3
|
Object.defineProperty(exports, "__esModule", {
|
|
5
4
|
value: true
|
|
6
5
|
});
|
|
7
6
|
exports["default"] = void 0;
|
|
8
7
|
var _randomUtils = require("../utils/random-utils");
|
|
9
8
|
var _deadCodeTemplates = require("../templates/deadCodeTemplates");
|
|
10
|
-
var _probability = require("../probability");
|
|
11
9
|
var _order = require("../order");
|
|
12
10
|
var t = _interopRequireWildcard(require("@babel/types"));
|
|
13
11
|
var _template = _interopRequireDefault(require("../templates/template"));
|
|
14
|
-
var _NameGen = require("../utils/NameGen");
|
|
15
12
|
var _astUtils = require("../utils/ast-utils");
|
|
13
|
+
var _PredicateGen = _interopRequireDefault(require("../utils/PredicateGen"));
|
|
16
14
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
17
15
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
18
16
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
@@ -22,6 +20,7 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
|
|
|
22
20
|
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
23
21
|
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
24
22
|
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
23
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
25
24
|
var _default = exports["default"] = function _default(_ref) {
|
|
26
25
|
var Plugin = _ref.Plugin;
|
|
27
26
|
var me = Plugin(_order.Order.DeadCode, {
|
|
@@ -29,7 +28,7 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
29
28
|
deadCode: 0
|
|
30
29
|
}
|
|
31
30
|
});
|
|
32
|
-
var
|
|
31
|
+
var predicateGen = new _PredicateGen["default"](me);
|
|
33
32
|
return {
|
|
34
33
|
visitor: {
|
|
35
34
|
Block: {
|
|
@@ -37,34 +36,34 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
37
36
|
if (blockPath.find(function (p) {
|
|
38
37
|
return me.isSkipped(p);
|
|
39
38
|
})) return;
|
|
40
|
-
if (!
|
|
39
|
+
if (!me.computeProbabilityMap(me.options.deadCode)) {
|
|
41
40
|
return;
|
|
42
41
|
}
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
|
|
43
|
+
// Default limit on dead code
|
|
44
|
+
// May be overridden by user
|
|
45
|
+
if (typeof me.options.deadCode !== "function" && _typeof(me.options.deadCode) !== "object") {
|
|
46
|
+
var suggestedMax = 20;
|
|
45
47
|
if (me.obfuscator.parentObfuscator) {
|
|
46
48
|
// RGF should contain less dead code
|
|
47
49
|
suggestedMax = 5;
|
|
48
50
|
}
|
|
49
|
-
if (
|
|
50
|
-
|
|
51
|
+
if (me.changeData.deadCode >= suggestedMax) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
51
54
|
}
|
|
55
|
+
|
|
56
|
+
// Increment dead code counter
|
|
57
|
+
me.changeData.deadCode++;
|
|
52
58
|
var template = (0, _randomUtils.choice)(_deadCodeTemplates.deadCodeTemplates);
|
|
53
59
|
var nodes = template.compile();
|
|
54
|
-
var containingFnName = me.getPlaceholder("dead_" +
|
|
55
|
-
var newPath = blockPath.unshiftContainer("body", t.functionDeclaration(t.identifier(containingFnName), [], t.blockStatement(_toConsumableArray(nodes))));
|
|
60
|
+
var containingFnName = me.getPlaceholder("dead_" + me.changeData.deadCode);
|
|
56
61
|
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
do {
|
|
64
|
-
randomProperty = nameGen.generate();
|
|
65
|
-
} while (!randomProperty || PrototypeCollision[randomProperty] !== undefined);
|
|
66
|
-
me.changeData.deadCode++;
|
|
67
|
-
(0, _astUtils.prepend)(blockPath, new _template["default"]("\n if(\"".concat(randomProperty, "\" in ").concat(containingFnName, ") {\n ").concat(containingFnName, "()\n }\n ")).single());
|
|
62
|
+
// Insert dummy function
|
|
63
|
+
(0, _astUtils.prepend)(blockPath, t.functionDeclaration(t.identifier(containingFnName), [], t.blockStatement(_toConsumableArray(nodes))));
|
|
64
|
+
(0, _astUtils.prepend)(blockPath, new _template["default"]("\n if({falsePredicate}) {\n ".concat(containingFnName, "()\n }\n ")).single({
|
|
65
|
+
falsePredicate: predicateGen.generateFalseExpression(blockPath)
|
|
66
|
+
}));
|
|
68
67
|
me.skip(blockPath);
|
|
69
68
|
}
|
|
70
69
|
}
|
|
@@ -9,7 +9,6 @@ var t = _interopRequireWildcard(require("@babel/types"));
|
|
|
9
9
|
var _template = _interopRequireDefault(require("../templates/template"));
|
|
10
10
|
var _assert = require("assert");
|
|
11
11
|
var _randomUtils = require("../utils/random-utils");
|
|
12
|
-
var _probability = require("../probability");
|
|
13
12
|
var _order = require("../order");
|
|
14
13
|
var _constants = require("../constants");
|
|
15
14
|
var _functionUtils = require("../utils/function-utils");
|
|
@@ -118,12 +117,38 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
118
117
|
illegalNames.add(name);
|
|
119
118
|
return;
|
|
120
119
|
}
|
|
120
|
+
var hasAssignmentPattern = false;
|
|
121
|
+
var _iterator = _createForOfIteratorHelper(path.get("params")),
|
|
122
|
+
_step;
|
|
123
|
+
try {
|
|
124
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
125
|
+
var param = _step.value;
|
|
126
|
+
if (param.isAssignmentPattern()) {
|
|
127
|
+
hasAssignmentPattern = true;
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
param.traverse({
|
|
131
|
+
AssignmentPattern: function AssignmentPattern(innerPath) {
|
|
132
|
+
var fn = innerPath.getFunctionParent();
|
|
133
|
+
if (fn === path) {
|
|
134
|
+
hasAssignmentPattern = true;
|
|
135
|
+
innerPath.stop();
|
|
136
|
+
} else {
|
|
137
|
+
innerPath.skip();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
if (hasAssignmentPattern) break;
|
|
142
|
+
}
|
|
121
143
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
}
|
|
144
|
+
// Functions with default parameters are not fully supported
|
|
145
|
+
// (Could be a Function Expression referencing outer scope)
|
|
146
|
+
} catch (err) {
|
|
147
|
+
_iterator.e(err);
|
|
148
|
+
} finally {
|
|
149
|
+
_iterator.f();
|
|
150
|
+
}
|
|
151
|
+
if (hasAssignmentPattern) {
|
|
127
152
|
illegalNames.add(name);
|
|
128
153
|
return;
|
|
129
154
|
}
|
|
@@ -131,33 +156,33 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
131
156
|
}
|
|
132
157
|
}
|
|
133
158
|
});
|
|
134
|
-
var
|
|
135
|
-
|
|
159
|
+
var _iterator2 = _createForOfIteratorHelper(illegalNames),
|
|
160
|
+
_step2;
|
|
136
161
|
try {
|
|
137
|
-
for (
|
|
138
|
-
var _name =
|
|
162
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
163
|
+
var _name = _step2.value;
|
|
139
164
|
functionPaths["delete"](_name);
|
|
140
165
|
}
|
|
141
166
|
} catch (err) {
|
|
142
|
-
|
|
167
|
+
_iterator2.e(err);
|
|
143
168
|
} finally {
|
|
144
|
-
|
|
169
|
+
_iterator2.f();
|
|
145
170
|
}
|
|
146
|
-
var
|
|
147
|
-
|
|
171
|
+
var _iterator3 = _createForOfIteratorHelper(functionPaths.keys()),
|
|
172
|
+
_step3;
|
|
148
173
|
try {
|
|
149
|
-
for (
|
|
150
|
-
var name =
|
|
151
|
-
if (!
|
|
174
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
175
|
+
var name = _step3.value;
|
|
176
|
+
if (!me.computeProbabilityMap(me.options.dispatcher, name)) {
|
|
152
177
|
functionPaths["delete"](name);
|
|
153
178
|
}
|
|
154
179
|
}
|
|
155
180
|
|
|
156
181
|
// No functions here to change
|
|
157
182
|
} catch (err) {
|
|
158
|
-
|
|
183
|
+
_iterator3.e(err);
|
|
159
184
|
} finally {
|
|
160
|
-
|
|
185
|
+
_iterator3.f();
|
|
161
186
|
}
|
|
162
187
|
if (functionPaths.size === 0) {
|
|
163
188
|
return;
|
|
@@ -174,19 +199,19 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
174
199
|
returnAsObject: isDebug ? "returnAsObject" : (0, _randomUtils.getRandomString)(10),
|
|
175
200
|
returnAsObjectProperty: isDebug ? "returnAsObjectProperty" : (0, _randomUtils.getRandomString)(10)
|
|
176
201
|
};
|
|
177
|
-
var
|
|
178
|
-
|
|
202
|
+
var _iterator4 = _createForOfIteratorHelper(functionPaths.keys()),
|
|
203
|
+
_step4;
|
|
179
204
|
try {
|
|
180
|
-
for (
|
|
181
|
-
var name =
|
|
205
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
206
|
+
var name = _step4.value;
|
|
182
207
|
newNameMapping.set(name, isDebug ? "_" + name : (0, _randomUtils.getRandomString)(6) /** "_" + name */);
|
|
183
208
|
}
|
|
184
209
|
|
|
185
210
|
// Find identifiers calling/referencing the functions
|
|
186
211
|
} catch (err) {
|
|
187
|
-
|
|
212
|
+
_iterator4.e(err);
|
|
188
213
|
} finally {
|
|
189
|
-
|
|
214
|
+
_iterator4.f();
|
|
190
215
|
}
|
|
191
216
|
blockPath.traverse({
|
|
192
217
|
ReferencedIdentifier: {
|
|
@@ -280,17 +305,17 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
280
305
|
newBody.unshift(t.expressionStatement(t.stringLiteral("Dispatcher: ".concat(name, " -> ").concat(newName))));
|
|
281
306
|
}
|
|
282
307
|
var functionExpression = t.functionExpression(null, [], t.blockStatement(newBody));
|
|
283
|
-
var
|
|
284
|
-
|
|
308
|
+
var _iterator5 = _createForOfIteratorHelper(Object.getOwnPropertySymbols(originalFn)),
|
|
309
|
+
_step5;
|
|
285
310
|
try {
|
|
286
|
-
for (
|
|
287
|
-
var symbol =
|
|
311
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
312
|
+
var symbol = _step5.value;
|
|
288
313
|
functionExpression[symbol] = originalFn[symbol];
|
|
289
314
|
}
|
|
290
315
|
} catch (err) {
|
|
291
|
-
|
|
316
|
+
_iterator5.e(err);
|
|
292
317
|
} finally {
|
|
293
|
-
|
|
318
|
+
_iterator5.f();
|
|
294
319
|
}
|
|
295
320
|
functionExpression[_constants.PREDICTABLE] = true;
|
|
296
321
|
return t.objectProperty(t.stringLiteral(newName), functionExpression);
|
|
@@ -321,17 +346,17 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
321
346
|
prepend(t.variableDeclaration("var", [t.variableDeclarator(t.identifier(cacheName), new _template["default"]("Object[\"create\"](null)").expression())]));
|
|
322
347
|
|
|
323
348
|
// Remove original functions
|
|
324
|
-
var
|
|
325
|
-
|
|
349
|
+
var _iterator6 = _createForOfIteratorHelper(functionPaths.values()),
|
|
350
|
+
_step6;
|
|
326
351
|
try {
|
|
327
|
-
for (
|
|
328
|
-
var path =
|
|
352
|
+
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
|
|
353
|
+
var path = _step6.value;
|
|
329
354
|
path.remove();
|
|
330
355
|
}
|
|
331
356
|
} catch (err) {
|
|
332
|
-
|
|
357
|
+
_iterator6.e(err);
|
|
333
358
|
} finally {
|
|
334
|
-
|
|
359
|
+
_iterator6.f();
|
|
335
360
|
}
|
|
336
361
|
}
|
|
337
362
|
}
|
|
@@ -40,6 +40,11 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
40
40
|
programPath.traverse({
|
|
41
41
|
"StringLiteral|BooleanLiteral|NumericLiteral|NullLiteral|Identifier": function StringLiteralBooleanLiteralNumericLiteralNullLiteralIdentifier(_path) {
|
|
42
42
|
var literalPath = _path;
|
|
43
|
+
|
|
44
|
+
// Don't change module imports
|
|
45
|
+
if (literalPath.isStringLiteral()) {
|
|
46
|
+
if ((0, _astUtils.isModuleImport)(literalPath)) return;
|
|
47
|
+
}
|
|
43
48
|
var node = literalPath.node;
|
|
44
49
|
var isUndefined = false;
|
|
45
50
|
if (literalPath.isIdentifier()) {
|
|
@@ -8,7 +8,6 @@ exports["default"] = void 0;
|
|
|
8
8
|
var _order = require("../../order");
|
|
9
9
|
var t = _interopRequireWildcard(require("@babel/types"));
|
|
10
10
|
var _astUtils = require("../../utils/ast-utils");
|
|
11
|
-
var _probability = require("../../probability");
|
|
12
11
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
13
12
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
14
13
|
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
@@ -134,7 +133,7 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
134
133
|
|
|
135
134
|
// Object references are too complex to safely extract
|
|
136
135
|
if (!isObjectSafe) return;
|
|
137
|
-
if (!
|
|
136
|
+
if (!me.computeProbabilityMap(me.options.objectExtraction, identifier.node.name)) return;
|
|
138
137
|
var newDeclarationKind = varDecPath.node.kind === "const" ? "let" : varDecPath.node.kind;
|
|
139
138
|
varDecPath.replaceWithMultiple(newDeclarations.map(function (declaration) {
|
|
140
139
|
return t.variableDeclaration(newDeclarationKind, [declaration]);
|
|
@@ -7,11 +7,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports["default"] = void 0;
|
|
8
8
|
var t = _interopRequireWildcard(require("@babel/types"));
|
|
9
9
|
var _astUtils = require("../utils/ast-utils");
|
|
10
|
-
var _probability = require("../probability");
|
|
11
10
|
var _order = require("../order");
|
|
12
11
|
var _constants = require("../constants");
|
|
13
12
|
var _functionUtils = require("../utils/function-utils");
|
|
14
|
-
var _assert = require("assert");
|
|
15
13
|
var _NameGen = require("../utils/NameGen");
|
|
16
14
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
17
15
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
@@ -59,7 +57,7 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
59
57
|
if (!t.isValidIdentifier(functionName, true)) {
|
|
60
58
|
functionName = "anonymous";
|
|
61
59
|
}
|
|
62
|
-
if (!
|
|
60
|
+
if (!me.computeProbabilityMap(me.options.flatten, functionName)) {
|
|
63
61
|
return;
|
|
64
62
|
}
|
|
65
63
|
var strictMode = fnPath.find(function (path) {
|
|
@@ -99,22 +97,7 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
99
97
|
if (!binding) {
|
|
100
98
|
return;
|
|
101
99
|
}
|
|
102
|
-
var
|
|
103
|
-
do {
|
|
104
|
-
if (definedLocal.hasOwnBinding(identifierName)) return;
|
|
105
|
-
if (definedLocal === fnPath.scope) break;
|
|
106
|
-
definedLocal = definedLocal.parent;
|
|
107
|
-
if (definedLocal === program.scope) (0, _assert.ok)(functionName + ":" + identifierName);
|
|
108
|
-
} while (definedLocal);
|
|
109
|
-
var cursor = fnPath.scope.parent;
|
|
110
|
-
var isOutsideVariable = false;
|
|
111
|
-
do {
|
|
112
|
-
if (cursor.hasBinding(identifierName)) {
|
|
113
|
-
isOutsideVariable = true;
|
|
114
|
-
break;
|
|
115
|
-
}
|
|
116
|
-
cursor = cursor.parent;
|
|
117
|
-
} while (cursor);
|
|
100
|
+
var isOutsideVariable = fnPath.scope.parent.getBinding(identifierName) === binding;
|
|
118
101
|
if (!isOutsideVariable) {
|
|
119
102
|
return;
|
|
120
103
|
}
|
|
@@ -9,7 +9,6 @@ var t = _interopRequireWildcard(require("@babel/types"));
|
|
|
9
9
|
var _NameGen = require("../../utils/NameGen");
|
|
10
10
|
var _template = _interopRequireDefault(require("../../templates/template"));
|
|
11
11
|
var _order = require("../../order");
|
|
12
|
-
var _probability = require("../../probability");
|
|
13
12
|
var _constants = require("../../constants");
|
|
14
13
|
var _astUtils = require("../../utils/ast-utils");
|
|
15
14
|
var _getGlobalTemplate = require("../../templates/getGlobalTemplate");
|
|
@@ -29,7 +28,7 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
|
|
|
29
28
|
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
30
29
|
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
31
30
|
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
32
|
-
var ignoreGlobals = new Set([
|
|
31
|
+
var ignoreGlobals = new Set([].concat(_toConsumableArray(_constants.reservedNodeModuleIdentifiers), ["__dirname", "eval", "arguments", _constants.variableFunctionName], _toConsumableArray(_constants.reservedIdentifiers)));
|
|
33
32
|
var _default = exports["default"] = function _default(_ref) {
|
|
34
33
|
var Plugin = _ref.Plugin;
|
|
35
34
|
var me = Plugin(_order.Order.GlobalConcealing, {
|
|
@@ -53,7 +52,7 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
53
52
|
globalMapping.set(gen.generate(), fakeName);
|
|
54
53
|
}
|
|
55
54
|
var createSwitchStatement = function createSwitchStatement() {
|
|
56
|
-
var cases = Array.from(globalMapping.keys()).map(function (originalName) {
|
|
55
|
+
var cases = (0, _randomUtils.shuffle)(Array.from(globalMapping.keys())).map(function (originalName) {
|
|
57
56
|
var mappedKey = globalMapping.get(originalName);
|
|
58
57
|
return t.switchCase(t.stringLiteral(mappedKey), [t.returnStatement(t.memberExpression(t.identifier(globalVarName), t.stringLiteral(originalName), true))]);
|
|
59
58
|
});
|
|
@@ -110,7 +109,7 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
110
109
|
var mapping = globalMapping.get(globalName);
|
|
111
110
|
if (!mapping) {
|
|
112
111
|
// Allow user to disable custom global variables
|
|
113
|
-
if (!
|
|
112
|
+
if (!me.computeProbabilityMap(me.options.globalConcealing, globalName)) continue;
|
|
114
113
|
mapping = gen.generate();
|
|
115
114
|
globalMapping.set(globalName, mapping);
|
|
116
115
|
}
|
|
@@ -60,9 +60,11 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
60
60
|
return path.isFunction();
|
|
61
61
|
});
|
|
62
62
|
if (!functionPath || !functionPath.node[_constants.PREDICTABLE]) return;
|
|
63
|
+
var fnBody = functionPath.get("body");
|
|
64
|
+
if (!fnBody.isBlockStatement()) return;
|
|
63
65
|
|
|
64
66
|
// Must be direct child of the function
|
|
65
|
-
if (path.parentPath !==
|
|
67
|
+
if (path.parentPath !== fnBody) return;
|
|
66
68
|
var functionName = path.node.id.name;
|
|
67
69
|
|
|
68
70
|
// Must be eligible for parameter packing
|
|
@@ -85,7 +87,7 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
85
87
|
binding.path = paramPath;
|
|
86
88
|
binding.identifier = identifier;
|
|
87
89
|
}
|
|
88
|
-
(0, _astUtils.prepend)(
|
|
90
|
+
(0, _astUtils.prepend)(fnBody, new _template["default"]("\n if(!".concat(functionName, ") {\n ").concat(functionName, " = {functionExpression};\n }\n ")).single({
|
|
89
91
|
functionExpression: functionExpression
|
|
90
92
|
}));
|
|
91
93
|
path.remove();
|
|
@@ -94,6 +96,7 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
94
96
|
},
|
|
95
97
|
VariableDeclaration: {
|
|
96
98
|
exit: function exit(path) {
|
|
99
|
+
if (me.isSkipped(path)) return;
|
|
97
100
|
if (path.node.kind !== "var") return;
|
|
98
101
|
if (path.node.declarations.length !== 1) return;
|
|
99
102
|
var insertionMethod = "variableDeclaration";
|
|
@@ -125,7 +128,9 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
125
128
|
var isDefinedAtTop = false;
|
|
126
129
|
var parentPath = path.parentPath;
|
|
127
130
|
if (parentPath.isBlock()) {
|
|
128
|
-
isDefinedAtTop = parentPath.get("body").
|
|
131
|
+
isDefinedAtTop = parentPath.get("body").filter(function (x) {
|
|
132
|
+
return x.type !== "ImportDeclaration";
|
|
133
|
+
}).indexOf(path) === 0;
|
|
129
134
|
}
|
|
130
135
|
|
|
131
136
|
// Already at the top - nothing will change
|
|
@@ -167,13 +172,15 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
167
172
|
var block = path.findParent(function (path) {
|
|
168
173
|
return path.isBlock();
|
|
169
174
|
});
|
|
170
|
-
var topNode = block.node.body
|
|
175
|
+
var topNode = block.node.body.filter(function (x) {
|
|
176
|
+
return x.type !== "ImportDeclaration";
|
|
177
|
+
})[0];
|
|
171
178
|
var variableDeclarator = t.variableDeclarator(t.identifier(name));
|
|
172
179
|
if (t.isVariableDeclaration(topNode) && topNode.kind === "var") {
|
|
173
180
|
topNode.declarations.push(variableDeclarator);
|
|
174
181
|
break;
|
|
175
182
|
} else {
|
|
176
|
-
block.
|
|
183
|
+
(0, _astUtils.prepend)(block, me.skip(t.variableDeclaration("var", [variableDeclarator])));
|
|
177
184
|
}
|
|
178
185
|
me.changeData.variableDeclarations++;
|
|
179
186
|
break;
|
|
@@ -8,7 +8,6 @@ exports["default"] = void 0;
|
|
|
8
8
|
var t = _interopRequireWildcard(require("@babel/types"));
|
|
9
9
|
var _order = require("../../order");
|
|
10
10
|
var _constants = require("../../constants");
|
|
11
|
-
var _probability = require("../../probability");
|
|
12
11
|
var _astUtils = require("../../utils/ast-utils");
|
|
13
12
|
var _functionUtils = require("../../utils/function-utils");
|
|
14
13
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
@@ -36,6 +35,7 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
36
35
|
});
|
|
37
36
|
var definedMap = new Map();
|
|
38
37
|
var referencedMap = new Map();
|
|
38
|
+
var paramMap = new Map(); // Used for default function parameter special case
|
|
39
39
|
var bindingMap = new Map();
|
|
40
40
|
var renamedVariables = new Map();
|
|
41
41
|
me.obfuscator.globalState.renamedVariables = renamedVariables;
|
|
@@ -49,8 +49,11 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
49
49
|
if (!(0, _astUtils.isVariableIdentifier)(path)) return;
|
|
50
50
|
var contextPaths = [(0, _astUtils.getParentFunctionOrProgram)(path)];
|
|
51
51
|
var isDefined = false;
|
|
52
|
+
var isParameter = false;
|
|
52
53
|
if (path.isBindingIdentifier() && (0, _astUtils.isDefiningIdentifier)(path)) {
|
|
53
54
|
isDefined = true;
|
|
55
|
+
var binding = path.scope.getBinding(path.node.name);
|
|
56
|
+
if ((binding === null || binding === void 0 ? void 0 : binding.kind) === "param") isParameter = true;
|
|
54
57
|
|
|
55
58
|
// Function ID is defined in the parent's function declaration
|
|
56
59
|
if (path.key === "id" && path.parentPath.isFunctionDeclaration()) {
|
|
@@ -102,11 +105,29 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
102
105
|
});
|
|
103
106
|
}
|
|
104
107
|
var newName = null;
|
|
108
|
+
var skippedPaths = new Set();
|
|
105
109
|
var _iterator = _createForOfIteratorHelper(contextPaths),
|
|
106
110
|
_step;
|
|
107
111
|
try {
|
|
108
112
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
109
113
|
var contextPath = _step.value;
|
|
114
|
+
if (skippedPaths.has(contextPath)) continue;
|
|
115
|
+
if (contextPath.isFunction()) {
|
|
116
|
+
var _assignmentPattern;
|
|
117
|
+
var assignmentPattern = contextPath.find(function (p) {
|
|
118
|
+
return p.listKey === "params" && p.parentPath.isFunction();
|
|
119
|
+
});
|
|
120
|
+
if ((_assignmentPattern = assignmentPattern) !== null && _assignmentPattern !== void 0 && _assignmentPattern.isAssignmentPattern()) {
|
|
121
|
+
var functionPath = assignmentPattern.getFunctionParent();
|
|
122
|
+
if (functionPath) {
|
|
123
|
+
// The parameters can be still accessed...
|
|
124
|
+
var params = paramMap.get(functionPath.node);
|
|
125
|
+
if (params !== null && params !== void 0 && params.has(identifierName)) {} else {
|
|
126
|
+
skippedPaths.add(functionPath);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
110
131
|
var _node = contextPath.node;
|
|
111
132
|
var defined = definedMap.get(_node);
|
|
112
133
|
if (defined !== null && defined !== void 0 && defined.has(identifierName)) {
|
|
@@ -132,6 +153,17 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
132
153
|
// 5. Update Identifier node's 'name' property
|
|
133
154
|
node.name = newName;
|
|
134
155
|
node[RENAMED] = true;
|
|
156
|
+
|
|
157
|
+
// 6. Additional parameter mapping
|
|
158
|
+
var binding = identifierPath.scope.getBinding(identifierName);
|
|
159
|
+
if ((binding === null || binding === void 0 ? void 0 : binding.kind) === "param") {
|
|
160
|
+
var mapNode = binding.scope.path.node;
|
|
161
|
+
if (!paramMap.has(mapNode)) {
|
|
162
|
+
paramMap.set(mapNode, new Set([identifierName]));
|
|
163
|
+
} else {
|
|
164
|
+
paramMap.get(mapNode).add(identifierName);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
135
167
|
}
|
|
136
168
|
},
|
|
137
169
|
Scopable: function Scopable(scopePath) {
|
|
@@ -211,16 +243,18 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
211
243
|
|
|
212
244
|
// Placeholder variables should always be renamed
|
|
213
245
|
if (name.startsWith(_constants.placeholderVariablePrefix)) return true;
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
246
|
+
var binding = bindings === null || bindings === void 0 ? void 0 : bindings.get(name);
|
|
247
|
+
if (binding) {
|
|
248
|
+
// Do not rename exports
|
|
249
|
+
if ((0, _astUtils.isExportedIdentifier)(binding)) return false;
|
|
250
|
+
}
|
|
217
251
|
if (name === me.obfuscator.getStringCompressionLibraryName()) return false;
|
|
218
252
|
|
|
219
253
|
// Global variables are additionally checked against user option
|
|
220
254
|
if (isGlobal) {
|
|
221
|
-
if (!
|
|
255
|
+
if (!me.computeProbabilityMap(me.options.renameGlobals, name)) return false;
|
|
222
256
|
}
|
|
223
|
-
if (!
|
|
257
|
+
if (!me.computeProbabilityMap(me.options.renameVariables, name, isGlobal)) return false;
|
|
224
258
|
return true;
|
|
225
259
|
}
|
|
226
260
|
|
|
@@ -10,6 +10,7 @@ var _randomUtils = require("../../utils/random-utils");
|
|
|
10
10
|
var _integrityTemplate = require("../../templates/integrityTemplate");
|
|
11
11
|
var t = _interopRequireWildcard(require("@babel/types"));
|
|
12
12
|
var _template = _interopRequireDefault(require("../../templates/template"));
|
|
13
|
+
var _NameGen = require("../../utils/NameGen");
|
|
13
14
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
14
15
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
15
16
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
@@ -29,6 +30,10 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
29
30
|
functions: 0
|
|
30
31
|
}
|
|
31
32
|
});
|
|
33
|
+
var nameGen = new _NameGen.NameGen(me.options.identifierGenerator, {
|
|
34
|
+
avoidObjectPrototype: true,
|
|
35
|
+
avoidReserved: true
|
|
36
|
+
});
|
|
32
37
|
return {
|
|
33
38
|
visitor: {
|
|
34
39
|
Program: {
|
|
@@ -57,10 +62,13 @@ var _default = exports["default"] = function _default(_ref) {
|
|
|
57
62
|
var codeTrimmed = code.replace(me.globalState.lock.integrity.sensitivityRegex, "");
|
|
58
63
|
var seed = (0, _randomUtils.getRandomInteger)(0, 10000000);
|
|
59
64
|
var hashCode = (0, _integrityTemplate.HashFunction)(codeTrimmed, seed);
|
|
65
|
+
var selfName = funcDecPath.node.id.name;
|
|
66
|
+
var selfCacheProperty = nameGen.generate();
|
|
67
|
+
var selfCacheString = "".concat(selfName, ".").concat(selfCacheProperty);
|
|
60
68
|
|
|
61
69
|
// me.log(codeTrimmed, hashCode);
|
|
62
70
|
me.changeData.functions++;
|
|
63
|
-
funcDecPath.node.body = t.blockStatement(new _template["default"]("\n var hash = ".concat(obfuscatedHashFnName, "(").concat(newFunctionDeclaration.id.name, ", ").concat(seed, ");\n if(hash === ").concat(hashCode, ") {\n {originalBody}\n } else {\n {countermeasures} \n }\n ")).compile({
|
|
71
|
+
funcDecPath.node.body = t.blockStatement(new _template["default"]("\n var hash = ".concat(selfCacheString, " || (").concat(selfCacheString, " = ").concat(obfuscatedHashFnName, "(").concat(newFunctionDeclaration.id.name, ", ").concat(seed, "));\n if(hash === ").concat(hashCode, ") {\n {originalBody}\n } else {\n {countermeasures} \n }\n ")).compile({
|
|
64
72
|
originalBody: funcDecPath.node.body.body,
|
|
65
73
|
countermeasures: function countermeasures() {
|
|
66
74
|
return me.globalState.lock.createCountermeasuresCode();
|