js-confuser 1.7.1 → 1.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -0
- package/README.md +12 -27
- package/dist/compiler.js +2 -8
- package/dist/constants.js +17 -10
- package/dist/index.js +7 -30
- package/dist/obfuscator.js +15 -62
- package/dist/options.js +21 -38
- package/dist/order.js +4 -7
- package/dist/parser.js +5 -13
- package/dist/precedence.js +6 -8
- package/dist/presets.js +4 -6
- package/dist/probability.js +13 -24
- package/dist/templates/bufferToString.js +100 -5
- package/dist/templates/crash.js +51 -9
- package/dist/templates/es5.js +125 -6
- package/dist/templates/functionLength.js +24 -6
- package/dist/templates/globals.js +9 -0
- package/dist/templates/template.js +71 -30
- package/dist/transforms/antiTooling.js +26 -22
- package/dist/transforms/calculator.js +18 -54
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +236 -333
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +46 -25
- package/dist/transforms/deadCode.js +528 -27
- package/dist/transforms/dispatcher.js +106 -110
- 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 +8 -26
- package/dist/transforms/identifier/globalConcealing.js +35 -54
- package/dist/transforms/identifier/movedDeclarations.js +66 -38
- package/dist/transforms/identifier/renameVariables.js +29 -68
- package/dist/transforms/identifier/variableAnalysis.js +21 -48
- package/dist/transforms/lock/antiDebug.js +20 -25
- package/dist/transforms/lock/integrity.js +48 -47
- package/dist/transforms/lock/lock.js +62 -113
- package/dist/transforms/minify.js +77 -108
- package/dist/transforms/opaquePredicates.js +11 -48
- package/dist/transforms/preparation.js +17 -50
- package/dist/transforms/renameLabels.js +5 -22
- package/dist/transforms/rgf.js +93 -69
- package/dist/transforms/shuffle.js +41 -46
- package/dist/transforms/stack.js +35 -98
- package/dist/transforms/string/encoding.js +73 -27
- package/dist/transforms/string/stringCompression.js +44 -68
- package/dist/transforms/string/stringConcealing.js +125 -134
- package/dist/transforms/string/stringEncoding.js +6 -26
- package/dist/transforms/string/stringSplitting.js +5 -30
- package/dist/transforms/transform.js +50 -100
- package/dist/traverse.js +11 -18
- package/dist/util/compare.js +27 -29
- package/dist/util/gen.js +32 -86
- package/dist/util/guard.js +0 -1
- package/dist/util/identifiers.js +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 +5 -36
- package/dist/util/scope.js +6 -3
- package/package.json +3 -3
- package/src/constants.ts +12 -0
- package/src/options.ts +13 -0
- package/src/order.ts +2 -2
- package/src/templates/bufferToString.ts +49 -11
- package/src/templates/functionLength.ts +21 -3
- package/src/templates/globals.ts +3 -0
- package/src/templates/template.ts +85 -25
- package/src/transforms/antiTooling.ts +33 -11
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +2 -2
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +46 -10
- package/src/transforms/deadCode.ts +0 -16
- package/src/transforms/dispatcher.ts +91 -69
- package/src/transforms/es5/antiClass.ts +10 -1
- package/src/transforms/extraction/classExtraction.ts +168 -0
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +9 -10
- package/src/transforms/extraction/objectExtraction.ts +4 -15
- package/src/transforms/flatten.ts +20 -5
- package/src/transforms/identifier/globalConcealing.ts +29 -65
- package/src/transforms/identifier/movedDeclarations.ts +90 -24
- package/src/transforms/minify.ts +27 -12
- package/src/transforms/rgf.ts +94 -5
- package/src/transforms/stack.ts +12 -3
- package/src/transforms/string/encoding.ts +85 -51
- package/src/transforms/string/stringCompression.ts +5 -8
- package/src/transforms/string/stringConcealing.ts +139 -113
- package/src/transforms/string/stringEncoding.ts +1 -2
- package/src/transforms/string/stringSplitting.ts +1 -2
- package/src/transforms/transform.ts +30 -1
- package/src/util/compare.ts +39 -5
- package/src/util/gen.ts +10 -3
- package/src/util/insert.ts +17 -0
- package/src/util/scope.ts +14 -2
- package/test/code/Cash.test.ts +10 -4
- package/test/code/StrictMode.src.js +65 -0
- package/test/code/StrictMode.test.js +37 -0
- package/test/compare.test.ts +62 -2
- package/test/options.test.ts +111 -55
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +37 -18
- package/test/transforms/dispatcher.test.ts +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 +19 -0
- package/test/transforms/identifier/movedDeclarations.test.ts +61 -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
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _assert = require("assert");
|
|
9
|
-
|
|
10
|
-
var _probability = require("../../probability");
|
|
11
|
-
|
|
12
|
-
var _traverse = require("../../traverse");
|
|
13
|
-
|
|
14
|
-
var _gen = require("../../util/gen");
|
|
15
|
-
|
|
16
|
-
var _identifiers = require("../../util/identifiers");
|
|
17
|
-
|
|
18
|
-
var _insert = require("../../util/insert");
|
|
19
|
-
|
|
20
|
-
var _random = require("../../util/random");
|
|
21
|
-
|
|
22
|
-
var _transform = _interopRequireDefault(require("../transform"));
|
|
23
|
-
|
|
24
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Obfuscates For and While statements.
|
|
28
|
-
*/
|
|
29
|
-
class ControlFlowObfuscation extends _transform.default {
|
|
30
|
-
constructor(o) {
|
|
31
|
-
super(o);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
match(object, parents) {
|
|
35
|
-
return object.type === "ForStatement" || object.type === "WhileStatement";
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
transform(object, parents) {
|
|
39
|
-
return () => {
|
|
40
|
-
if (object.$controlFlowObfuscation) {
|
|
41
|
-
// avoid infinite loop
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
if ((0, _identifiers.containsLexicallyBoundVariables)(object, parents)) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
var illegal = false;
|
|
50
|
-
(0, _traverse.walk)(object, parents, (o, p) => {
|
|
51
|
-
if (o.type == "FunctionDeclaration" || o.type == "BreakStatement") {
|
|
52
|
-
illegal = true;
|
|
53
|
-
return "EXIT";
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
if (illegal) {
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
var body = parents[0].type == "LabeledStatement" ? parents[1] : parents[0];
|
|
62
|
-
var element = parents[0].type == "LabeledStatement" ? parents[0] : object; // No place to insert more statements
|
|
63
|
-
|
|
64
|
-
if (!Array.isArray(body)) {
|
|
65
|
-
return;
|
|
66
|
-
} // No place to insert variable declaration
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
if (body.indexOf(element) === -1) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
if (!(0, _probability.ComputeProbabilityMap)(this.options.controlFlowFlattening, x => x)) {
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
var init = [];
|
|
78
|
-
var update = [];
|
|
79
|
-
var test = null;
|
|
80
|
-
var consequent = [];
|
|
81
|
-
|
|
82
|
-
if (object.type === "ForStatement") {
|
|
83
|
-
if (object.init) {
|
|
84
|
-
init.push(object.init);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
if (object.update) {
|
|
88
|
-
update.push((0, _gen.ExpressionStatement)(object.update));
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
if (object.test) {
|
|
92
|
-
test = object.test || (0, _gen.Literal)(true);
|
|
93
|
-
}
|
|
94
|
-
} else if (object.type === "WhileStatement") {
|
|
95
|
-
if (object.test) {
|
|
96
|
-
test = object.test;
|
|
97
|
-
}
|
|
98
|
-
} else {
|
|
99
|
-
throw new Error("Unknown type: " + object.type);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
if (object.body.type == "BlockStatement") {
|
|
103
|
-
consequent.push(...(0, _insert.getBlockBody)(object.body));
|
|
104
|
-
} else {
|
|
105
|
-
consequent.push(object.body);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (!test) {
|
|
109
|
-
test = (0, _gen.Literal)(true);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
(0, _assert.ok)(test);
|
|
113
|
-
init.forEach(o => {
|
|
114
|
-
if (o.type !== "VariableDeclaration" && o.type !== "ExpressionStatement") {
|
|
115
|
-
this.replace(o, (0, _gen.ExpressionStatement)((0, _insert.clone)(o)));
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
var stateVar = this.getPlaceholder();
|
|
119
|
-
var selection = new Set(); // init 0 test 1 run 2 update 3 end 4
|
|
120
|
-
|
|
121
|
-
var states = []; // Create 5 random unique number
|
|
122
|
-
|
|
123
|
-
while (states.length < 5) {
|
|
124
|
-
var newState;
|
|
125
|
-
|
|
126
|
-
do {
|
|
127
|
-
newState = (0, _random.getRandomInteger)(0, 1000 + states.length);
|
|
128
|
-
} while (selection.has(newState));
|
|
129
|
-
|
|
130
|
-
(0, _assert.ok)(!isNaN(newState));
|
|
131
|
-
states.push(newState);
|
|
132
|
-
selection.add(newState);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
(0, _assert.ok)(selection.size === states.length);
|
|
136
|
-
(0, _assert.ok)(states.length === 5);
|
|
137
|
-
var startState = states[0];
|
|
138
|
-
var testState = states[1];
|
|
139
|
-
var bodyState = states[2];
|
|
140
|
-
var updateState = states[3];
|
|
141
|
-
var endState = states[4];
|
|
142
|
-
body.splice(body.indexOf(element), 0, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(stateVar, (0, _gen.Literal)(startState))));
|
|
143
|
-
|
|
144
|
-
function goto(from, to) {
|
|
145
|
-
var diff = to - from;
|
|
146
|
-
(0, _assert.ok)(!isNaN(diff));
|
|
147
|
-
return (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("+=", (0, _gen.Identifier)(stateVar), (0, _gen.Literal)(diff)));
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
var cases = [(0, _gen.SwitchCase)((0, _gen.Literal)(startState), [...init, goto(startState, testState), (0, _gen.BreakStatement)()]), (0, _gen.SwitchCase)((0, _gen.Literal)(testState), [(0, _gen.IfStatement)(test, [goto(testState, bodyState)], [goto(testState, endState)]), (0, _gen.BreakStatement)()]), (0, _gen.SwitchCase)((0, _gen.Literal)(bodyState), [...consequent, goto(bodyState, updateState), (0, _gen.BreakStatement)()]), (0, _gen.SwitchCase)((0, _gen.Literal)(updateState), [...update, goto(updateState, testState), (0, _gen.BreakStatement)()])];
|
|
151
|
-
this.replace(object, (0, _gen.WhileStatement)((0, _gen.BinaryExpression)("!=", (0, _gen.Identifier)(stateVar), (0, _gen.Literal)(endState)), [(0, _gen.SwitchStatement)((0, _gen.Identifier)(stateVar), cases)])); // Marked to not be infinite
|
|
152
|
-
|
|
153
|
-
object.$controlFlowObfuscation = 1;
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
exports.default = ControlFlowObfuscation;
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _traverse = require("../../traverse");
|
|
9
|
-
|
|
10
|
-
var _gen = require("../../util/gen");
|
|
11
|
-
|
|
12
|
-
var _insert = require("../../util/insert");
|
|
13
|
-
|
|
14
|
-
var _random = require("../../util/random");
|
|
15
|
-
|
|
16
|
-
var _transform = _interopRequireDefault(require("../transform"));
|
|
17
|
-
|
|
18
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Does complex math to the state variable, after both CFF and CFO have run.
|
|
22
|
-
*
|
|
23
|
-
* The switch statements are ones with numbered cases and a simple discriminant.
|
|
24
|
-
*/
|
|
25
|
-
class SwitchCaseObfuscation extends _transform.default {
|
|
26
|
-
constructor(o) {
|
|
27
|
-
super(o);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
match(object, parents) {
|
|
31
|
-
return object.type == "SwitchStatement" && (object.$controlFlowFlattening || !object.cases.find(x => !(x.test && typeof x.test === "object" && x.test.type == "Literal" && typeof x.test.value === "number" && Math.abs(x.test.value) < 100000)));
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
transform(object, parents) {
|
|
35
|
-
var types = new Set();
|
|
36
|
-
(0, _traverse.walk)(object.discriminant, [object, ...parents], (o, p) => {
|
|
37
|
-
if (o.type) {
|
|
38
|
-
types.add(o.type);
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
if (!object.$controlFlowFlattening) {
|
|
43
|
-
types.delete("Identifier");
|
|
44
|
-
|
|
45
|
-
if (types.size) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
var body = parents[0];
|
|
51
|
-
var element = object;
|
|
52
|
-
|
|
53
|
-
if (parents[0].type == "LabeledStatement") {
|
|
54
|
-
body = parents[1];
|
|
55
|
-
element = parents[0];
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
if (!Array.isArray(body)) {
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
var index = body.indexOf(element);
|
|
63
|
-
|
|
64
|
-
if (index === -1) {
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
var factor = (0, _random.getRandomInteger)(2, 100);
|
|
69
|
-
var offset = (0, _random.getRandomInteger)(-250, 250);
|
|
70
|
-
var newVar = this.getPlaceholder();
|
|
71
|
-
var newStates = [];
|
|
72
|
-
var max;
|
|
73
|
-
object.cases.forEach((caseObject, i) => {
|
|
74
|
-
if (caseObject.test && caseObject.test.type === "Literal" && typeof caseObject.test.value === "number") {
|
|
75
|
-
var current = caseObject.test.value;
|
|
76
|
-
var value = current * factor + offset;
|
|
77
|
-
newStates[i] = value;
|
|
78
|
-
|
|
79
|
-
if (!max || Math.abs(value) > max) {
|
|
80
|
-
max = Math.abs(value);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
if (max > 100000) {
|
|
86
|
-
return;
|
|
87
|
-
} // State variable declaration
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
body.splice(index, 0, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(newVar, (0, _gen.BinaryExpression)("+", (0, _gen.BinaryExpression)("*", (0, _insert.clone)(object.discriminant), (0, _gen.Literal)(factor)), (0, _gen.Literal)(offset)))));
|
|
91
|
-
object.discriminant = (0, _gen.Identifier)(newVar); // possible so override
|
|
92
|
-
|
|
93
|
-
object.cases.forEach((x, i) => {
|
|
94
|
-
if (x.test) {
|
|
95
|
-
if (x.test.type === "Literal" && typeof x.test.value === "number") {
|
|
96
|
-
x.test = (0, _gen.Literal)(newStates[i]);
|
|
97
|
-
} else {
|
|
98
|
-
x.test = (0, _gen.BinaryExpression)("+", (0, _gen.BinaryExpression)("*", x.test, (0, _gen.Literal)(factor)), (0, _gen.Literal)(offset));
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
exports.default = SwitchCaseObfuscation;
|
package/dist/transforms/eval.js
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _compiler = require("../compiler");
|
|
9
|
-
|
|
10
|
-
var _order = require("../order");
|
|
11
|
-
|
|
12
|
-
var _probability = require("../probability");
|
|
13
|
-
|
|
14
|
-
var _traverse = require("../traverse");
|
|
15
|
-
|
|
16
|
-
var _gen = require("../util/gen");
|
|
17
|
-
|
|
18
|
-
var _insert = require("../util/insert");
|
|
19
|
-
|
|
20
|
-
var _transform = _interopRequireDefault(require("./transform"));
|
|
21
|
-
|
|
22
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
|
-
|
|
24
|
-
class Eval extends _transform.default {
|
|
25
|
-
constructor(o) {
|
|
26
|
-
super(o, _order.ObfuscateOrder.Eval);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
match(object, parents) {
|
|
30
|
-
return (0, _insert.isFunction)(object) && object.type != "ArrowFunctionExpression" && !object.$eval && !object.$dispatcherSkip;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
transform(object, parents) {
|
|
34
|
-
// Don't apply to getter/setters or class methods
|
|
35
|
-
if (parents[0]) {
|
|
36
|
-
if (parents[0].type === "MethodDefinition" && parents[0].value === object) {
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (parents[0].type === "Property" && parents[0].value === object && (parents[0].kind !== "init" || parents[0].method)) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
if (!(0, _probability.ComputeProbabilityMap)(this.options.eval, x => x, object.id && object.id.name)) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
object.$eval = (o, p) => {
|
|
50
|
-
var name;
|
|
51
|
-
var requiresMove = false;
|
|
52
|
-
|
|
53
|
-
if (object.type == "FunctionDeclaration") {
|
|
54
|
-
name = object.id.name;
|
|
55
|
-
object.type = "FunctionExpression";
|
|
56
|
-
object.id = null;
|
|
57
|
-
requiresMove = Array.isArray(p[0]) && (0, _traverse.isBlock)(p[1]);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
var code = (0, _compiler.compileJsSync)(object, this.options);
|
|
61
|
-
|
|
62
|
-
if (object.type == "FunctionExpression") {
|
|
63
|
-
code = "(" + code + ")";
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
var literal = (0, _gen.Literal)(code);
|
|
67
|
-
var expr = (0, _gen.CallExpression)((0, _gen.Identifier)("eval"), [literal]);
|
|
68
|
-
|
|
69
|
-
if (name) {
|
|
70
|
-
expr = (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(name, expr));
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
if (requiresMove) {
|
|
74
|
-
(0, _insert.prepend)(p[1], expr);
|
|
75
|
-
p[0].splice(p[0].indexOf(object), 1);
|
|
76
|
-
} else {
|
|
77
|
-
this.replace(object, expr);
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
exports.default = Eval;
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _transform = _interopRequireDefault(require("./transform"));
|
|
9
|
-
|
|
10
|
-
var _order = require("../order");
|
|
11
|
-
|
|
12
|
-
var _gen = require("../util/gen");
|
|
13
|
-
|
|
14
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* The HexadecimalNumbers transformation converts number literals into the hexadecimal form.
|
|
18
|
-
*
|
|
19
|
-
* This is done by replacing the number literal with an Identifier to ensure escodegen properly outputs it as such
|
|
20
|
-
*
|
|
21
|
-
* This transformation also handles BigInt support, so its always enabled for this reason.
|
|
22
|
-
*/
|
|
23
|
-
class HexadecimalNumbers extends _transform.default {
|
|
24
|
-
constructor(o) {
|
|
25
|
-
super(o, _order.ObfuscateOrder.HexadecimalNumbers);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
isNumberLiteral(object) {
|
|
29
|
-
return object.type === "Literal" && typeof object.value === "number" && Math.floor(object.value) === object.value;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
isBigIntLiteral(object) {
|
|
33
|
-
return object.type === "Literal" && typeof object.value === "bigint";
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
match(object, parents) {
|
|
37
|
-
return this.options.hexadecimalNumbers && this.isNumberLiteral(object) || this.isBigIntLiteral(object);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
transform(object, parents) {
|
|
41
|
-
if (this.isNumberLiteral(object)) {
|
|
42
|
-
return () => {
|
|
43
|
-
// Technically, a Literal will never be negative because it's supposed to be inside a UnaryExpression with a "-" operator.
|
|
44
|
-
// This code handles it regardless
|
|
45
|
-
var isNegative = object.value < 0;
|
|
46
|
-
var hex = Math.abs(object.value).toString(16);
|
|
47
|
-
var newStr = (isNegative ? "-" : "") + "0x" + hex;
|
|
48
|
-
this.replace(object, (0, _gen.Identifier)(newStr));
|
|
49
|
-
};
|
|
50
|
-
} // https://github.com/MichaelXF/js-confuser/issues/79
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
if (this.isBigIntLiteral(object)) {
|
|
54
|
-
return () => {
|
|
55
|
-
// Use an Identifier with the raw string
|
|
56
|
-
this.replace(object, (0, _gen.Identifier)(object.raw));
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
exports.default = HexadecimalNumbers;
|
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _constants = require("../constants");
|
|
9
|
-
|
|
10
|
-
var _order = require("../order");
|
|
11
|
-
|
|
12
|
-
var _traverse = require("../traverse");
|
|
13
|
-
|
|
14
|
-
var _gen = require("../util/gen");
|
|
15
|
-
|
|
16
|
-
var _identifiers = require("../util/identifiers");
|
|
17
|
-
|
|
18
|
-
var _insert = require("../util/insert");
|
|
19
|
-
|
|
20
|
-
var _random = require("../util/random");
|
|
21
|
-
|
|
22
|
-
var _transform = _interopRequireDefault(require("./transform"));
|
|
23
|
-
|
|
24
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
|
-
|
|
26
|
-
class HideInitializingCode extends _transform.default {
|
|
27
|
-
constructor(o) {
|
|
28
|
-
super(o, _order.ObfuscateOrder.HideInitializingCode);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
match(object, parents) {
|
|
32
|
-
return object.type == "Program";
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
transform(object, parents) {
|
|
36
|
-
return () => {
|
|
37
|
-
var body = object.body;
|
|
38
|
-
var hasExport = false;
|
|
39
|
-
var stmts = [];
|
|
40
|
-
var functions = [];
|
|
41
|
-
var exportTypes = new Set(["ExportNamedDeclaration", "ExportSpecifier", "ExportDefaultDeclaration", "ExportAllDeclaration"]);
|
|
42
|
-
var sampledNames = new Set();
|
|
43
|
-
body.forEach(stmt => {
|
|
44
|
-
if (stmt.type == "FunctionDeclaration") {
|
|
45
|
-
functions.push(stmt);
|
|
46
|
-
|
|
47
|
-
if (stmt.id) {
|
|
48
|
-
sampledNames.add(stmt.id.name);
|
|
49
|
-
}
|
|
50
|
-
} else if (exportTypes.has(stmt.type)) {
|
|
51
|
-
hasExport = true;
|
|
52
|
-
} else {
|
|
53
|
-
stmts.push(stmt);
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
if (hasExport) {
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
var definedNames = new Set();
|
|
62
|
-
|
|
63
|
-
const findNames = (o, p) => {
|
|
64
|
-
(0, _identifiers.validateChain)(o, p);
|
|
65
|
-
var context = (0, _insert.getVarContext)(o, p);
|
|
66
|
-
(0, _traverse.walk)(o, p, (oo, pp) => {
|
|
67
|
-
if (oo.type == "Identifier" && !_constants.reservedIdentifiers.has(oo.name) && !this.options.globalVariables.has(oo.name)) {
|
|
68
|
-
var info = (0, _identifiers.getIdentifierInfo)(oo, pp);
|
|
69
|
-
|
|
70
|
-
if (info.spec.isReferenced && info.spec.isDefined && (0, _insert.getVarContext)(oo, pp) === context) {
|
|
71
|
-
definedNames.add(oo.name);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
(0, _traverse.walk)(object, [], (o, p) => {
|
|
78
|
-
if (o.type == "VariableDeclaration" || o.type == "ClassDeclaration") {
|
|
79
|
-
if (p.find(x => (0, _insert.isFunction)(x))) {
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (o.type == "VariableDeclaration") {
|
|
84
|
-
return () => {
|
|
85
|
-
var exprs = [];
|
|
86
|
-
var fi = (0, _insert.isForInitialize)(o, p);
|
|
87
|
-
o.declarations.forEach(declarator => {
|
|
88
|
-
findNames(declarator.id, [declarator, o.declarations, o, ...p]);
|
|
89
|
-
|
|
90
|
-
if (fi === "left-hand") {
|
|
91
|
-
exprs.push({ ...declarator.id
|
|
92
|
-
});
|
|
93
|
-
} else {
|
|
94
|
-
exprs.push((0, _gen.AssignmentExpression)("=", declarator.id, declarator.init || (0, _gen.Identifier)("undefined")));
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
if (fi) {
|
|
99
|
-
this.replace(o, exprs.length > 1 ? (0, _gen.SequenceExpression)(exprs) : exprs[0]);
|
|
100
|
-
} else {
|
|
101
|
-
this.replace(o, (0, _gen.ExpressionStatement)((0, _gen.SequenceExpression)(exprs)));
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
} else if (o.type == "ClassDeclaration") {
|
|
105
|
-
if (o.id.name) {
|
|
106
|
-
definedNames.add(o.id.name);
|
|
107
|
-
this.replace(o, (0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(o.id.name), { ...o,
|
|
108
|
-
type: "ClassExpression"
|
|
109
|
-
})));
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
var addNodes = [];
|
|
115
|
-
|
|
116
|
-
if (definedNames.size) {
|
|
117
|
-
addNodes.push((0, _gen.VariableDeclaration)(Array.from(definedNames).map(name => {
|
|
118
|
-
return (0, _gen.VariableDeclarator)(name);
|
|
119
|
-
})));
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
var deadValues = Object.create(null);
|
|
123
|
-
Array((0, _random.getRandomInteger)(1, 20)).fill(0).forEach(() => {
|
|
124
|
-
var name = this.getPlaceholder();
|
|
125
|
-
var value = (0, _random.getRandomInteger)(-250, 250);
|
|
126
|
-
addNodes.push((0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(name, (0, _gen.Literal)(value))));
|
|
127
|
-
deadValues[name] = value;
|
|
128
|
-
sampledNames.add(name);
|
|
129
|
-
});
|
|
130
|
-
var map = new Map();
|
|
131
|
-
var fnsToMake = (0, _random.getRandomInteger)(1, 5);
|
|
132
|
-
var numberLiteralsMade = 1;
|
|
133
|
-
|
|
134
|
-
function numberLiteral(num) {
|
|
135
|
-
let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
|
|
136
|
-
|
|
137
|
-
if (depth > 6 || Math.random() > 0.8 / depth || Math.random() > 80 / numberLiteralsMade) {
|
|
138
|
-
return (0, _gen.Literal)(num);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
numberLiteralsMade++;
|
|
142
|
-
|
|
143
|
-
function ternaryCall(name) {
|
|
144
|
-
let param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _random.getRandomInteger)(-250, 250);
|
|
145
|
-
return (0, _gen.ConditionalExpression)((0, _gen.BinaryExpression)("==", (0, _gen.UnaryExpression)("typeof", (0, _gen.Identifier)(name)), (0, _gen.Literal)("function")), (0, _gen.CallExpression)((0, _gen.Identifier)(name), [numberLiteral(param, depth + 1)]), (0, _gen.Identifier)(name));
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
if (Math.random() > 0.5) {
|
|
149
|
-
var fnName = (0, _random.choice)(Array.from(map.keys()));
|
|
150
|
-
|
|
151
|
-
if (fnName) {
|
|
152
|
-
var inputOutputs = map.get(fnName);
|
|
153
|
-
var randomInput = (0, _random.choice)(Object.keys(inputOutputs));
|
|
154
|
-
var outputValue = inputOutputs[randomInput];
|
|
155
|
-
var parsed = parseFloat(randomInput);
|
|
156
|
-
return (0, _gen.BinaryExpression)("-", ternaryCall(fnName, parsed), numberLiteral(outputValue - num, depth + 1));
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
var deadValueName = (0, _random.choice)(Object.keys(deadValues));
|
|
161
|
-
var actualValue = deadValues[deadValueName];
|
|
162
|
-
|
|
163
|
-
if (Math.random() > 0.5) {
|
|
164
|
-
return (0, _gen.BinaryExpression)("+", numberLiteral(num - actualValue, depth + 1), ternaryCall(deadValueName));
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return (0, _gen.BinaryExpression)("-", ternaryCall(deadValueName), numberLiteral(actualValue - num, depth + 1));
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
for (var i = 0; i < fnsToMake; i++) {
|
|
171
|
-
var name = this.getPlaceholder();
|
|
172
|
-
var testShift = (0, _random.getRandomInteger)(-250, 250);
|
|
173
|
-
var returnShift = (0, _random.getRandomInteger)(-250, 250);
|
|
174
|
-
var inputs = (0, _random.getRandomInteger)(2, 5);
|
|
175
|
-
var used = new Set();
|
|
176
|
-
var uniqueNumbersNeeded = inputs * 2;
|
|
177
|
-
|
|
178
|
-
for (var j = 0; j < uniqueNumbersNeeded; j++) {
|
|
179
|
-
var num;
|
|
180
|
-
var k = 0;
|
|
181
|
-
|
|
182
|
-
do {
|
|
183
|
-
num = (0, _random.getRandomInteger)(-250, 250 + k * 100);
|
|
184
|
-
k++;
|
|
185
|
-
} while (used.has(num));
|
|
186
|
-
|
|
187
|
-
used.add(num);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
var inputOutput = Object.create(null);
|
|
191
|
-
var array = Array.from(used);
|
|
192
|
-
|
|
193
|
-
for (var j = 0; j < array.length; j += 2) {
|
|
194
|
-
inputOutput[array[j]] = array[j + 1];
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
var cases = Object.keys(inputOutput).map(input => {
|
|
198
|
-
var parsed = parseFloat(input);
|
|
199
|
-
return (0, _gen.SwitchCase)(numberLiteral(parsed + testShift), [(0, _gen.ExpressionStatement)((0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)("input"), numberLiteral(inputOutput[input] - returnShift))), (0, _gen.BreakStatement)()]);
|
|
200
|
-
});
|
|
201
|
-
var functionExpression = (0, _gen.FunctionExpression)([(0, _gen.Identifier)("testShift"), (0, _gen.Identifier)("returnShift")], [(0, _gen.ReturnStatement)((0, _gen.FunctionExpression)([(0, _gen.Identifier)("input")], [(0, _gen.SwitchStatement)((0, _gen.BinaryExpression)("+", (0, _gen.Identifier)("input"), (0, _gen.Identifier)("testShift")), cases), (0, _gen.ReturnStatement)((0, _gen.BinaryExpression)("+", (0, _gen.Identifier)("input"), (0, _gen.Identifier)("returnShift")))]))]);
|
|
202
|
-
var variableDeclaration = (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(name, (0, _gen.CallExpression)(functionExpression, [numberLiteral(testShift), numberLiteral(returnShift)])));
|
|
203
|
-
addNodes.push(variableDeclaration);
|
|
204
|
-
map.set(name, inputOutput);
|
|
205
|
-
sampledNames.add(name);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
var deadNameArray = Object.keys(deadValues);
|
|
209
|
-
var sampledArray = Array.from(sampledNames);
|
|
210
|
-
var check = (0, _random.getRandomInteger)(-250, 250);
|
|
211
|
-
var initName = "init" + this.getPlaceholder(); // Entangle number literals
|
|
212
|
-
|
|
213
|
-
var made = 1; // Limit frequency
|
|
214
|
-
|
|
215
|
-
(0, _traverse.walk)(stmts, [], (o, p) => {
|
|
216
|
-
if (o.type == "Literal" && typeof o.value === "number" && Math.floor(o.value) === o.value && Math.abs(o.value) < 100000 && Math.random() < 4 / made) {
|
|
217
|
-
made++;
|
|
218
|
-
return () => {
|
|
219
|
-
this.replaceIdentifierOrLiteral(o, numberLiteral(o.value), p);
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
}); // Create the new function
|
|
223
|
-
|
|
224
|
-
addNodes.push((0, _gen.FunctionDeclaration)(initName, [], [...stmts]));
|
|
225
|
-
|
|
226
|
-
function truePredicate() {
|
|
227
|
-
return (0, _gen.BinaryExpression)(">", (0, _gen.Literal)(600 + (0, _random.getRandomInteger)(200, 800)), (0, _gen.Literal)(400 - (0, _random.getRandomInteger)(0, 600)));
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
function falsePredicate() {
|
|
231
|
-
return (0, _gen.BinaryExpression)(">", (0, _gen.Literal)(400 - (0, _random.getRandomInteger)(0, 600)), (0, _gen.Literal)(600 + (0, _random.getRandomInteger)(200, 800)));
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
function safeCallExpression(name, param) {
|
|
235
|
-
return (0, _gen.ConditionalExpression)((0, _gen.BinaryExpression)("==", (0, _gen.UnaryExpression)("typeof", (0, _gen.Identifier)(name)), (0, _gen.Literal)("function")), (0, _gen.CallExpression)((0, _gen.MemberExpression)((0, _gen.Identifier)(name), (0, _gen.Identifier)("call"), false), [(0, _gen.ThisExpression)(), numberLiteral(param)]), (0, _gen.Identifier)(name));
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
function ternaryHell(expr) {
|
|
239
|
-
let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
|
|
240
|
-
|
|
241
|
-
if (!depth || depth > 5 || Math.random() > 0.99 / (depth / 2)) {
|
|
242
|
-
return expr;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
var deadCode = safeCallExpression((0, _random.choice)(sampledArray), (0, _random.getRandomInteger)(-250, 250));
|
|
246
|
-
|
|
247
|
-
if (Math.random() > 0.5) {
|
|
248
|
-
return (0, _gen.ConditionalExpression)(truePredicate(), ternaryHell(expr, depth + 1), ternaryHell(deadCode, depth + 1));
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
return (0, _gen.ConditionalExpression)(falsePredicate(), ternaryHell(deadCode, depth + 1), ternaryHell(expr, depth + 1));
|
|
252
|
-
} // Array of random ternary expressions
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
var concealedCall = []; // Add 'dead calls', these expression don't call anything
|
|
256
|
-
|
|
257
|
-
Array((0, _random.getRandomInteger)(2, 8)).fill(0).forEach(() => {
|
|
258
|
-
concealedCall.push((0, _gen.ExpressionStatement)(ternaryHell(safeCallExpression((0, _random.choice)(deadNameArray), (0, _random.getRandomInteger)(-250, 250)))));
|
|
259
|
-
}); // The real call to the 'init' function
|
|
260
|
-
|
|
261
|
-
concealedCall.push((0, _gen.ExpressionStatement)(ternaryHell(safeCallExpression(initName, check))));
|
|
262
|
-
(0, _random.shuffle)(concealedCall);
|
|
263
|
-
(0, _random.shuffle)(functions);
|
|
264
|
-
object.body = [...addNodes, ...functions, ...concealedCall];
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
exports.default = HideInitializingCode;
|