js-confuser 1.5.9 → 1.6.0
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 +2 -2
- package/CHANGELOG.md +32 -0
- package/README.md +143 -7
- package/dist/index.js +9 -21
- package/dist/obfuscator.js +21 -27
- package/dist/options.js +2 -2
- package/dist/order.js +1 -3
- package/dist/probability.js +2 -4
- package/dist/templates/bufferToString.js +13 -0
- package/dist/templates/crash.js +2 -2
- package/dist/templates/es5.js +18 -0
- package/dist/transforms/calculator.js +77 -21
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +980 -367
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +4 -1
- package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +25 -26
- package/dist/transforms/deadCode.js +33 -25
- package/dist/transforms/dispatcher.js +4 -3
- package/dist/transforms/es5/antiDestructuring.js +2 -0
- package/dist/transforms/es5/es5.js +31 -34
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +4 -1
- package/dist/transforms/finalizer.js +82 -0
- package/dist/transforms/flatten.js +21 -17
- package/dist/transforms/identifier/globalAnalysis.js +88 -0
- package/dist/transforms/identifier/globalConcealing.js +10 -83
- package/dist/transforms/identifier/movedDeclarations.js +1 -7
- package/dist/transforms/identifier/renameVariables.js +39 -27
- package/dist/transforms/identifier/variableAnalysis.js +58 -62
- package/dist/transforms/minify.js +58 -55
- package/dist/transforms/opaquePredicates.js +1 -1
- package/dist/transforms/preparation/preparation.js +2 -2
- package/dist/transforms/preparation.js +231 -0
- package/dist/transforms/renameLabels.js +1 -1
- package/dist/transforms/rgf.js +2 -3
- package/dist/transforms/stack.js +86 -25
- package/dist/transforms/string/encoding.js +150 -179
- package/dist/transforms/string/stringCompression.js +14 -15
- package/dist/transforms/string/stringConcealing.js +25 -8
- package/dist/transforms/string/stringEncoding.js +13 -24
- package/dist/transforms/transform.js +11 -18
- package/dist/traverse.js +24 -10
- package/dist/util/gen.js +15 -0
- package/dist/util/insert.js +11 -1
- package/dist/util/random.js +15 -0
- package/package.json +5 -5
- package/src/index.ts +2 -2
- package/src/obfuscator.ts +21 -29
- package/src/options.ts +7 -19
- package/src/order.ts +1 -5
- package/src/probability.ts +2 -3
- package/src/templates/bufferToString.ts +68 -0
- package/src/templates/crash.ts +5 -9
- package/src/templates/es5.ts +131 -0
- package/src/transforms/calculator.ts +122 -59
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +1583 -571
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +4 -1
- package/src/transforms/deadCode.ts +383 -26
- package/src/transforms/dispatcher.ts +4 -3
- package/src/transforms/es5/antiDestructuring.ts +2 -0
- package/src/transforms/es5/es5.ts +32 -77
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +4 -1
- package/src/transforms/{hexadecimalNumbers.ts → finalizer.ts} +29 -13
- package/src/transforms/flatten.ts +24 -34
- package/src/transforms/identifier/globalAnalysis.ts +85 -0
- package/src/transforms/identifier/globalConcealing.ts +14 -103
- package/src/transforms/identifier/movedDeclarations.ts +3 -10
- package/src/transforms/identifier/renameVariables.ts +37 -30
- package/src/transforms/identifier/variableAnalysis.ts +66 -73
- package/src/transforms/minify.ts +80 -73
- package/src/transforms/opaquePredicates.ts +2 -2
- package/src/transforms/preparation.ts +238 -0
- package/src/transforms/renameLabels.ts +2 -2
- package/src/transforms/rgf.ts +2 -4
- package/src/transforms/stack.ts +94 -36
- package/src/transforms/string/encoding.ts +115 -212
- package/src/transforms/string/stringCompression.ts +27 -18
- package/src/transforms/string/stringConcealing.ts +39 -9
- package/src/transforms/string/stringEncoding.ts +18 -18
- package/src/transforms/transform.ts +15 -21
- package/src/traverse.ts +23 -4
- package/src/types.ts +2 -1
- package/src/util/gen.ts +21 -1
- package/src/util/insert.ts +12 -1
- package/src/util/random.ts +13 -0
- package/test/code/Cash.test.ts +1 -1
- package/test/code/Dynamic.test.ts +12 -10
- package/test/code/ES6.src.js +122 -0
- package/test/code/ES6.test.ts +28 -2
- package/test/index.test.ts +2 -1
- package/test/probability.test.ts +44 -0
- package/test/templates/template.test.ts +1 -1
- package/test/transforms/antiTooling.test.ts +22 -0
- package/test/transforms/calculator.test.ts +40 -0
- package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +702 -160
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +173 -0
- package/test/transforms/deadCode.test.ts +66 -15
- package/test/transforms/dispatcher.test.ts +20 -1
- package/test/transforms/es5/antiDestructuring.test.ts +16 -0
- package/test/transforms/flatten.test.ts +49 -0
- package/test/transforms/identifier/movedDeclarations.test.ts +27 -0
- package/test/transforms/identifier/renameVariables.test.ts +82 -0
- package/test/transforms/lock/antiDebug.test.ts +2 -2
- package/test/transforms/minify.test.ts +85 -0
- package/test/transforms/preparation.test.ts +157 -0
- package/test/transforms/rgf.test.ts +0 -29
- package/test/transforms/stack.test.ts +91 -21
- package/test/transforms/string/stringCompression.test.ts +39 -0
- package/test/transforms/string/stringConcealing.test.ts +82 -0
- package/test/transforms/string/stringEncoding.test.ts +53 -2
- package/test/transforms/transform.test.ts +66 -0
- package/test/traverse.test.ts +139 -0
- package/src/transforms/controlFlowFlattening/choiceFlowObfuscation.ts +0 -87
- package/src/transforms/controlFlowFlattening/controlFlowObfuscation.ts +0 -203
- package/src/transforms/controlFlowFlattening/switchCaseObfuscation.ts +0 -130
- package/src/transforms/hideInitializingCode.ts +0 -432
- package/src/transforms/label.ts +0 -64
- package/src/transforms/preparation/nameConflicts.ts +0 -102
- package/src/transforms/preparation/preparation.ts +0 -176
- package/test/transforms/controlFlowFlattening/controlFlowObfuscation.test.ts +0 -101
- package/test/transforms/controlFlowFlattening/switchCaseObfuscation.test.ts +0 -120
- package/test/transforms/hideInitializingCode.test.ts +0 -336
- package/test/transforms/preparation/nameConflicts.test.ts +0 -52
- package/test/transforms/preparation/preparation.test.ts +0 -62
|
@@ -21,10 +21,15 @@ var _precedence = require("../precedence");
|
|
|
21
21
|
|
|
22
22
|
var _template = _interopRequireDefault(require("../templates/template"));
|
|
23
23
|
|
|
24
|
+
var _probability = require("../probability");
|
|
25
|
+
|
|
24
26
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
27
|
|
|
26
28
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
27
29
|
|
|
30
|
+
const allowedBinaryOperators = new Set(["+", "-", "*", "/"]);
|
|
31
|
+
const allowedUnaryOperators = new Set(["!", "void", "typeof", "-", "~", "+"]);
|
|
32
|
+
|
|
28
33
|
class Calculator extends _transform.default {
|
|
29
34
|
constructor(o) {
|
|
30
35
|
super(o, _order.ObfuscateOrder.Calculator);
|
|
@@ -43,7 +48,7 @@ class Calculator extends _transform.default {
|
|
|
43
48
|
|
|
44
49
|
this.ops = Object.create(null);
|
|
45
50
|
this.statesUsed = new Set();
|
|
46
|
-
this.calculatorFn = this.getPlaceholder();
|
|
51
|
+
this.calculatorFn = this.getPlaceholder() + "_calc";
|
|
47
52
|
this.calculatorOpVar = this.getPlaceholder();
|
|
48
53
|
this.calculatorSetOpFn = this.getPlaceholder();
|
|
49
54
|
this.gen = this.getGenerator();
|
|
@@ -59,10 +64,19 @@ class Calculator extends _transform.default {
|
|
|
59
64
|
var leftArg = this.getPlaceholder();
|
|
60
65
|
var rightArg = this.getPlaceholder();
|
|
61
66
|
var switchCases = [];
|
|
62
|
-
Object.keys(this.ops).forEach(
|
|
63
|
-
var
|
|
64
|
-
var
|
|
65
|
-
var body = [
|
|
67
|
+
Object.keys(this.ops).forEach(opKey => {
|
|
68
|
+
var [type, operator] = opKey.split("_");
|
|
69
|
+
var code = this.ops[opKey];
|
|
70
|
+
var body = [];
|
|
71
|
+
|
|
72
|
+
if (type === "Binary") {
|
|
73
|
+
body = [(0, _gen.ReturnStatement)((0, _gen.BinaryExpression)(operator, (0, _gen.Identifier)(leftArg), (0, _gen.Identifier)(rightArg)))];
|
|
74
|
+
} else if (type === "Unary") {
|
|
75
|
+
body = [(0, _gen.ReturnStatement)((0, _gen.UnaryExpression)(operator, (0, _gen.Identifier)(leftArg)))];
|
|
76
|
+
} else {
|
|
77
|
+
throw new Error("Unknown type: " + type);
|
|
78
|
+
}
|
|
79
|
+
|
|
66
80
|
switchCases.push((0, _gen.SwitchCase)((0, _gen.Literal)(code), body));
|
|
67
81
|
});
|
|
68
82
|
var func = (0, _gen.FunctionDeclaration)(this.calculatorFn, [leftArg, rightArg].map(x => (0, _gen.Identifier)(x)), [(0, _gen.SwitchStatement)((0, _gen.Identifier)(this.calculatorOpVar), switchCases)]);
|
|
@@ -75,43 +89,85 @@ class Calculator extends _transform.default {
|
|
|
75
89
|
}
|
|
76
90
|
|
|
77
91
|
match(object, parents) {
|
|
78
|
-
return object.type
|
|
92
|
+
return object.type === "BinaryExpression" || object.type === "UnaryExpression";
|
|
79
93
|
}
|
|
80
94
|
|
|
81
95
|
transform(object, parents) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
if (!allowedOperators.has(operator)) {
|
|
96
|
+
// Allow percentage
|
|
97
|
+
if (!(0, _probability.ComputeProbabilityMap)(this.options.calculator)) {
|
|
86
98
|
return;
|
|
87
99
|
}
|
|
88
100
|
|
|
89
|
-
var
|
|
90
|
-
var
|
|
101
|
+
var operator = object.operator;
|
|
102
|
+
var type;
|
|
91
103
|
|
|
92
|
-
if (
|
|
93
|
-
|
|
104
|
+
if (object.type === "BinaryExpression") {
|
|
105
|
+
type = "Binary";
|
|
106
|
+
|
|
107
|
+
if (!allowedBinaryOperators.has(operator)) {
|
|
108
|
+
return;
|
|
109
|
+
} // Additional checks to ensure complex expressions still work
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
var myPrecedence = _precedence.OPERATOR_PRECEDENCE[operator] + Object.keys(_precedence.OPERATOR_PRECEDENCE).indexOf(operator) / 100;
|
|
113
|
+
var precedences = parents.map(x => x.type == "BinaryExpression" && _precedence.OPERATOR_PRECEDENCE[x.operator] + Object.keys(_precedence.OPERATOR_PRECEDENCE).indexOf(x.operator) / 100); // corrupt AST
|
|
114
|
+
|
|
115
|
+
if (precedences.find(x => x >= myPrecedence)) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (parents.find(x => x.$dispatcherSkip || x.type == "BinaryExpression")) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
94
122
|
}
|
|
95
123
|
|
|
96
|
-
if (
|
|
97
|
-
|
|
124
|
+
if (object.type === "UnaryExpression") {
|
|
125
|
+
type = "Unary";
|
|
126
|
+
|
|
127
|
+
if (!allowedUnaryOperators.has(operator)) {
|
|
128
|
+
return;
|
|
129
|
+
} // Typeof expression fix
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
if (operator === "typeof" && object.argument.type === "Identifier") {
|
|
133
|
+
// `typeof name` is special because it can reference the variable `name` without
|
|
134
|
+
// throwing any errors. If changed, an error could be thrown, breaking the users code
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
98
137
|
}
|
|
99
138
|
|
|
100
139
|
return () => {
|
|
101
|
-
|
|
140
|
+
const opKey = type + "_" + operator;
|
|
141
|
+
|
|
142
|
+
if (typeof this.ops[opKey] !== "number") {
|
|
102
143
|
var newState;
|
|
103
144
|
|
|
104
145
|
do {
|
|
105
|
-
newState = (0, _random.getRandomInteger)(-
|
|
146
|
+
newState = (0, _random.getRandomInteger)(-50, 50 + Object.keys(this.ops).length * 5);
|
|
106
147
|
} while (this.statesUsed.has(newState));
|
|
107
148
|
|
|
108
149
|
(0, _assert.ok)(!isNaN(newState));
|
|
109
150
|
this.statesUsed.add(newState);
|
|
110
|
-
this.ops[
|
|
111
|
-
|
|
151
|
+
this.ops[opKey] = newState;
|
|
152
|
+
|
|
153
|
+
if (type === "Binary") {
|
|
154
|
+
this.log("left ".concat(operator, " right ->"), "".concat(this.calculatorFn, "((").concat(newState, ", left, right)"));
|
|
155
|
+
} else if (type === "Unary") {
|
|
156
|
+
this.log("".concat(operator, "(argument) ->"), "".concat(this.calculatorFn, "(").concat(newState, ", argument)"));
|
|
157
|
+
}
|
|
158
|
+
} // The operator expression sets the operator to be used
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
var operatorExpression = (0, _random.choice)([(0, _gen.AssignmentExpression)("=", (0, _gen.Identifier)(this.calculatorOpVar), (0, _gen.Literal)(this.ops[opKey])), (0, _gen.CallExpression)((0, _gen.Identifier)(this.calculatorSetOpFn), [(0, _gen.Literal)(this.ops[opKey])])]);
|
|
162
|
+
var newExpression;
|
|
163
|
+
|
|
164
|
+
if (type === "Binary") {
|
|
165
|
+
newExpression = (0, _gen.CallExpression)((0, _gen.Identifier)(this.calculatorFn), [object.left, object.right, operatorExpression]);
|
|
166
|
+
} else {
|
|
167
|
+
newExpression = (0, _gen.CallExpression)((0, _gen.Identifier)(this.calculatorFn), [object.argument, operatorExpression]);
|
|
112
168
|
}
|
|
113
169
|
|
|
114
|
-
this.replace(object,
|
|
170
|
+
this.replace(object, newExpression);
|
|
115
171
|
};
|
|
116
172
|
}
|
|
117
173
|
|