js-confuser 1.5.8 → 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 +69 -0
- package/README.md +143 -7
- package/dist/index.js +33 -4
- package/dist/obfuscator.js +30 -31
- package/dist/options.js +4 -5
- package/dist/order.js +4 -6
- 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/antiTooling.js +1 -1
- package/dist/transforms/calculator.js +77 -21
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +980 -367
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +8 -3
- package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +25 -26
- package/dist/transforms/deadCode.js +33 -25
- package/dist/transforms/dispatcher.js +7 -6
- package/dist/transforms/es5/antiClass.js +6 -2
- package/dist/transforms/es5/antiDestructuring.js +3 -1
- package/dist/transforms/es5/es5.js +31 -34
- package/dist/transforms/eval.js +11 -0
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +8 -5
- package/dist/transforms/extraction/objectExtraction.js +6 -1
- package/dist/transforms/finalizer.js +82 -0
- package/dist/transforms/flatten.js +82 -55
- package/dist/transforms/hexadecimalNumbers.js +34 -9
- package/dist/transforms/identifier/globalAnalysis.js +88 -0
- package/dist/transforms/identifier/globalConcealing.js +10 -83
- package/dist/transforms/identifier/movedDeclarations.js +2 -8
- package/dist/transforms/identifier/renameVariables.js +39 -27
- package/dist/transforms/identifier/variableAnalysis.js +58 -62
- package/dist/transforms/minify.js +80 -61
- 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 +4 -5
- package/dist/transforms/stack.js +87 -26
- 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 -18
- package/dist/util/compare.js +2 -2
- package/dist/util/gen.js +15 -0
- package/dist/util/insert.js +31 -7
- package/dist/util/random.js +15 -0
- package/package.json +5 -5
- package/src/index.ts +57 -19
- package/src/obfuscator.ts +26 -29
- package/src/options.ts +17 -21
- package/src/order.ts +4 -8
- 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/antiTooling.ts +1 -1
- package/src/transforms/calculator.ts +122 -59
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +1583 -571
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +18 -3
- package/src/transforms/deadCode.ts +383 -26
- package/src/transforms/dispatcher.ts +8 -6
- package/src/transforms/es5/antiClass.ts +10 -1
- package/src/transforms/es5/antiDestructuring.ts +3 -1
- package/src/transforms/es5/es5.ts +32 -77
- package/src/transforms/eval.ts +18 -0
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +9 -6
- package/src/transforms/extraction/objectExtraction.ts +12 -5
- package/src/transforms/finalizer.ts +75 -0
- package/src/transforms/flatten.ts +194 -151
- package/src/transforms/identifier/globalAnalysis.ts +85 -0
- package/src/transforms/identifier/globalConcealing.ts +14 -103
- package/src/transforms/identifier/movedDeclarations.ts +4 -11
- package/src/transforms/identifier/renameVariables.ts +37 -30
- package/src/transforms/identifier/variableAnalysis.ts +66 -73
- package/src/transforms/minify.ts +116 -77
- 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 +6 -7
- package/src/transforms/stack.ts +97 -37
- package/src/transforms/string/encoding.ts +115 -212
- package/src/transforms/string/stringCompression.ts +27 -18
- package/src/transforms/string/stringConcealing.ts +41 -11
- package/src/transforms/string/stringEncoding.ts +18 -18
- package/src/transforms/transform.ts +15 -21
- package/src/traverse.ts +24 -12
- package/src/types.ts +11 -2
- package/src/util/compare.ts +2 -2
- package/src/util/gen.ts +21 -1
- package/src/util/insert.ts +49 -9
- 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 +136 -0
- package/test/code/ES6.test.ts +28 -2
- package/test/code/NewFeatures.test.ts +19 -0
- package/test/index.test.ts +15 -2
- package/test/probability.test.ts +44 -0
- package/test/templates/template.test.ts +1 -1
- package/test/transforms/antiTooling.test.ts +52 -0
- package/test/transforms/calculator.test.ts +40 -0
- package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +713 -149
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +173 -0
- package/test/transforms/deadCode.test.ts +66 -15
- package/test/transforms/dispatcher.test.ts +44 -1
- package/test/transforms/es5/antiClass.test.ts +33 -0
- package/test/transforms/es5/antiDestructuring.test.ts +16 -0
- package/test/transforms/eval.test.ts +53 -0
- package/test/transforms/extraction/objectExtraction.test.ts +21 -0
- package/test/transforms/flatten.test.ts +195 -3
- package/test/transforms/identifier/movedDeclarations.test.ts +27 -0
- package/test/transforms/identifier/renameVariables.test.ts +108 -0
- package/test/transforms/lock/antiDebug.test.ts +2 -2
- package/test/transforms/minify.test.ts +151 -0
- package/test/transforms/preparation.test.ts +157 -0
- package/test/transforms/rgf.test.ts +56 -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 +115 -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/test/util/compare.test.ts +23 -1
- 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/hexadecimalNumbers.ts +0 -31
- 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
|
|