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
package/test/code/ES6.src.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
1
3
|
// Variant #1 Using `let`
|
|
2
4
|
let myVariable = 1;
|
|
3
5
|
|
|
@@ -73,3 +75,137 @@ for (var x of [3, 3, 5]) {
|
|
|
73
75
|
sum += x;
|
|
74
76
|
}
|
|
75
77
|
expect(sum).toStrictEqual(11);
|
|
78
|
+
|
|
79
|
+
// Variant #12 More complex for-loop initializer
|
|
80
|
+
var outside = 12;
|
|
81
|
+
for (
|
|
82
|
+
var myFunction = function () {
|
|
83
|
+
return outside;
|
|
84
|
+
};
|
|
85
|
+
false;
|
|
86
|
+
|
|
87
|
+
) {}
|
|
88
|
+
|
|
89
|
+
var TEST_OUTPUT = myFunction();
|
|
90
|
+
|
|
91
|
+
expect(TEST_OUTPUT).toStrictEqual(12);
|
|
92
|
+
|
|
93
|
+
function noLexicalVariables() {
|
|
94
|
+
// Variant #13 For-in statement
|
|
95
|
+
var object = { 100: true, "-87": true, 1000: false };
|
|
96
|
+
var sumOfKeys = 0;
|
|
97
|
+
for (var propertyName in object) {
|
|
98
|
+
if (object[propertyName] === true) {
|
|
99
|
+
sumOfKeys += parseInt(propertyName);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
expect(sumOfKeys).toStrictEqual(13);
|
|
104
|
+
|
|
105
|
+
// Variant #14 For-of statement
|
|
106
|
+
var values = [10, 20, 30, 40, -86];
|
|
107
|
+
var sumOfValues = 0;
|
|
108
|
+
for (var value of values) {
|
|
109
|
+
sumOfValues += value;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
expect(sumOfValues).toStrictEqual(14);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
noLexicalVariables();
|
|
116
|
+
|
|
117
|
+
function useStrictFunction() {
|
|
118
|
+
"use strict";
|
|
119
|
+
|
|
120
|
+
function testThis() {
|
|
121
|
+
// Ensure 'this' behaves like strict mode
|
|
122
|
+
function fun() {
|
|
123
|
+
return this;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
expect(fun() === undefined).toStrictEqual(true);
|
|
127
|
+
expect(fun.call(2) === 2).toStrictEqual(true);
|
|
128
|
+
expect(fun.apply(null) === null).toStrictEqual(true);
|
|
129
|
+
expect(fun.call(undefined) === undefined).toStrictEqual(true);
|
|
130
|
+
expect(fun.bind(true)() === true).toStrictEqual(true);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
testThis();
|
|
134
|
+
|
|
135
|
+
function testArguments() {
|
|
136
|
+
// Ensure arguments behaves like strict-mode
|
|
137
|
+
expect(() => useStrictFunction.arguments).toThrow();
|
|
138
|
+
expect(() => useStrictFunction.caller).toThrow();
|
|
139
|
+
expect(() => arguments.callee).toThrow();
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
testArguments();
|
|
143
|
+
|
|
144
|
+
function testEval() {
|
|
145
|
+
var __NO_JS_CONFUSER_RENAME__myOuterVariable = "Initial Value";
|
|
146
|
+
|
|
147
|
+
// Eval will not leak names
|
|
148
|
+
eval("var __NO_JS_CONFUSER_RENAME__myOuterVariable = 'Incorrect Value';");
|
|
149
|
+
|
|
150
|
+
expect(__NO_JS_CONFUSER_RENAME__myOuterVariable).toStrictEqual(
|
|
151
|
+
"Initial Value"
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
testEval();
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
useStrictFunction();
|
|
159
|
+
|
|
160
|
+
function labeledBreaksAndContinues() {
|
|
161
|
+
var flag = true;
|
|
162
|
+
|
|
163
|
+
label_1: for (var i = 0; i < 20; i++) {
|
|
164
|
+
b: switch (i) {
|
|
165
|
+
case 15:
|
|
166
|
+
c: do {
|
|
167
|
+
if (i !== 15) {
|
|
168
|
+
break c;
|
|
169
|
+
}
|
|
170
|
+
flag = true;
|
|
171
|
+
|
|
172
|
+
break label_1;
|
|
173
|
+
|
|
174
|
+
var fillerVar1;
|
|
175
|
+
var fillerVar2;
|
|
176
|
+
var fillerVar3;
|
|
177
|
+
} while (i == 15);
|
|
178
|
+
|
|
179
|
+
break;
|
|
180
|
+
|
|
181
|
+
case 10:
|
|
182
|
+
continue label_1;
|
|
183
|
+
|
|
184
|
+
default:
|
|
185
|
+
flag = false;
|
|
186
|
+
break b;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
var fillerVar1;
|
|
190
|
+
var fillerVar2;
|
|
191
|
+
var fillerVar3;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
var fillerVar1;
|
|
195
|
+
var fillerVar2;
|
|
196
|
+
var fillerVar3;
|
|
197
|
+
|
|
198
|
+
if (flag) {
|
|
199
|
+
return i;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
var variant15 = labeledBreaksAndContinues();
|
|
204
|
+
expect(variant15).toStrictEqual(15);
|
|
205
|
+
|
|
206
|
+
// Set 'ranAllTest' to TRUE
|
|
207
|
+
ranAllTest = true;
|
|
208
|
+
|
|
209
|
+
function countermeasures() {
|
|
210
|
+
throw new Error("Countermeasures function called.");
|
|
211
|
+
}
|
package/test/code/ES6.test.ts
CHANGED
|
@@ -4,13 +4,39 @@ import JsConfuser from "../../src/index";
|
|
|
4
4
|
|
|
5
5
|
var ES6_JS = readFileSync(join(__dirname, "./ES6.src.js"), "utf-8");
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
test.concurrent("Variant #1: ES6 code on High Preset", async () => {
|
|
8
8
|
var output = await JsConfuser(ES6_JS, {
|
|
9
9
|
target: "node",
|
|
10
10
|
preset: "high",
|
|
11
11
|
});
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
// Ensure 'use strict' directive is preserved
|
|
14
|
+
expect(output.startsWith("'use strict'")).toStrictEqual(true);
|
|
14
15
|
|
|
16
|
+
var ranAllTest = false;
|
|
15
17
|
eval(output);
|
|
18
|
+
|
|
19
|
+
// 'ranAllTest' is set to TRUE by the evaluated code
|
|
20
|
+
expect(ranAllTest).toStrictEqual(true);
|
|
16
21
|
});
|
|
22
|
+
|
|
23
|
+
test.concurrent(
|
|
24
|
+
"Variant #2: ES6 code on High Preset + RGF + Self Defending",
|
|
25
|
+
async () => {
|
|
26
|
+
var output = await JsConfuser(ES6_JS, {
|
|
27
|
+
target: "node",
|
|
28
|
+
preset: "high",
|
|
29
|
+
rgf: true,
|
|
30
|
+
lock: {
|
|
31
|
+
selfDefending: true,
|
|
32
|
+
countermeasures: "countermeasures",
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
var ranAllTest = false;
|
|
37
|
+
eval(output);
|
|
38
|
+
|
|
39
|
+
// 'ranAllTest' is set to TRUE by the evaluated code
|
|
40
|
+
expect(ranAllTest).toStrictEqual(true);
|
|
41
|
+
}
|
|
42
|
+
);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import JsConfuser from "../../src/index";
|
|
2
|
+
|
|
3
|
+
// https://github.com/MichaelXF/js-confuser/issues/79
|
|
4
|
+
test("Variant #1: Support BigInt Literals (1n)", async () => {
|
|
5
|
+
var code = `
|
|
6
|
+
TEST_OUTPUT = 1n;
|
|
7
|
+
`;
|
|
8
|
+
|
|
9
|
+
var output = await JsConfuser(code, {
|
|
10
|
+
target: "node",
|
|
11
|
+
renameVariables: true,
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
var TEST_OUTPUT;
|
|
15
|
+
eval(output);
|
|
16
|
+
|
|
17
|
+
expect(typeof TEST_OUTPUT).toStrictEqual("bigint");
|
|
18
|
+
expect(TEST_OUTPUT).toStrictEqual(1n);
|
|
19
|
+
});
|
package/test/index.test.ts
CHANGED
|
@@ -227,10 +227,23 @@ describe("debugObfuscation", () => {
|
|
|
227
227
|
var output = await debugObfuscation(
|
|
228
228
|
`console.log(1)`,
|
|
229
229
|
{ target: "node", preset: "low" },
|
|
230
|
-
callback
|
|
230
|
+
callback,
|
|
231
|
+
require("perf_hooks").performance
|
|
231
232
|
);
|
|
232
233
|
|
|
233
|
-
expect(typeof output).toStrictEqual("
|
|
234
|
+
expect(typeof output).toStrictEqual("object");
|
|
235
|
+
expect(typeof output.obfuscated).toStrictEqual("string");
|
|
236
|
+
expect(typeof output.obfuscationTime).toStrictEqual("number");
|
|
237
|
+
expect(typeof output.compileTime).toStrictEqual("number");
|
|
238
|
+
expect(typeof output.parseTime).toStrictEqual("number");
|
|
239
|
+
expect(typeof output.totalPossibleTransforms).toStrictEqual("number");
|
|
240
|
+
expect(typeof output.totalTransforms).toStrictEqual("number");
|
|
241
|
+
expect(typeof output.transformationTimes).toStrictEqual("object");
|
|
242
|
+
expect(typeof output.transformationTimes.RenameVariables).toStrictEqual(
|
|
243
|
+
"number"
|
|
244
|
+
);
|
|
245
|
+
|
|
246
|
+
eval(output.obfuscated);
|
|
234
247
|
expect(called).toStrictEqual(true);
|
|
235
248
|
});
|
|
236
249
|
});
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { isProbabilityMapProbable } from "../src/probability";
|
|
2
|
+
|
|
3
|
+
describe("isProbabilityMapProbable", function () {
|
|
4
|
+
test("Variant #1: True examples", function () {
|
|
5
|
+
expect(isProbabilityMapProbable(true)).toStrictEqual(true);
|
|
6
|
+
expect(isProbabilityMapProbable(1)).toStrictEqual(true);
|
|
7
|
+
expect(isProbabilityMapProbable(0.1)).toStrictEqual(true);
|
|
8
|
+
|
|
9
|
+
expect(
|
|
10
|
+
isProbabilityMapProbable({
|
|
11
|
+
mode: 1,
|
|
12
|
+
})
|
|
13
|
+
).toStrictEqual(true);
|
|
14
|
+
|
|
15
|
+
expect(isProbabilityMapProbable(["mode"])).toStrictEqual(true);
|
|
16
|
+
|
|
17
|
+
// Function are always true
|
|
18
|
+
expect(isProbabilityMapProbable(() => true)).toStrictEqual(true);
|
|
19
|
+
expect(isProbabilityMapProbable(() => false)).toStrictEqual(true);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test("Variant #2: False examples", function () {
|
|
23
|
+
expect(isProbabilityMapProbable(false)).toStrictEqual(false);
|
|
24
|
+
expect(isProbabilityMapProbable(0)).toStrictEqual(false);
|
|
25
|
+
expect(isProbabilityMapProbable(undefined)).toStrictEqual(false);
|
|
26
|
+
expect(isProbabilityMapProbable(null)).toStrictEqual(false);
|
|
27
|
+
|
|
28
|
+
expect(isProbabilityMapProbable([false])).toStrictEqual(false);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test("Variant #3: Invalid examples", function () {
|
|
32
|
+
// Invalid percentage
|
|
33
|
+
expect(() => isProbabilityMapProbable(1.1)).toThrow();
|
|
34
|
+
expect(() => isProbabilityMapProbable(50)).toThrow();
|
|
35
|
+
expect(() => isProbabilityMapProbable(-0.1)).toThrow();
|
|
36
|
+
expect(() => isProbabilityMapProbable(NaN)).toThrow();
|
|
37
|
+
|
|
38
|
+
// Empty object
|
|
39
|
+
expect(() => isProbabilityMapProbable({})).toThrow();
|
|
40
|
+
|
|
41
|
+
// Empty array
|
|
42
|
+
expect(() => isProbabilityMapProbable([])).toThrow();
|
|
43
|
+
});
|
|
44
|
+
});
|
|
@@ -3,7 +3,7 @@ import Template from "../../src/templates/template";
|
|
|
3
3
|
describe("Template", () => {
|
|
4
4
|
test("Variant #1: Error when invalid code passed in", () => {
|
|
5
5
|
var _consoleError = console.error;
|
|
6
|
-
console.error =
|
|
6
|
+
console.error = () => {};
|
|
7
7
|
|
|
8
8
|
expect(() => {
|
|
9
9
|
Template(`#&!#Ylet{}class)--1]?|:!@#`).compile();
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import JsConfuser from "../../src/index";
|
|
2
|
+
|
|
3
|
+
// https://github.com/MichaelXF/js-confuser/issues/74
|
|
4
|
+
test("Variant #1: Don't break Symbols", async () => {
|
|
5
|
+
if (typeof Symbol !== "undefined") {
|
|
6
|
+
for (var i = 0; i < 6; i++) {
|
|
7
|
+
var output = await JsConfuser(
|
|
8
|
+
`
|
|
9
|
+
|
|
10
|
+
var sym1 = Symbol();
|
|
11
|
+
|
|
12
|
+
if (true) {
|
|
13
|
+
sym1;
|
|
14
|
+
sym1;
|
|
15
|
+
sym1;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
TEST_OUTPUT = sym1;
|
|
19
|
+
|
|
20
|
+
`,
|
|
21
|
+
{ target: "node", renameVariables: true }
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
var TEST_OUTPUT;
|
|
25
|
+
|
|
26
|
+
eval(output);
|
|
27
|
+
expect(typeof TEST_OUTPUT).toStrictEqual("symbol");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test("Variant #2: Join expressions into sequence expressions", async () => {
|
|
33
|
+
var output = await JsConfuser(
|
|
34
|
+
`
|
|
35
|
+
TEST_OUTPUT = 0;
|
|
36
|
+
TEST_OUTPUT++;
|
|
37
|
+
TEST_OUTPUT++;
|
|
38
|
+
TEST_OUTPUT++;
|
|
39
|
+
if(TEST_OUTPUT > 0) {
|
|
40
|
+
TEST_OUTPUT *= 2;
|
|
41
|
+
}
|
|
42
|
+
`,
|
|
43
|
+
{ target: "node", renameVariables: true }
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
expect(output).toContain("(TEST_OUTPUT=0,TEST_OUTPUT++");
|
|
47
|
+
|
|
48
|
+
var TEST_OUTPUT;
|
|
49
|
+
eval(output);
|
|
50
|
+
|
|
51
|
+
expect(TEST_OUTPUT).toStrictEqual(6);
|
|
52
|
+
});
|
|
@@ -36,3 +36,43 @@ it("should execute property with complex operations", async () => {
|
|
|
36
36
|
|
|
37
37
|
expect(value).toStrictEqual(5618);
|
|
38
38
|
});
|
|
39
|
+
|
|
40
|
+
it("should apply to unary operators", async () => {
|
|
41
|
+
var code = `
|
|
42
|
+
var one = +1;
|
|
43
|
+
var negativeOne = -one;
|
|
44
|
+
|
|
45
|
+
var trueValue = true;
|
|
46
|
+
var falseValue = !trueValue;
|
|
47
|
+
|
|
48
|
+
TEST_OUTPUT = typeof (1, falseValue) === "boolean" && negativeOne === ~~-1 && void 0 === undefined;
|
|
49
|
+
`;
|
|
50
|
+
|
|
51
|
+
var output = await JsConfuser(code, { target: "node", calculator: true });
|
|
52
|
+
|
|
53
|
+
expect(output).toContain("_calc");
|
|
54
|
+
expect(output).not.toContain("+1");
|
|
55
|
+
expect(output).not.toContain("-one");
|
|
56
|
+
expect(output).not.toContain("typeof(1,falseValue)");
|
|
57
|
+
expect(output).not.toContain("void 0");
|
|
58
|
+
|
|
59
|
+
var TEST_OUTPUT = true;
|
|
60
|
+
eval(output);
|
|
61
|
+
|
|
62
|
+
expect(TEST_OUTPUT).toStrictEqual(true);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("should not break typeof expressions", async () => {
|
|
66
|
+
var code = `
|
|
67
|
+
TEST_OUTPUT = typeof nonExistentVariable === "undefined";
|
|
68
|
+
`;
|
|
69
|
+
|
|
70
|
+
var output = await JsConfuser(code, { target: "node", calculator: true });
|
|
71
|
+
|
|
72
|
+
expect(output).not.toContain("_calc");
|
|
73
|
+
|
|
74
|
+
var TEST_OUTPUT;
|
|
75
|
+
eval(output);
|
|
76
|
+
|
|
77
|
+
expect(TEST_OUTPUT).toStrictEqual(true);
|
|
78
|
+
});
|