js-confuser 1.2.2 → 1.4.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 +132 -0
- package/README.md +4 -1
- package/dist/parser.js +1 -2
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +482 -91
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +4 -0
- package/dist/transforms/controlFlowFlattening/{switchCaseObfucation.js → switchCaseObfuscation.js} +2 -2
- package/dist/transforms/deadCode.js +1 -1
- package/dist/transforms/dispatcher.js +7 -6
- package/dist/transforms/eval.js +1 -1
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +4 -2
- package/dist/transforms/hideInitializingCode.js +4 -1
- package/dist/transforms/identifier/globalConcealing.js +18 -8
- package/dist/transforms/identifier/variableAnalysis.js +1 -1
- package/dist/transforms/label.js +11 -2
- package/dist/transforms/lock/antiDebug.js +32 -13
- package/dist/transforms/lock/lock.js +3 -3
- package/dist/transforms/minify.js +2 -2
- package/dist/transforms/opaquePredicates.js +4 -2
- package/dist/transforms/preparation/preparation.js +8 -0
- package/dist/transforms/renameLabels.js +17 -3
- package/dist/transforms/rgf.js +8 -3
- package/dist/transforms/stack.js +1 -1
- package/dist/transforms/string/encoding.js +74 -0
- package/dist/transforms/string/stringCompression.js +6 -2
- package/dist/transforms/string/stringConcealing.js +1 -1
- package/dist/transforms/string/stringSplitting.js +6 -0
- package/dist/traverse.js +0 -34
- package/dist/util/gen.js +3 -1
- package/dist/util/identifiers.js +8 -18
- package/dist/util/insert.js +4 -38
- package/package.json +2 -2
- package/src/options.ts +3 -3
- package/src/parser.ts +1 -2
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +735 -134
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +6 -0
- package/src/transforms/controlFlowFlattening/{switchCaseObfucation.ts → switchCaseObfuscation.ts} +6 -2
- package/src/transforms/deadCode.ts +8 -0
- package/src/transforms/dispatcher.ts +16 -6
- package/src/transforms/eval.ts +2 -1
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +40 -5
- package/src/transforms/hideInitializingCode.ts +432 -425
- package/src/transforms/identifier/globalConcealing.ts +102 -38
- package/src/transforms/identifier/variableAnalysis.ts +1 -1
- package/src/transforms/label.ts +20 -2
- package/src/transforms/lock/antiDebug.ts +69 -33
- package/src/transforms/lock/lock.ts +4 -5
- package/src/transforms/minify.ts +2 -1
- package/src/transforms/opaquePredicates.ts +25 -3
- package/src/transforms/preparation/preparation.ts +8 -1
- package/src/transforms/renameLabels.ts +26 -3
- package/src/transforms/rgf.ts +6 -1
- package/src/transforms/stack.ts +2 -1
- package/src/transforms/string/encoding.ts +107 -1
- package/src/transforms/string/stringCompression.ts +28 -3
- package/src/transforms/string/stringConcealing.ts +2 -0
- package/src/transforms/string/stringSplitting.ts +11 -0
- package/src/transforms/transform.ts +1 -2
- package/src/traverse.ts +0 -30
- package/src/util/gen.ts +5 -3
- package/src/util/identifiers.ts +18 -19
- package/src/util/insert.ts +10 -76
- package/src/util/scope.ts +9 -9
- package/test/{transforms/compare.test.ts → compare.test.ts} +2 -2
- package/test/index.test.ts +109 -1
- package/test/templates/template.test.ts +14 -0
- package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +392 -10
- package/test/transforms/dispatcher.test.ts +30 -0
- package/test/transforms/eval.test.ts +28 -0
- package/test/transforms/flatten.test.ts +28 -0
- package/test/transforms/hideInitializingCode.test.ts +336 -336
- package/test/transforms/identifier/renameVariables.test.ts +31 -0
- package/test/transforms/lock/antiDebug.test.ts +43 -0
- package/test/transforms/renameLabels.test.ts +33 -0
- package/test/transforms/rgf.test.ts +29 -0
- package/test/transforms/string/stringSplitting.test.ts +33 -0
- package/test/util/identifiers.test.ts +105 -17
- package/dist/util/expr.js +0 -60
- package/src/util/expr.ts +0 -56
|
@@ -1,336 +1,336 @@
|
|
|
1
|
-
import JsConfuser from "../../src/index";
|
|
2
|
-
|
|
3
|
-
test("Variant #1: Do not apply with exported names", async () => {
|
|
4
|
-
var output = await JsConfuser.obfuscate(
|
|
5
|
-
`
|
|
6
|
-
export function myFunction(){
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
`,
|
|
10
|
-
{
|
|
11
|
-
target: "node",
|
|
12
|
-
hideInitializingCode: true,
|
|
13
|
-
}
|
|
14
|
-
);
|
|
15
|
-
|
|
16
|
-
expect(output).not.toContain("__p_");
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
test("Variant #2: Add ternary expressions and wrap initializing code in a function and still work", async () => {
|
|
20
|
-
var output = await JsConfuser.obfuscate(
|
|
21
|
-
`
|
|
22
|
-
var myNumber = 10;
|
|
23
|
-
input(myNumber)
|
|
24
|
-
`,
|
|
25
|
-
{
|
|
26
|
-
target: "node",
|
|
27
|
-
hideInitializingCode: true,
|
|
28
|
-
}
|
|
29
|
-
);
|
|
30
|
-
|
|
31
|
-
expect(output).toContain("__p_");
|
|
32
|
-
expect(output).toContain("function ");
|
|
33
|
-
expect(output).toContain("?");
|
|
34
|
-
|
|
35
|
-
var value = "never_called";
|
|
36
|
-
function input(valueIn) {
|
|
37
|
-
value = valueIn;
|
|
38
|
-
}
|
|
39
|
-
eval(output);
|
|
40
|
-
|
|
41
|
-
expect(value).toStrictEqual(10);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
test("Variant #3: Should work with other function declarations", async () => {
|
|
45
|
-
var output = await JsConfuser.obfuscate(
|
|
46
|
-
`
|
|
47
|
-
var myNumber = myFunction();
|
|
48
|
-
input(myNumber)
|
|
49
|
-
|
|
50
|
-
function myFunction(){
|
|
51
|
-
return 10;
|
|
52
|
-
}
|
|
53
|
-
`,
|
|
54
|
-
{
|
|
55
|
-
target: "node",
|
|
56
|
-
hideInitializingCode: true,
|
|
57
|
-
}
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
expect(output).toContain("__p_");
|
|
61
|
-
expect(output).toContain("function ");
|
|
62
|
-
|
|
63
|
-
var value = "never_called";
|
|
64
|
-
function input(valueIn) {
|
|
65
|
-
value = valueIn;
|
|
66
|
-
}
|
|
67
|
-
eval(output);
|
|
68
|
-
|
|
69
|
-
expect(value).toStrictEqual(10);
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
test("Variant #4: Should work when doubly obfuscated", async () => {
|
|
73
|
-
var output = await JsConfuser.obfuscate(
|
|
74
|
-
`
|
|
75
|
-
var myNumber = myFunction();
|
|
76
|
-
input(myNumber)
|
|
77
|
-
|
|
78
|
-
function myFunction(){
|
|
79
|
-
return 10;
|
|
80
|
-
}
|
|
81
|
-
`,
|
|
82
|
-
{
|
|
83
|
-
target: "node",
|
|
84
|
-
hideInitializingCode: true,
|
|
85
|
-
}
|
|
86
|
-
);
|
|
87
|
-
|
|
88
|
-
expect(output).toContain("__p_");
|
|
89
|
-
expect(output).toContain("function ");
|
|
90
|
-
|
|
91
|
-
var doublyObfuscated = await JsConfuser.obfuscate(output, {
|
|
92
|
-
target: "node",
|
|
93
|
-
hideInitializingCode: true,
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
var value = "never_called";
|
|
97
|
-
function input(valueIn) {
|
|
98
|
-
value = valueIn;
|
|
99
|
-
}
|
|
100
|
-
eval(doublyObfuscated);
|
|
101
|
-
|
|
102
|
-
expect(value).toStrictEqual(10);
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
test("Variant #5: Should bring up variable declarations", async () => {
|
|
106
|
-
var output = await JsConfuser.obfuscate(
|
|
107
|
-
`
|
|
108
|
-
var myNumber = 10;
|
|
109
|
-
function myFunction(){
|
|
110
|
-
return myNumber;
|
|
111
|
-
}
|
|
112
|
-
input(myFunction())
|
|
113
|
-
`,
|
|
114
|
-
{
|
|
115
|
-
target: "node",
|
|
116
|
-
hideInitializingCode: true,
|
|
117
|
-
}
|
|
118
|
-
);
|
|
119
|
-
|
|
120
|
-
expect(output).toContain("__p_");
|
|
121
|
-
expect(output).toContain("function ");
|
|
122
|
-
expect(output).toContain("var myNumber;");
|
|
123
|
-
expect(output).toContain("myNumber=");
|
|
124
|
-
|
|
125
|
-
var value = "never_called";
|
|
126
|
-
function input(valueIn) {
|
|
127
|
-
value = valueIn;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
eval(output);
|
|
131
|
-
|
|
132
|
-
expect(value).toStrictEqual(10);
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
test("Variant #6: Should not bring up variable declarations in nested contexts", async () => {
|
|
136
|
-
var output = await JsConfuser.obfuscate(
|
|
137
|
-
`
|
|
138
|
-
function myFunction(){
|
|
139
|
-
function myNestedFunction(){
|
|
140
|
-
var myNumber = 10;
|
|
141
|
-
return myNumber;
|
|
142
|
-
}
|
|
143
|
-
return myNestedFunction();
|
|
144
|
-
}
|
|
145
|
-
input(myFunction())
|
|
146
|
-
`,
|
|
147
|
-
{
|
|
148
|
-
target: "node",
|
|
149
|
-
hideInitializingCode: true,
|
|
150
|
-
}
|
|
151
|
-
);
|
|
152
|
-
|
|
153
|
-
expect(output).toContain("__p_");
|
|
154
|
-
expect(output).toContain("function ");
|
|
155
|
-
expect(output).toContain("var myNumber=");
|
|
156
|
-
|
|
157
|
-
var value = "never_called";
|
|
158
|
-
function input(valueIn) {
|
|
159
|
-
value = valueIn;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
eval(output);
|
|
163
|
-
|
|
164
|
-
expect(value).toStrictEqual(10);
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
test("Variant #7: Should bring up class declarations", async () => {
|
|
168
|
-
var output = await JsConfuser.obfuscate(
|
|
169
|
-
`
|
|
170
|
-
|
|
171
|
-
class MyClass {
|
|
172
|
-
static getNumber(){
|
|
173
|
-
return 10;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
function myFunction(){
|
|
178
|
-
return MyClass.getNumber();
|
|
179
|
-
}
|
|
180
|
-
input(myFunction())
|
|
181
|
-
`,
|
|
182
|
-
{
|
|
183
|
-
target: "node",
|
|
184
|
-
hideInitializingCode: true,
|
|
185
|
-
}
|
|
186
|
-
);
|
|
187
|
-
|
|
188
|
-
expect(output).toContain("__p_");
|
|
189
|
-
expect(output).toContain("function ");
|
|
190
|
-
expect(output).toContain("var MyClass;");
|
|
191
|
-
expect(output).toContain("MyClass=class MyClass{");
|
|
192
|
-
|
|
193
|
-
var value = "never_called";
|
|
194
|
-
function input(valueIn) {
|
|
195
|
-
value = valueIn;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
eval(output);
|
|
199
|
-
|
|
200
|
-
expect(value).toStrictEqual(10);
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
test("Variant #8: Should bring up variable declarations in for statements", async () => {
|
|
204
|
-
var output = await JsConfuser.obfuscate(
|
|
205
|
-
`
|
|
206
|
-
|
|
207
|
-
for(var i=0; i <= 9; i++){
|
|
208
|
-
|
|
209
|
-
} // i ends as 10
|
|
210
|
-
|
|
211
|
-
function myFunction(){
|
|
212
|
-
return i;
|
|
213
|
-
}
|
|
214
|
-
input(myFunction())
|
|
215
|
-
`,
|
|
216
|
-
{
|
|
217
|
-
target: "node",
|
|
218
|
-
hideInitializingCode: true,
|
|
219
|
-
}
|
|
220
|
-
);
|
|
221
|
-
|
|
222
|
-
expect(output).toContain("__p_");
|
|
223
|
-
expect(output).toContain("function ");
|
|
224
|
-
|
|
225
|
-
var value = "never_called";
|
|
226
|
-
function input(valueIn) {
|
|
227
|
-
value = valueIn;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
eval(output);
|
|
231
|
-
|
|
232
|
-
expect(value).toStrictEqual(10);
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
test("Variant #9: Should bring up variable declarations in for in statements", async () => {
|
|
236
|
-
var output = await JsConfuser.obfuscate(
|
|
237
|
-
`
|
|
238
|
-
|
|
239
|
-
var myNumber = 0;
|
|
240
|
-
var myArray = [0,1,2,3,4,5,6,7,8,9,10];
|
|
241
|
-
for(var i in myArray){
|
|
242
|
-
if(i==10){
|
|
243
|
-
myNumber = 10;
|
|
244
|
-
}
|
|
245
|
-
} // i ends as "10"
|
|
246
|
-
|
|
247
|
-
function myFunction(){
|
|
248
|
-
return parseInt(i);
|
|
249
|
-
}
|
|
250
|
-
input(myFunction())
|
|
251
|
-
`,
|
|
252
|
-
{
|
|
253
|
-
target: "node",
|
|
254
|
-
hideInitializingCode: true,
|
|
255
|
-
}
|
|
256
|
-
);
|
|
257
|
-
|
|
258
|
-
expect(output).toContain("__p_");
|
|
259
|
-
expect(output).toContain("function ");
|
|
260
|
-
|
|
261
|
-
var value = "never_called";
|
|
262
|
-
function input(valueIn) {
|
|
263
|
-
value = valueIn;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
eval(output);
|
|
267
|
-
|
|
268
|
-
expect(value).toStrictEqual(10);
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
test("Variant #10: Should work with multiple variable declarations", async () => {
|
|
272
|
-
var output = await JsConfuser.obfuscate(
|
|
273
|
-
`
|
|
274
|
-
|
|
275
|
-
var myNumber1 = 3, myNumber2 = 2;
|
|
276
|
-
|
|
277
|
-
function myFunction(){
|
|
278
|
-
return myNumber1*2 + myNumber2*2;
|
|
279
|
-
}
|
|
280
|
-
input(myFunction())
|
|
281
|
-
`,
|
|
282
|
-
{
|
|
283
|
-
target: "node",
|
|
284
|
-
hideInitializingCode: true,
|
|
285
|
-
}
|
|
286
|
-
);
|
|
287
|
-
|
|
288
|
-
expect(output).toContain("__p_");
|
|
289
|
-
expect(output).toContain("function ");
|
|
290
|
-
|
|
291
|
-
var value = "never_called";
|
|
292
|
-
function input(valueIn) {
|
|
293
|
-
value = valueIn;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
eval(output);
|
|
297
|
-
|
|
298
|
-
expect(value).toStrictEqual(10);
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
test("Variant #11: Should bring up variable declaration but not default values function expression's variables", async () => {
|
|
302
|
-
var output = await JsConfuser.obfuscate(
|
|
303
|
-
`
|
|
304
|
-
|
|
305
|
-
var [myNumber1 = function(){
|
|
306
|
-
var myNumber = 2;
|
|
307
|
-
}] = [10];
|
|
308
|
-
|
|
309
|
-
function myFunction(){
|
|
310
|
-
return myNumber1;
|
|
311
|
-
}
|
|
312
|
-
input(myFunction())
|
|
313
|
-
`,
|
|
314
|
-
{
|
|
315
|
-
target: "node",
|
|
316
|
-
hideInitializingCode: true,
|
|
317
|
-
}
|
|
318
|
-
);
|
|
319
|
-
|
|
320
|
-
expect(output).toContain("__p_");
|
|
321
|
-
expect(output).toContain("function ");
|
|
322
|
-
expect(output).toContain("var myNumber1;");
|
|
323
|
-
expect(output).toContain("[myNumber1");
|
|
324
|
-
expect(output).toContain("=[");
|
|
325
|
-
|
|
326
|
-
expect(output).toContain("var myNumber=");
|
|
327
|
-
|
|
328
|
-
var value = "never_called";
|
|
329
|
-
function input(valueIn) {
|
|
330
|
-
value = valueIn;
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
eval(output);
|
|
334
|
-
|
|
335
|
-
expect(value).toStrictEqual(10);
|
|
336
|
-
});
|
|
1
|
+
import JsConfuser from "../../src/index";
|
|
2
|
+
|
|
3
|
+
test("Variant #1: Do not apply with exported names", async () => {
|
|
4
|
+
var output = await JsConfuser.obfuscate(
|
|
5
|
+
`
|
|
6
|
+
export function myFunction(){
|
|
7
|
+
|
|
8
|
+
}
|
|
9
|
+
`,
|
|
10
|
+
{
|
|
11
|
+
target: "node",
|
|
12
|
+
hideInitializingCode: true,
|
|
13
|
+
}
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
expect(output).not.toContain("__p_");
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test("Variant #2: Add ternary expressions and wrap initializing code in a function and still work", async () => {
|
|
20
|
+
var output = await JsConfuser.obfuscate(
|
|
21
|
+
`
|
|
22
|
+
var myNumber = 10;
|
|
23
|
+
input(myNumber)
|
|
24
|
+
`,
|
|
25
|
+
{
|
|
26
|
+
target: "node",
|
|
27
|
+
hideInitializingCode: true,
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
expect(output).toContain("__p_");
|
|
32
|
+
expect(output).toContain("function ");
|
|
33
|
+
expect(output).toContain("?");
|
|
34
|
+
|
|
35
|
+
var value = "never_called";
|
|
36
|
+
function input(valueIn) {
|
|
37
|
+
value = valueIn;
|
|
38
|
+
}
|
|
39
|
+
eval(output);
|
|
40
|
+
|
|
41
|
+
expect(value).toStrictEqual(10);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test("Variant #3: Should work with other function declarations", async () => {
|
|
45
|
+
var output = await JsConfuser.obfuscate(
|
|
46
|
+
`
|
|
47
|
+
var myNumber = myFunction();
|
|
48
|
+
input(myNumber)
|
|
49
|
+
|
|
50
|
+
function myFunction(){
|
|
51
|
+
return 10;
|
|
52
|
+
}
|
|
53
|
+
`,
|
|
54
|
+
{
|
|
55
|
+
target: "node",
|
|
56
|
+
hideInitializingCode: true,
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
expect(output).toContain("__p_");
|
|
61
|
+
expect(output).toContain("function ");
|
|
62
|
+
|
|
63
|
+
var value = "never_called";
|
|
64
|
+
function input(valueIn) {
|
|
65
|
+
value = valueIn;
|
|
66
|
+
}
|
|
67
|
+
eval(output);
|
|
68
|
+
|
|
69
|
+
expect(value).toStrictEqual(10);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test("Variant #4: Should work when doubly obfuscated", async () => {
|
|
73
|
+
var output = await JsConfuser.obfuscate(
|
|
74
|
+
`
|
|
75
|
+
var myNumber = myFunction();
|
|
76
|
+
input(myNumber)
|
|
77
|
+
|
|
78
|
+
function myFunction(){
|
|
79
|
+
return 10;
|
|
80
|
+
}
|
|
81
|
+
`,
|
|
82
|
+
{
|
|
83
|
+
target: "node",
|
|
84
|
+
hideInitializingCode: true,
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
expect(output).toContain("__p_");
|
|
89
|
+
expect(output).toContain("function ");
|
|
90
|
+
|
|
91
|
+
var doublyObfuscated = await JsConfuser.obfuscate(output, {
|
|
92
|
+
target: "node",
|
|
93
|
+
hideInitializingCode: true,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
var value = "never_called";
|
|
97
|
+
function input(valueIn) {
|
|
98
|
+
value = valueIn;
|
|
99
|
+
}
|
|
100
|
+
eval(doublyObfuscated);
|
|
101
|
+
|
|
102
|
+
expect(value).toStrictEqual(10);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test("Variant #5: Should bring up variable declarations", async () => {
|
|
106
|
+
var output = await JsConfuser.obfuscate(
|
|
107
|
+
`
|
|
108
|
+
var myNumber = 10;
|
|
109
|
+
function myFunction(){
|
|
110
|
+
return myNumber;
|
|
111
|
+
}
|
|
112
|
+
input(myFunction())
|
|
113
|
+
`,
|
|
114
|
+
{
|
|
115
|
+
target: "node",
|
|
116
|
+
hideInitializingCode: true,
|
|
117
|
+
}
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
expect(output).toContain("__p_");
|
|
121
|
+
expect(output).toContain("function ");
|
|
122
|
+
expect(output).toContain("var myNumber;");
|
|
123
|
+
expect(output).toContain("myNumber=");
|
|
124
|
+
|
|
125
|
+
var value = "never_called";
|
|
126
|
+
function input(valueIn) {
|
|
127
|
+
value = valueIn;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
eval(output);
|
|
131
|
+
|
|
132
|
+
expect(value).toStrictEqual(10);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test("Variant #6: Should not bring up variable declarations in nested contexts", async () => {
|
|
136
|
+
var output = await JsConfuser.obfuscate(
|
|
137
|
+
`
|
|
138
|
+
function myFunction(){
|
|
139
|
+
function myNestedFunction(){
|
|
140
|
+
var myNumber = 10;
|
|
141
|
+
return myNumber;
|
|
142
|
+
}
|
|
143
|
+
return myNestedFunction();
|
|
144
|
+
}
|
|
145
|
+
input(myFunction())
|
|
146
|
+
`,
|
|
147
|
+
{
|
|
148
|
+
target: "node",
|
|
149
|
+
hideInitializingCode: true,
|
|
150
|
+
}
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
expect(output).toContain("__p_");
|
|
154
|
+
expect(output).toContain("function ");
|
|
155
|
+
expect(output).toContain("var myNumber=");
|
|
156
|
+
|
|
157
|
+
var value = "never_called";
|
|
158
|
+
function input(valueIn) {
|
|
159
|
+
value = valueIn;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
eval(output);
|
|
163
|
+
|
|
164
|
+
expect(value).toStrictEqual(10);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
test("Variant #7: Should bring up class declarations", async () => {
|
|
168
|
+
var output = await JsConfuser.obfuscate(
|
|
169
|
+
`
|
|
170
|
+
|
|
171
|
+
class MyClass {
|
|
172
|
+
static getNumber(){
|
|
173
|
+
return 10;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function myFunction(){
|
|
178
|
+
return MyClass.getNumber();
|
|
179
|
+
}
|
|
180
|
+
input(myFunction())
|
|
181
|
+
`,
|
|
182
|
+
{
|
|
183
|
+
target: "node",
|
|
184
|
+
hideInitializingCode: true,
|
|
185
|
+
}
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
expect(output).toContain("__p_");
|
|
189
|
+
expect(output).toContain("function ");
|
|
190
|
+
expect(output).toContain("var MyClass;");
|
|
191
|
+
expect(output).toContain("MyClass=class MyClass{");
|
|
192
|
+
|
|
193
|
+
var value = "never_called";
|
|
194
|
+
function input(valueIn) {
|
|
195
|
+
value = valueIn;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
eval(output);
|
|
199
|
+
|
|
200
|
+
expect(value).toStrictEqual(10);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
test("Variant #8: Should bring up variable declarations in for statements", async () => {
|
|
204
|
+
var output = await JsConfuser.obfuscate(
|
|
205
|
+
`
|
|
206
|
+
|
|
207
|
+
for(var i=0; i <= 9; i++){
|
|
208
|
+
|
|
209
|
+
} // i ends as 10
|
|
210
|
+
|
|
211
|
+
function myFunction(){
|
|
212
|
+
return i;
|
|
213
|
+
}
|
|
214
|
+
input(myFunction())
|
|
215
|
+
`,
|
|
216
|
+
{
|
|
217
|
+
target: "node",
|
|
218
|
+
hideInitializingCode: true,
|
|
219
|
+
}
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
expect(output).toContain("__p_");
|
|
223
|
+
expect(output).toContain("function ");
|
|
224
|
+
|
|
225
|
+
var value = "never_called";
|
|
226
|
+
function input(valueIn) {
|
|
227
|
+
value = valueIn;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
eval(output);
|
|
231
|
+
|
|
232
|
+
expect(value).toStrictEqual(10);
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
test("Variant #9: Should bring up variable declarations in for in statements", async () => {
|
|
236
|
+
var output = await JsConfuser.obfuscate(
|
|
237
|
+
`
|
|
238
|
+
|
|
239
|
+
var myNumber = 0;
|
|
240
|
+
var myArray = [0,1,2,3,4,5,6,7,8,9,10];
|
|
241
|
+
for(var i in myArray){
|
|
242
|
+
if(i==10){
|
|
243
|
+
myNumber = 10;
|
|
244
|
+
}
|
|
245
|
+
} // i ends as "10"
|
|
246
|
+
|
|
247
|
+
function myFunction(){
|
|
248
|
+
return parseInt(i);
|
|
249
|
+
}
|
|
250
|
+
input(myFunction())
|
|
251
|
+
`,
|
|
252
|
+
{
|
|
253
|
+
target: "node",
|
|
254
|
+
hideInitializingCode: true,
|
|
255
|
+
}
|
|
256
|
+
);
|
|
257
|
+
|
|
258
|
+
expect(output).toContain("__p_");
|
|
259
|
+
expect(output).toContain("function ");
|
|
260
|
+
|
|
261
|
+
var value = "never_called";
|
|
262
|
+
function input(valueIn) {
|
|
263
|
+
value = valueIn;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
eval(output);
|
|
267
|
+
|
|
268
|
+
expect(value).toStrictEqual(10);
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
test("Variant #10: Should work with multiple variable declarations", async () => {
|
|
272
|
+
var output = await JsConfuser.obfuscate(
|
|
273
|
+
`
|
|
274
|
+
|
|
275
|
+
var myNumber1 = 3, myNumber2 = 2;
|
|
276
|
+
|
|
277
|
+
function myFunction(){
|
|
278
|
+
return myNumber1*2 + myNumber2*2;
|
|
279
|
+
}
|
|
280
|
+
input(myFunction())
|
|
281
|
+
`,
|
|
282
|
+
{
|
|
283
|
+
target: "node",
|
|
284
|
+
hideInitializingCode: true,
|
|
285
|
+
}
|
|
286
|
+
);
|
|
287
|
+
|
|
288
|
+
expect(output).toContain("__p_");
|
|
289
|
+
expect(output).toContain("function ");
|
|
290
|
+
|
|
291
|
+
var value = "never_called";
|
|
292
|
+
function input(valueIn) {
|
|
293
|
+
value = valueIn;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
eval(output);
|
|
297
|
+
|
|
298
|
+
expect(value).toStrictEqual(10);
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
test("Variant #11: Should bring up variable declaration but not default values function expression's variables", async () => {
|
|
302
|
+
var output = await JsConfuser.obfuscate(
|
|
303
|
+
`
|
|
304
|
+
|
|
305
|
+
var [myNumber1 = function(){
|
|
306
|
+
var myNumber = 2;
|
|
307
|
+
}] = [10];
|
|
308
|
+
|
|
309
|
+
function myFunction(){
|
|
310
|
+
return myNumber1;
|
|
311
|
+
}
|
|
312
|
+
input(myFunction())
|
|
313
|
+
`,
|
|
314
|
+
{
|
|
315
|
+
target: "node",
|
|
316
|
+
hideInitializingCode: true,
|
|
317
|
+
}
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
expect(output).toContain("__p_");
|
|
321
|
+
expect(output).toContain("function ");
|
|
322
|
+
expect(output).toContain("var myNumber1;");
|
|
323
|
+
expect(output).toContain("[myNumber1");
|
|
324
|
+
expect(output).toContain("=[");
|
|
325
|
+
|
|
326
|
+
expect(output).toContain("var myNumber=");
|
|
327
|
+
|
|
328
|
+
var value = "never_called";
|
|
329
|
+
function input(valueIn) {
|
|
330
|
+
value = valueIn;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
eval(output);
|
|
334
|
+
|
|
335
|
+
expect(value).toStrictEqual(10);
|
|
336
|
+
});
|