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
|
@@ -4,42 +4,28 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _transform = _interopRequireDefault(require("../transform"));
|
|
9
|
-
|
|
10
8
|
var _random = require("../../util/random");
|
|
11
|
-
|
|
12
9
|
var _compare = require("../../util/compare");
|
|
13
|
-
|
|
14
|
-
var _stringConcealing = require("./stringConcealing");
|
|
15
|
-
|
|
16
10
|
var _probability = require("../../probability");
|
|
17
|
-
|
|
18
11
|
var _gen = require("../../util/gen");
|
|
19
|
-
|
|
20
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
-
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
22
13
|
function pad(x, len) {
|
|
23
14
|
while (x.length < len) {
|
|
24
15
|
x = "0" + x;
|
|
25
16
|
}
|
|
26
|
-
|
|
27
17
|
return x;
|
|
28
18
|
}
|
|
29
|
-
|
|
30
19
|
function even(x) {
|
|
31
20
|
if (x.length % 2 != 0) {
|
|
32
21
|
return "0" + x;
|
|
33
22
|
}
|
|
34
|
-
|
|
35
23
|
return x;
|
|
36
24
|
}
|
|
37
|
-
|
|
38
25
|
function toHexRepresentation(str) {
|
|
39
26
|
var escapedString = "";
|
|
40
27
|
str.split("").forEach(char => {
|
|
41
28
|
var code = char.charCodeAt(0);
|
|
42
|
-
|
|
43
29
|
if (code < 128) {
|
|
44
30
|
escapedString += "\\x" + even(pad(code.toString(16), 2));
|
|
45
31
|
} else {
|
|
@@ -48,12 +34,10 @@ function toHexRepresentation(str) {
|
|
|
48
34
|
});
|
|
49
35
|
return escapedString;
|
|
50
36
|
}
|
|
51
|
-
|
|
52
37
|
function toUnicodeRepresentation(str) {
|
|
53
38
|
var escapedString = "";
|
|
54
39
|
str.split("").forEach(char => {
|
|
55
40
|
var code = char.charCodeAt(0);
|
|
56
|
-
|
|
57
41
|
if (code < 128) {
|
|
58
42
|
escapedString += "\\u" + even(pad(code.toString(16), 4));
|
|
59
43
|
} else {
|
|
@@ -62,6 +46,7 @@ function toUnicodeRepresentation(str) {
|
|
|
62
46
|
});
|
|
63
47
|
return escapedString;
|
|
64
48
|
}
|
|
49
|
+
|
|
65
50
|
/**
|
|
66
51
|
* [String Encoding](https://docs.jscrambler.com/code-integrity/documentation/transformations/string-encoding) transforms a string into an encoded representation.
|
|
67
52
|
*
|
|
@@ -69,29 +54,24 @@ function toUnicodeRepresentation(str) {
|
|
|
69
54
|
* - Resilience Low
|
|
70
55
|
* - Cost Low
|
|
71
56
|
*/
|
|
72
|
-
|
|
73
|
-
|
|
74
57
|
class StringEncoding extends _transform.default {
|
|
75
58
|
constructor(o) {
|
|
76
59
|
super(o);
|
|
77
60
|
}
|
|
78
|
-
|
|
79
61
|
match(object, parents) {
|
|
80
|
-
return object.type == "Literal" && typeof object.value === "string" && object.value.length > 0 && !(0,
|
|
62
|
+
return object.type == "Literal" && typeof object.value === "string" && object.value.length > 0 && !(0, _compare.isModuleSource)(object, parents) && !(0, _compare.isDirective)(object, parents);
|
|
81
63
|
}
|
|
82
|
-
|
|
83
64
|
transform(object, parents) {
|
|
84
65
|
// Allow percentages
|
|
85
66
|
if (!(0, _probability.ComputeProbabilityMap)(this.options.stringEncoding, x => x, object.value)) return;
|
|
86
67
|
var type = (0, _random.choice)(["hexadecimal", "unicode"]);
|
|
87
68
|
var escapedString = (type == "hexadecimal" ? toHexRepresentation : toUnicodeRepresentation)(object.value);
|
|
88
69
|
return () => {
|
|
89
|
-
if (object.type !== "Literal") return;
|
|
70
|
+
if (object.type !== "Literal") return;
|
|
90
71
|
|
|
91
|
-
|
|
72
|
+
// ESCodeGen tries to escape backslashes, here is a work-around
|
|
73
|
+
this.replace(object, (0, _gen.Identifier)(`'${escapedString}'`));
|
|
92
74
|
};
|
|
93
75
|
}
|
|
94
|
-
|
|
95
76
|
}
|
|
96
|
-
|
|
97
77
|
exports.default = StringEncoding;
|
|
@@ -4,69 +4,46 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _transform = _interopRequireDefault(require("../transform"));
|
|
9
|
-
|
|
10
8
|
var _gen = require("../../util/gen");
|
|
11
|
-
|
|
12
9
|
var _insert = require("../../util/insert");
|
|
13
|
-
|
|
14
10
|
var _random = require("../../util/random");
|
|
15
|
-
|
|
16
11
|
var _order = require("../../order");
|
|
17
|
-
|
|
18
|
-
var _stringConcealing = require("./stringConcealing");
|
|
19
|
-
|
|
20
12
|
var _compare = require("../../util/compare");
|
|
21
|
-
|
|
22
13
|
var _assert = require("assert");
|
|
23
|
-
|
|
24
14
|
var _probability = require("../../probability");
|
|
25
|
-
|
|
26
|
-
function
|
|
27
|
-
|
|
28
|
-
function
|
|
29
|
-
|
|
15
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
|
+
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; }
|
|
17
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
18
|
+
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); }
|
|
30
19
|
class StringSplitting extends _transform.default {
|
|
31
20
|
constructor(o) {
|
|
32
21
|
super(o, _order.ObfuscateOrder.StringSplitting);
|
|
33
|
-
|
|
34
22
|
_defineProperty(this, "joinPrototype", void 0);
|
|
35
|
-
|
|
36
23
|
_defineProperty(this, "strings", void 0);
|
|
37
|
-
|
|
38
24
|
_defineProperty(this, "adders", void 0);
|
|
39
|
-
|
|
40
25
|
_defineProperty(this, "vars", void 0);
|
|
41
|
-
|
|
42
26
|
this.joinPrototype = null;
|
|
43
27
|
this.strings = Object.create(null);
|
|
44
28
|
this.adders = [];
|
|
45
29
|
this.vars = [];
|
|
46
30
|
}
|
|
47
|
-
|
|
48
31
|
match(object, parents) {
|
|
49
|
-
return object.type == "Literal" && typeof object.value === "string" && object.value.length >= 8 && !(0,
|
|
32
|
+
return object.type == "Literal" && typeof object.value === "string" && object.value.length >= 8 && !(0, _compare.isModuleSource)(object, parents) && !(0, _compare.isDirective)(object, parents);
|
|
50
33
|
}
|
|
51
|
-
|
|
52
34
|
transform(object, parents) {
|
|
53
35
|
return () => {
|
|
54
36
|
var size = Math.round(Math.max(6, object.value.length / (0, _random.getRandomInteger)(3, 8)));
|
|
55
|
-
|
|
56
37
|
if (object.value.length <= size) {
|
|
57
38
|
return;
|
|
58
39
|
}
|
|
59
|
-
|
|
60
40
|
var chunks = (0, _random.splitIntoChunks)(object.value, size);
|
|
61
|
-
|
|
62
41
|
if (!chunks || chunks.length <= 1) {
|
|
63
42
|
return;
|
|
64
43
|
}
|
|
65
|
-
|
|
66
44
|
if (!(0, _probability.ComputeProbabilityMap)(this.options.stringSplitting, x => x, object.value)) {
|
|
67
45
|
return;
|
|
68
46
|
}
|
|
69
|
-
|
|
70
47
|
var binaryExpression;
|
|
71
48
|
var parent;
|
|
72
49
|
var last = chunks.pop();
|
|
@@ -82,7 +59,5 @@ class StringSplitting extends _transform.default {
|
|
|
82
59
|
this.replaceIdentifierOrLiteral(object, parent, parents);
|
|
83
60
|
};
|
|
84
61
|
}
|
|
85
|
-
|
|
86
62
|
}
|
|
87
|
-
|
|
88
63
|
exports.default = StringSplitting;
|
|
@@ -4,27 +4,19 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _traverse = _interopRequireDefault(require("../traverse"));
|
|
9
|
-
|
|
10
8
|
var _gen = require("../util/gen");
|
|
11
|
-
|
|
12
9
|
var _random = require("../util/random");
|
|
13
|
-
|
|
14
10
|
var _assert = require("assert");
|
|
15
|
-
|
|
16
11
|
var _obfuscator = _interopRequireDefault(require("../obfuscator"));
|
|
17
|
-
|
|
18
12
|
var _probability = require("../probability");
|
|
19
|
-
|
|
20
13
|
var _constants = require("../constants");
|
|
21
|
-
|
|
22
14
|
var _order = require("../order");
|
|
23
|
-
|
|
24
|
-
function _interopRequireDefault(
|
|
25
|
-
|
|
26
|
-
function
|
|
27
|
-
|
|
15
|
+
var _insert = require("../util/insert");
|
|
16
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
17
|
+
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; }
|
|
18
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
19
|
+
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); }
|
|
28
20
|
/**
|
|
29
21
|
* Base-class for all transformations.
|
|
30
22
|
* - Transformations can have preparation transformations `.before`
|
|
@@ -62,38 +54,42 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
|
|
|
62
54
|
* ```
|
|
63
55
|
*/
|
|
64
56
|
class Transform {
|
|
65
|
-
/**
|
|
66
|
-
* The obfuscator.
|
|
67
|
-
*/
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* The user's options.
|
|
71
|
-
*/
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Only required for top-level transformations.
|
|
75
|
-
*/
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Transforms to run before, such as `Variable Analysis`.
|
|
79
|
-
*/
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Transforms to run after.
|
|
83
|
-
*/
|
|
84
57
|
constructor(obfuscator) {
|
|
85
58
|
let priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
|
|
86
|
-
|
|
59
|
+
/**
|
|
60
|
+
* The obfuscator.
|
|
61
|
+
*/
|
|
87
62
|
_defineProperty(this, "obfuscator", void 0);
|
|
88
|
-
|
|
63
|
+
/**
|
|
64
|
+
* The user's options.
|
|
65
|
+
*/
|
|
89
66
|
_defineProperty(this, "options", void 0);
|
|
90
|
-
|
|
67
|
+
/**
|
|
68
|
+
* Only required for top-level transformations.
|
|
69
|
+
*/
|
|
91
70
|
_defineProperty(this, "priority", void 0);
|
|
92
|
-
|
|
71
|
+
/**
|
|
72
|
+
* Transforms to run before, such as `Variable Analysis`.
|
|
73
|
+
*/
|
|
93
74
|
_defineProperty(this, "before", void 0);
|
|
94
|
-
|
|
75
|
+
/**
|
|
76
|
+
* Transforms to run after.
|
|
77
|
+
*/
|
|
95
78
|
_defineProperty(this, "after", void 0);
|
|
96
|
-
|
|
79
|
+
_defineProperty(this, "initVariables", new Map());
|
|
80
|
+
_defineProperty(this, "zeroWidthGenerator", (0, _random.createZeroWidthGenerator)());
|
|
81
|
+
_defineProperty(this, "createInitVariable", (value, parents) => {
|
|
82
|
+
var key = value.templates[0];
|
|
83
|
+
if (this.initVariables.has(key)) {
|
|
84
|
+
return this.initVariables.get(key);
|
|
85
|
+
}
|
|
86
|
+
var root = parents[parents.length - 1];
|
|
87
|
+
(0, _assert.ok)(root.type === "Program");
|
|
88
|
+
var name = this.getPlaceholder();
|
|
89
|
+
this.initVariables.set(key, name);
|
|
90
|
+
(0, _insert.prepend)(root, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(name, value.single().expression)));
|
|
91
|
+
return name;
|
|
92
|
+
});
|
|
97
93
|
(0, _assert.ok)(obfuscator instanceof _obfuscator.default, "obfuscator should be an Obfuscator");
|
|
98
94
|
this.obfuscator = obfuscator;
|
|
99
95
|
this.options = this.obfuscator.options;
|
|
@@ -101,20 +97,41 @@ class Transform {
|
|
|
101
97
|
this.before = [];
|
|
102
98
|
this.after = [];
|
|
103
99
|
}
|
|
100
|
+
|
|
104
101
|
/**
|
|
105
102
|
* The transformation name.
|
|
106
103
|
*/
|
|
107
|
-
|
|
108
|
-
|
|
109
104
|
get className() {
|
|
110
105
|
return _order.ObfuscateOrder[this.priority] || this.__proto__.constructor.name;
|
|
111
106
|
}
|
|
107
|
+
|
|
112
108
|
/**
|
|
113
|
-
*
|
|
114
|
-
* @param tree
|
|
109
|
+
* Gets the `Lock` transformation.
|
|
115
110
|
*/
|
|
111
|
+
get lockTransform() {
|
|
112
|
+
var transform = this.obfuscator.transforms["Lock"];
|
|
113
|
+
(0, _assert.ok)(transform, "Lock transform not created");
|
|
114
|
+
return transform;
|
|
115
|
+
}
|
|
116
116
|
|
|
117
|
+
/**
|
|
118
|
+
* Wraps the given name with the `__JS_CONFUSER_VAR__` function call.
|
|
119
|
+
*
|
|
120
|
+
* If `Rename Variables` is disabled, the name is returned as-is.
|
|
121
|
+
* @param name
|
|
122
|
+
* @returns
|
|
123
|
+
*/
|
|
124
|
+
jsConfuserVar(name) {
|
|
125
|
+
if (!this.obfuscator.transforms["RenameVariables"]) {
|
|
126
|
+
return `"${name}"`;
|
|
127
|
+
}
|
|
128
|
+
return `__JS_CONFUSER_VAR__(${name})`;
|
|
129
|
+
}
|
|
117
130
|
|
|
131
|
+
/**
|
|
132
|
+
* Run an AST through the transformation (including `pre` and `post` transforms)
|
|
133
|
+
* @param tree
|
|
134
|
+
*/
|
|
118
135
|
apply(tree) {
|
|
119
136
|
if (tree.type == "Program" && this.options.verbose) {
|
|
120
137
|
if (this.priority === -1) {
|
|
@@ -123,25 +140,25 @@ class Transform {
|
|
|
123
140
|
console.log("#", this.priority, this.className);
|
|
124
141
|
}
|
|
125
142
|
}
|
|
143
|
+
|
|
126
144
|
/**
|
|
127
145
|
* Run through pre-transformations
|
|
128
146
|
*/
|
|
129
|
-
|
|
130
|
-
|
|
131
147
|
this.before.forEach(x => x.apply(tree));
|
|
148
|
+
|
|
132
149
|
/**
|
|
133
150
|
* Run this transformation
|
|
134
151
|
*/
|
|
135
|
-
|
|
136
152
|
(0, _traverse.default)(tree, (object, parents) => {
|
|
137
153
|
return this.input(object, parents);
|
|
138
154
|
});
|
|
155
|
+
|
|
139
156
|
/**
|
|
140
157
|
* Cleanup transformations
|
|
141
158
|
*/
|
|
142
|
-
|
|
143
159
|
this.after.forEach(x => x.apply(tree));
|
|
144
160
|
}
|
|
161
|
+
|
|
145
162
|
/**
|
|
146
163
|
* The `match` function filters for possible candidates.
|
|
147
164
|
*
|
|
@@ -152,11 +169,10 @@ class Transform {
|
|
|
152
169
|
* @param parents
|
|
153
170
|
* @param block
|
|
154
171
|
*/
|
|
155
|
-
|
|
156
|
-
|
|
157
172
|
match(object, parents) {
|
|
158
173
|
throw new Error("not implemented");
|
|
159
174
|
}
|
|
175
|
+
|
|
160
176
|
/**
|
|
161
177
|
* Modifies the given node.
|
|
162
178
|
*
|
|
@@ -167,22 +183,20 @@ class Transform {
|
|
|
167
183
|
* @param parents - Array of ancestors `[Closest, ..., Root]`
|
|
168
184
|
* @param block
|
|
169
185
|
*/
|
|
170
|
-
|
|
171
|
-
|
|
172
186
|
transform(object, parents) {
|
|
173
187
|
throw new Error("not implemented");
|
|
174
188
|
}
|
|
189
|
+
|
|
175
190
|
/**
|
|
176
191
|
* Calls `.match` with the given parameters, and then `.transform` if satisfied.
|
|
177
192
|
* @private
|
|
178
193
|
*/
|
|
179
|
-
|
|
180
|
-
|
|
181
194
|
input(object, parents) {
|
|
182
195
|
if (this.match(object, parents)) {
|
|
183
196
|
return this.transform(object, parents);
|
|
184
197
|
}
|
|
185
198
|
}
|
|
199
|
+
|
|
186
200
|
/**
|
|
187
201
|
* Returns a random string.
|
|
188
202
|
*
|
|
@@ -190,115 +204,88 @@ class Transform {
|
|
|
190
204
|
*
|
|
191
205
|
* These long temp names will be converted to short, mangled names by RenameVariables.
|
|
192
206
|
*/
|
|
193
|
-
|
|
194
|
-
|
|
195
207
|
getPlaceholder() {
|
|
196
208
|
const genRanHex = size => [...Array(size)].map(() => Math.floor(Math.random() * 10).toString(10)).join("");
|
|
197
|
-
|
|
198
209
|
return _constants.placeholderVariablePrefix + genRanHex(10);
|
|
199
210
|
}
|
|
211
|
+
|
|
200
212
|
/**
|
|
201
213
|
* Returns an independent name generator with it's own counter.
|
|
202
214
|
* @param overrideMode - Override the user's `identifierGenerator` option
|
|
203
215
|
* @returns
|
|
204
216
|
*/
|
|
205
|
-
|
|
206
|
-
|
|
207
217
|
getGenerator(overrideMode) {
|
|
208
218
|
var count = 0;
|
|
209
219
|
var identifiers = new Set();
|
|
210
220
|
return {
|
|
211
221
|
generate: () => {
|
|
212
222
|
var retValue;
|
|
213
|
-
|
|
214
223
|
do {
|
|
215
224
|
count++;
|
|
216
225
|
retValue = this.generateIdentifier(-1, count, overrideMode);
|
|
217
226
|
} while (identifiers.has(retValue));
|
|
218
|
-
|
|
219
227
|
identifiers.add(retValue);
|
|
220
228
|
return retValue;
|
|
221
229
|
}
|
|
222
230
|
};
|
|
223
231
|
}
|
|
232
|
+
|
|
224
233
|
/**
|
|
225
234
|
* Generates a valid variable name.
|
|
226
235
|
* @param length Default length is 6 to 10 characters.
|
|
227
236
|
* @returns **`string`**
|
|
228
237
|
*/
|
|
229
|
-
|
|
230
|
-
|
|
231
238
|
generateIdentifier() {
|
|
239
|
+
var _this = this;
|
|
232
240
|
let length = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : -1;
|
|
233
241
|
let count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
|
|
234
242
|
let overrideMode = arguments.length > 2 ? arguments[2] : undefined;
|
|
235
|
-
|
|
236
243
|
if (length == -1) {
|
|
237
244
|
length = (0, _random.getRandomInteger)(6, 8);
|
|
238
245
|
}
|
|
239
|
-
|
|
240
246
|
var set = new Set();
|
|
241
|
-
|
|
242
247
|
if (count == -1) {
|
|
243
248
|
this.obfuscator.varCount++;
|
|
244
249
|
count = this.obfuscator.varCount;
|
|
245
250
|
set = this.obfuscator.generated;
|
|
246
251
|
}
|
|
247
|
-
|
|
248
252
|
var identifier;
|
|
249
|
-
|
|
250
253
|
do {
|
|
251
254
|
identifier = (0, _probability.ComputeProbabilityMap)(overrideMode || this.options.identifierGenerator, function () {
|
|
252
255
|
let mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "randomized";
|
|
253
|
-
|
|
254
256
|
switch (mode) {
|
|
255
257
|
case "randomized":
|
|
256
258
|
var characters = "_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("");
|
|
257
259
|
var numbers = "0123456789".split("");
|
|
258
260
|
var combined = [...characters, ...numbers];
|
|
259
261
|
var result = "";
|
|
260
|
-
|
|
261
262
|
for (var i = 0; i < length; i++) {
|
|
262
263
|
result += (0, _random.choice)(i == 0 ? characters : combined);
|
|
263
264
|
}
|
|
264
|
-
|
|
265
265
|
return result;
|
|
266
|
-
|
|
267
266
|
case "hexadecimal":
|
|
268
267
|
const genRanHex = size => [...Array(size)].map(() => Math.floor(Math.random() * 16).toString(16)).join("");
|
|
269
|
-
|
|
270
268
|
return "_0x" + genRanHex(length).toUpperCase();
|
|
271
|
-
|
|
272
269
|
case "mangled":
|
|
273
270
|
while (1) {
|
|
274
271
|
var result = (0, _random.alphabeticalGenerator)(count);
|
|
275
272
|
count++;
|
|
276
|
-
|
|
277
273
|
if (_constants.reservedKeywords.has(result) || _constants.reservedIdentifiers.has(result)) {} else {
|
|
278
274
|
return result;
|
|
279
275
|
}
|
|
280
276
|
}
|
|
281
|
-
|
|
282
277
|
throw new Error("impossible but TypeScript insists");
|
|
283
|
-
|
|
284
278
|
case "number":
|
|
285
279
|
return "var_" + count;
|
|
286
|
-
|
|
287
280
|
case "zeroWidth":
|
|
288
|
-
|
|
289
|
-
var safe = "\u200C".repeat(count + 1);
|
|
290
|
-
var base = (0, _random.choice)(keyWords) + safe;
|
|
291
|
-
return base;
|
|
281
|
+
return _this.zeroWidthGenerator.generate();
|
|
292
282
|
}
|
|
293
|
-
|
|
294
283
|
throw new Error("Invalid 'identifierGenerator' mode: " + mode);
|
|
295
284
|
});
|
|
296
285
|
} while (set.has(identifier));
|
|
297
|
-
|
|
298
286
|
if (!identifier) {
|
|
299
287
|
throw new Error("identifier null");
|
|
300
288
|
}
|
|
301
|
-
|
|
302
289
|
set.add(identifier);
|
|
303
290
|
return identifier;
|
|
304
291
|
}
|
|
@@ -309,33 +296,27 @@ class Transform {
|
|
|
309
296
|
* @param text
|
|
310
297
|
* @param i
|
|
311
298
|
*/
|
|
312
|
-
|
|
313
|
-
|
|
314
299
|
addComment(node, text) {
|
|
315
300
|
if (this.options.debugComments) {
|
|
316
|
-
return (0, _gen.AddComment)(node,
|
|
301
|
+
return (0, _gen.AddComment)(node, `[${this.className}] ${text}`);
|
|
317
302
|
}
|
|
318
|
-
|
|
319
303
|
return node;
|
|
320
304
|
}
|
|
321
|
-
|
|
322
305
|
replace(node1, node2) {
|
|
323
306
|
for (var key in node1) {
|
|
324
307
|
delete node1[key];
|
|
325
308
|
}
|
|
326
|
-
|
|
327
309
|
this.objectAssign(node1, node2);
|
|
328
310
|
}
|
|
329
|
-
|
|
330
311
|
replaceIdentifierOrLiteral(node1, node2, parents) {
|
|
331
312
|
// Fix 2. Make parent property key computed
|
|
332
313
|
if (parents[0] && (parents[0].type == "Property" || parents[0].type == "MethodDefinition") && parents[0].key == node1) {
|
|
333
314
|
parents[0].computed = true;
|
|
334
315
|
parents[0].shorthand = false;
|
|
335
316
|
}
|
|
336
|
-
|
|
337
317
|
this.replace(node1, node2);
|
|
338
318
|
}
|
|
319
|
+
|
|
339
320
|
/**
|
|
340
321
|
* Smartly merges two Nodes.
|
|
341
322
|
* - Null checking
|
|
@@ -343,8 +324,6 @@ class Transform {
|
|
|
343
324
|
* @param node1
|
|
344
325
|
* @param node2
|
|
345
326
|
*/
|
|
346
|
-
|
|
347
|
-
|
|
348
327
|
objectAssign(node1, node2) {
|
|
349
328
|
(0, _assert.ok)(node1);
|
|
350
329
|
(0, _assert.ok)(node2);
|
|
@@ -355,46 +334,39 @@ class Transform {
|
|
|
355
334
|
node1._transform = node2._transform = this.className;
|
|
356
335
|
return Object.assign(node1, node2);
|
|
357
336
|
}
|
|
337
|
+
|
|
358
338
|
/**
|
|
359
339
|
* Verbose logging for this transformation.
|
|
360
340
|
* @param messages
|
|
361
341
|
*/
|
|
362
|
-
|
|
363
|
-
|
|
364
342
|
log() {
|
|
365
343
|
if (this.options.verbose) {
|
|
366
344
|
for (var _len = arguments.length, messages = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
367
345
|
messages[_key] = arguments[_key];
|
|
368
346
|
}
|
|
369
|
-
|
|
370
347
|
console.log("[" + this.className + "]", ...messages);
|
|
371
348
|
}
|
|
372
349
|
}
|
|
350
|
+
|
|
373
351
|
/**
|
|
374
352
|
* Verbose logging for warning/important messages.
|
|
375
353
|
* @param messages
|
|
376
354
|
*/
|
|
377
|
-
|
|
378
|
-
|
|
379
355
|
warn() {
|
|
380
356
|
if (this.options.verbose) {
|
|
381
357
|
for (var _len2 = arguments.length, messages = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
382
358
|
messages[_key2] = arguments[_key2];
|
|
383
359
|
}
|
|
384
|
-
|
|
385
360
|
console.log("[ WARN " + this.className + " ]", ...messages);
|
|
386
361
|
}
|
|
387
362
|
}
|
|
363
|
+
|
|
388
364
|
/**
|
|
389
365
|
* Throws an error. Appends the transformation's name to the error's message.
|
|
390
366
|
* @param error
|
|
391
367
|
*/
|
|
392
|
-
|
|
393
|
-
|
|
394
368
|
error(error) {
|
|
395
|
-
throw new Error(
|
|
369
|
+
throw new Error(`${this.className} Error: ${error.message}`);
|
|
396
370
|
}
|
|
397
|
-
|
|
398
371
|
}
|
|
399
|
-
|
|
400
372
|
exports.default = Transform;
|