js-confuser 1.7.3 → 2.0.0-alpha.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/ISSUE_TEMPLATE/bug_report.md +6 -4
- package/CHANGELOG.md +70 -0
- package/Migration.md +57 -0
- package/README.md +23 -929
- package/dist/constants.js +65 -14
- package/dist/index.js +108 -160
- package/dist/obfuscator.js +316 -118
- package/dist/options.js +1 -119
- package/dist/order.js +30 -30
- package/dist/presets.js +47 -45
- package/dist/probability.js +25 -32
- package/dist/templates/bufferToStringTemplate.js +9 -0
- package/dist/templates/deadCodeTemplates.js +9 -0
- package/dist/templates/getGlobalTemplate.js +19 -0
- package/dist/templates/integrityTemplate.js +30 -0
- package/dist/templates/setFunctionLengthTemplate.js +9 -0
- package/dist/templates/stringCompressionTemplate.js +10 -0
- package/dist/templates/tamperProtectionTemplates.js +21 -0
- package/dist/templates/template.js +199 -184
- package/dist/transforms/astScrambler.js +100 -0
- package/dist/transforms/calculator.js +70 -127
- package/dist/transforms/controlFlowFlattening.js +1182 -0
- package/dist/transforms/deadCode.js +62 -587
- package/dist/transforms/dispatcher.js +300 -313
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +88 -189
- package/dist/transforms/extraction/objectExtraction.js +131 -215
- package/dist/transforms/finalizer.js +56 -59
- package/dist/transforms/flatten.js +275 -276
- package/dist/transforms/functionOutlining.js +230 -0
- package/dist/transforms/identifier/globalConcealing.js +214 -135
- package/dist/transforms/identifier/movedDeclarations.js +167 -91
- package/dist/transforms/identifier/renameVariables.js +239 -193
- package/dist/transforms/lock/integrity.js +61 -184
- package/dist/transforms/lock/lock.js +261 -387
- package/dist/transforms/minify.js +431 -436
- package/dist/transforms/opaquePredicates.js +65 -118
- package/dist/transforms/pack.js +160 -0
- package/dist/transforms/plugin.js +179 -0
- package/dist/transforms/preparation.js +261 -173
- package/dist/transforms/renameLabels.js +132 -56
- package/dist/transforms/rgf.js +140 -267
- package/dist/transforms/shuffle.js +52 -145
- package/dist/transforms/string/encoding.js +44 -175
- package/dist/transforms/string/stringCompression.js +79 -155
- package/dist/transforms/string/stringConcealing.js +189 -225
- package/dist/transforms/string/stringEncoding.js +32 -40
- package/dist/transforms/string/stringSplitting.js +54 -55
- package/dist/transforms/variableMasking.js +232 -0
- package/dist/utils/ControlObject.js +125 -0
- package/dist/utils/IntGen.js +46 -0
- package/dist/utils/NameGen.js +106 -0
- package/dist/utils/ast-utils.js +560 -0
- package/dist/utils/function-utils.js +56 -0
- package/dist/utils/gen-utils.js +48 -0
- package/dist/utils/node.js +77 -0
- package/dist/utils/object-utils.js +21 -0
- package/dist/utils/random-utils.js +91 -0
- package/dist/utils/static-utils.js +64 -0
- package/dist/validateOptions.js +122 -0
- package/index.d.ts +1 -17
- package/package.json +27 -22
- package/src/constants.ts +139 -82
- package/src/index.ts +70 -165
- package/src/obfuscationResult.ts +43 -0
- package/src/obfuscator.ts +328 -135
- package/src/options.ts +149 -658
- package/src/order.ts +14 -14
- package/src/presets.ts +39 -34
- package/src/probability.ts +21 -36
- package/src/templates/bufferToStringTemplate.ts +57 -0
- package/src/templates/deadCodeTemplates.ts +1185 -0
- package/src/templates/getGlobalTemplate.ts +72 -0
- package/src/templates/integrityTemplate.ts +69 -0
- package/src/templates/setFunctionLengthTemplate.ts +11 -0
- package/src/templates/stringCompressionTemplate.ts +42 -0
- package/src/templates/tamperProtectionTemplates.ts +116 -0
- package/src/templates/template.ts +149 -157
- package/src/transforms/astScrambler.ts +99 -0
- package/src/transforms/calculator.ts +96 -226
- package/src/transforms/controlFlowFlattening.ts +1594 -0
- package/src/transforms/deadCode.ts +85 -676
- package/src/transforms/dispatcher.ts +431 -640
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +147 -295
- package/src/transforms/extraction/objectExtraction.ts +160 -333
- package/src/transforms/finalizer.ts +63 -64
- package/src/transforms/flatten.ts +439 -557
- package/src/transforms/functionOutlining.ts +225 -0
- package/src/transforms/identifier/globalConcealing.ts +255 -266
- package/src/transforms/identifier/movedDeclarations.ts +228 -142
- package/src/transforms/identifier/renameVariables.ts +250 -271
- package/src/transforms/lock/integrity.ts +85 -263
- package/src/transforms/lock/lock.ts +338 -579
- package/src/transforms/minify.ts +523 -663
- package/src/transforms/opaquePredicates.ts +90 -229
- package/src/transforms/pack.ts +195 -0
- package/src/transforms/plugin.ts +185 -0
- package/src/transforms/preparation.ts +337 -231
- package/src/transforms/renameLabels.ts +176 -77
- package/src/transforms/rgf.ts +293 -424
- package/src/transforms/shuffle.ts +80 -254
- package/src/transforms/string/encoding.ts +20 -126
- package/src/transforms/string/stringCompression.ts +117 -307
- package/src/transforms/string/stringConcealing.ts +254 -342
- package/src/transforms/string/stringEncoding.ts +28 -47
- package/src/transforms/string/stringSplitting.ts +61 -75
- package/src/transforms/variableMasking.ts +257 -0
- package/src/utils/ControlObject.ts +141 -0
- package/src/utils/IntGen.ts +33 -0
- package/src/utils/NameGen.ts +106 -0
- package/src/utils/ast-utils.ts +667 -0
- package/src/utils/function-utils.ts +50 -0
- package/src/utils/gen-utils.ts +48 -0
- package/src/utils/node.ts +78 -0
- package/src/utils/object-utils.ts +21 -0
- package/src/utils/random-utils.ts +79 -0
- package/src/utils/static-utils.ts +66 -0
- package/src/validateOptions.ts +256 -0
- package/tsconfig.json +13 -8
- package/babel.config.js +0 -12
- package/dev.js +0 -8
- package/dist/compiler.js +0 -34
- package/dist/parser.js +0 -59
- package/dist/precedence.js +0 -66
- package/dist/templates/bufferToString.js +0 -129
- package/dist/templates/core.js +0 -35
- package/dist/templates/crash.js +0 -28
- package/dist/templates/es5.js +0 -137
- package/dist/templates/functionLength.js +0 -34
- package/dist/templates/globals.js +0 -9
- package/dist/transforms/antiTooling.js +0 -88
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +0 -1287
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +0 -131
- package/dist/transforms/es5/antiClass.js +0 -164
- package/dist/transforms/es5/antiDestructuring.js +0 -193
- package/dist/transforms/es5/antiES6Object.js +0 -185
- package/dist/transforms/es5/antiSpreadOperator.js +0 -35
- package/dist/transforms/es5/antiTemplate.js +0 -66
- package/dist/transforms/es5/es5.js +0 -123
- package/dist/transforms/extraction/classExtraction.js +0 -83
- package/dist/transforms/identifier/globalAnalysis.js +0 -83
- package/dist/transforms/identifier/variableAnalysis.js +0 -104
- package/dist/transforms/lock/antiDebug.js +0 -76
- package/dist/transforms/stack.js +0 -349
- package/dist/transforms/transform.js +0 -372
- package/dist/traverse.js +0 -110
- package/dist/util/compare.js +0 -145
- package/dist/util/gen.js +0 -564
- package/dist/util/guard.js +0 -14
- package/dist/util/identifiers.js +0 -355
- package/dist/util/insert.js +0 -362
- package/dist/util/math.js +0 -19
- package/dist/util/object.js +0 -40
- package/dist/util/random.js +0 -156
- package/dist/util/scope.js +0 -20
- package/docs/ControlFlowFlattening.md +0 -595
- package/docs/Countermeasures.md +0 -70
- package/docs/ES5.md +0 -197
- package/docs/Integrity.md +0 -82
- package/docs/RGF.md +0 -424
- package/docs/RenameVariables.md +0 -116
- package/docs/TamperProtection.md +0 -100
- package/docs/Template.md +0 -117
- package/samples/example.js +0 -15
- package/samples/high.js +0 -1
- package/samples/input.js +0 -3
- package/samples/javascriptobfuscator.com.js +0 -8
- package/samples/jscrambler_advanced.js +0 -1894
- package/samples/jscrambler_light.js +0 -1134
- package/samples/low.js +0 -1
- package/samples/medium.js +0 -1
- package/samples/obfuscator.io.js +0 -1686
- package/samples/preemptive.com.js +0 -16
- package/src/compiler.ts +0 -35
- package/src/parser.ts +0 -49
- package/src/precedence.ts +0 -61
- package/src/templates/bufferToString.ts +0 -136
- package/src/templates/core.ts +0 -29
- package/src/templates/crash.ts +0 -23
- package/src/templates/es5.ts +0 -131
- package/src/templates/functionLength.ts +0 -32
- package/src/templates/globals.ts +0 -3
- package/src/transforms/antiTooling.ts +0 -102
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +0 -2153
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +0 -179
- package/src/transforms/es5/antiClass.ts +0 -276
- package/src/transforms/es5/antiDestructuring.ts +0 -294
- package/src/transforms/es5/antiES6Object.ts +0 -267
- package/src/transforms/es5/antiSpreadOperator.ts +0 -56
- package/src/transforms/es5/antiTemplate.ts +0 -98
- package/src/transforms/es5/es5.ts +0 -149
- package/src/transforms/extraction/classExtraction.ts +0 -168
- package/src/transforms/identifier/globalAnalysis.ts +0 -102
- package/src/transforms/identifier/variableAnalysis.ts +0 -118
- package/src/transforms/lock/antiDebug.ts +0 -112
- package/src/transforms/stack.ts +0 -557
- package/src/transforms/transform.ts +0 -441
- package/src/traverse.ts +0 -120
- package/src/types.ts +0 -133
- package/src/util/compare.ts +0 -181
- package/src/util/gen.ts +0 -651
- package/src/util/guard.ts +0 -17
- package/src/util/identifiers.ts +0 -494
- package/src/util/insert.ts +0 -419
- package/src/util/math.ts +0 -15
- package/src/util/object.ts +0 -39
- package/src/util/random.ts +0 -221
- package/src/util/scope.ts +0 -21
- package/test/code/Cash.src.js +0 -1011
- package/test/code/Cash.test.ts +0 -132
- package/test/code/Dynamic.src.js +0 -118
- package/test/code/Dynamic.test.ts +0 -49
- package/test/code/ES6.src.js +0 -235
- package/test/code/ES6.test.ts +0 -42
- package/test/code/NewFeatures.test.ts +0 -19
- package/test/code/StrictMode.src.js +0 -65
- package/test/code/StrictMode.test.js +0 -37
- package/test/compare.test.ts +0 -104
- package/test/index.test.ts +0 -249
- package/test/options.test.ts +0 -150
- package/test/presets.test.ts +0 -22
- package/test/probability.test.ts +0 -44
- package/test/templates/template.test.ts +0 -224
- package/test/transforms/antiTooling.test.ts +0 -52
- package/test/transforms/calculator.test.ts +0 -78
- package/test/transforms/controlFlowFlattening/controlFlowFlattening.test.ts +0 -1274
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +0 -192
- package/test/transforms/deadCode.test.ts +0 -85
- package/test/transforms/dispatcher.test.ts +0 -457
- package/test/transforms/es5/antiClass.test.ts +0 -427
- package/test/transforms/es5/antiDestructuring.test.ts +0 -157
- package/test/transforms/es5/antiES6Object.test.ts +0 -245
- package/test/transforms/es5/antiTemplate.test.ts +0 -116
- package/test/transforms/es5/es5.test.ts +0 -110
- package/test/transforms/extraction/classExtraction.test.ts +0 -86
- package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +0 -200
- package/test/transforms/extraction/objectExtraction.test.ts +0 -491
- package/test/transforms/flatten.test.ts +0 -721
- package/test/transforms/hexadecimalNumbers.test.ts +0 -62
- package/test/transforms/identifier/globalConcealing.test.ts +0 -142
- package/test/transforms/identifier/movedDeclarations.test.ts +0 -275
- package/test/transforms/identifier/renameVariables.test.ts +0 -695
- package/test/transforms/lock/antiDebug.test.ts +0 -66
- package/test/transforms/lock/browserLock.test.ts +0 -129
- package/test/transforms/lock/countermeasures.test.ts +0 -100
- package/test/transforms/lock/integrity.test.ts +0 -161
- package/test/transforms/lock/lock.test.ts +0 -204
- package/test/transforms/lock/osLock.test.ts +0 -312
- package/test/transforms/lock/selfDefending.test.ts +0 -68
- package/test/transforms/lock/tamperProtection.test.ts +0 -336
- package/test/transforms/minify.test.ts +0 -575
- package/test/transforms/opaquePredicates.test.ts +0 -43
- package/test/transforms/preparation.test.ts +0 -157
- package/test/transforms/renameLabels.test.ts +0 -95
- package/test/transforms/rgf.test.ts +0 -378
- package/test/transforms/shuffle.test.ts +0 -135
- package/test/transforms/stack.test.ts +0 -573
- package/test/transforms/string/stringCompression.test.ts +0 -120
- package/test/transforms/string/stringConcealing.test.ts +0 -299
- package/test/transforms/string/stringEncoding.test.ts +0 -95
- package/test/transforms/string/stringSplitting.test.ts +0 -135
- package/test/transforms/transform.test.ts +0 -66
- package/test/traverse.test.ts +0 -139
- package/test/util/compare.test.ts +0 -34
- package/test/util/gen.test.ts +0 -121
- package/test/util/identifiers.test.ts +0 -253
- package/test/util/insert.test.ts +0 -142
- package/test/util/math.test.ts +0 -5
- package/test/util/random.test.ts +0 -71
- /package/dist/{types.js → obfuscationResult.js} +0 -0
|
@@ -1,312 +0,0 @@
|
|
|
1
|
-
import JsConfuser from "../../../src/index";
|
|
2
|
-
|
|
3
|
-
describe("OSLock on target 'node'", () => {
|
|
4
|
-
test("Variant #1: Linux", async () => {
|
|
5
|
-
var _require = require;
|
|
6
|
-
var newRequire: any = (name) => {
|
|
7
|
-
if (name == "os") {
|
|
8
|
-
return {
|
|
9
|
-
platform() {
|
|
10
|
-
return "linux";
|
|
11
|
-
},
|
|
12
|
-
};
|
|
13
|
-
} else {
|
|
14
|
-
return _require(name);
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
require = newRequire;
|
|
18
|
-
|
|
19
|
-
var output = await JsConfuser.obfuscate(`TEST_VARIABLE = 1`, {
|
|
20
|
-
target: "node",
|
|
21
|
-
lock: {
|
|
22
|
-
osLock: ["linux"],
|
|
23
|
-
countermeasures: false,
|
|
24
|
-
},
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
var TEST_VARIABLE;
|
|
28
|
-
eval(output);
|
|
29
|
-
|
|
30
|
-
expect(TEST_VARIABLE).toStrictEqual(1);
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
test("Variant #2: Linux on windows machine", async () => {
|
|
34
|
-
var _require = require;
|
|
35
|
-
var newRequire: any = (name) => {
|
|
36
|
-
if (name == "os") {
|
|
37
|
-
return {
|
|
38
|
-
platform() {
|
|
39
|
-
return "win32";
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
} else {
|
|
43
|
-
return _require(name);
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
require = newRequire;
|
|
47
|
-
|
|
48
|
-
var output = await JsConfuser.obfuscate(
|
|
49
|
-
`
|
|
50
|
-
function caught(){
|
|
51
|
-
TEST_VARIABLE = "caught"
|
|
52
|
-
}
|
|
53
|
-
`,
|
|
54
|
-
{
|
|
55
|
-
target: "node",
|
|
56
|
-
lock: {
|
|
57
|
-
osLock: ["linux"],
|
|
58
|
-
countermeasures: "caught",
|
|
59
|
-
},
|
|
60
|
-
}
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
var TEST_VARIABLE;
|
|
64
|
-
eval(output);
|
|
65
|
-
|
|
66
|
-
expect(TEST_VARIABLE).toStrictEqual("caught");
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
test("Variant #3: Windows", async () => {
|
|
70
|
-
var _require = require;
|
|
71
|
-
var newRequire: any = (name) => {
|
|
72
|
-
if (name == "os") {
|
|
73
|
-
return {
|
|
74
|
-
platform() {
|
|
75
|
-
return "win32";
|
|
76
|
-
},
|
|
77
|
-
};
|
|
78
|
-
} else {
|
|
79
|
-
return _require(name);
|
|
80
|
-
}
|
|
81
|
-
};
|
|
82
|
-
require = newRequire;
|
|
83
|
-
|
|
84
|
-
var output = await JsConfuser.obfuscate(
|
|
85
|
-
`
|
|
86
|
-
function caught(){
|
|
87
|
-
TEST_VARIABLE = "caught"
|
|
88
|
-
}
|
|
89
|
-
`,
|
|
90
|
-
{
|
|
91
|
-
target: "node",
|
|
92
|
-
lock: {
|
|
93
|
-
osLock: ["windows"],
|
|
94
|
-
countermeasures: "caught",
|
|
95
|
-
},
|
|
96
|
-
}
|
|
97
|
-
);
|
|
98
|
-
|
|
99
|
-
var TEST_VARIABLE;
|
|
100
|
-
eval(output);
|
|
101
|
-
|
|
102
|
-
expect(TEST_VARIABLE).toStrictEqual(undefined);
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
test("Variant #4: Windows on linux machine", async () => {
|
|
106
|
-
var _require = require;
|
|
107
|
-
var newRequire: any = (name) => {
|
|
108
|
-
if (name == "os") {
|
|
109
|
-
return {
|
|
110
|
-
platform() {
|
|
111
|
-
return "linux";
|
|
112
|
-
},
|
|
113
|
-
};
|
|
114
|
-
} else {
|
|
115
|
-
return _require(name);
|
|
116
|
-
}
|
|
117
|
-
};
|
|
118
|
-
require = newRequire;
|
|
119
|
-
|
|
120
|
-
var output = await JsConfuser.obfuscate(
|
|
121
|
-
`
|
|
122
|
-
function caught(){
|
|
123
|
-
TEST_VARIABLE = "caught";
|
|
124
|
-
}
|
|
125
|
-
`,
|
|
126
|
-
{
|
|
127
|
-
target: "node",
|
|
128
|
-
lock: {
|
|
129
|
-
osLock: ["windows"],
|
|
130
|
-
countermeasures: "caught",
|
|
131
|
-
},
|
|
132
|
-
}
|
|
133
|
-
);
|
|
134
|
-
|
|
135
|
-
var TEST_VARIABLE;
|
|
136
|
-
eval(output);
|
|
137
|
-
|
|
138
|
-
expect(TEST_VARIABLE).toStrictEqual("caught");
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
test("Variant #5: MacOs", async () => {
|
|
142
|
-
var _require = require;
|
|
143
|
-
var newRequire: any = (name) => {
|
|
144
|
-
if (name == "os") {
|
|
145
|
-
return {
|
|
146
|
-
platform() {
|
|
147
|
-
return "darwin";
|
|
148
|
-
},
|
|
149
|
-
};
|
|
150
|
-
} else {
|
|
151
|
-
return _require(name);
|
|
152
|
-
}
|
|
153
|
-
};
|
|
154
|
-
require = newRequire;
|
|
155
|
-
|
|
156
|
-
var output = await JsConfuser.obfuscate(`TEST_VARIABLE = 1`, {
|
|
157
|
-
target: "node",
|
|
158
|
-
lock: {
|
|
159
|
-
osLock: ["osx"],
|
|
160
|
-
countermeasures: false,
|
|
161
|
-
},
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
var TEST_VARIABLE;
|
|
165
|
-
eval(output);
|
|
166
|
-
|
|
167
|
-
expect(TEST_VARIABLE).toStrictEqual(1);
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
test("Variant #6: MacOs on linux machine", async () => {
|
|
171
|
-
var _require = require;
|
|
172
|
-
var newRequire: any = (name) => {
|
|
173
|
-
if (name == "os") {
|
|
174
|
-
return {
|
|
175
|
-
platform() {
|
|
176
|
-
return "linux";
|
|
177
|
-
},
|
|
178
|
-
};
|
|
179
|
-
} else {
|
|
180
|
-
return _require(name);
|
|
181
|
-
}
|
|
182
|
-
};
|
|
183
|
-
require = newRequire;
|
|
184
|
-
|
|
185
|
-
var output = await JsConfuser.obfuscate(
|
|
186
|
-
`
|
|
187
|
-
function caught(){
|
|
188
|
-
TEST_VARIABLE = "caught";
|
|
189
|
-
}
|
|
190
|
-
`,
|
|
191
|
-
{
|
|
192
|
-
target: "node",
|
|
193
|
-
lock: {
|
|
194
|
-
osLock: ["osx"],
|
|
195
|
-
countermeasures: "caught",
|
|
196
|
-
},
|
|
197
|
-
}
|
|
198
|
-
);
|
|
199
|
-
|
|
200
|
-
var TEST_VARIABLE;
|
|
201
|
-
eval(output);
|
|
202
|
-
|
|
203
|
-
expect(TEST_VARIABLE).toStrictEqual("caught");
|
|
204
|
-
});
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
describe("OSLock on target 'browser'", () => {
|
|
208
|
-
test("Variant #1: Linux", async () => {
|
|
209
|
-
// Linux user-agent
|
|
210
|
-
var window = {
|
|
211
|
-
navigator: {
|
|
212
|
-
userAgent:
|
|
213
|
-
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36",
|
|
214
|
-
},
|
|
215
|
-
};
|
|
216
|
-
|
|
217
|
-
var output = await JsConfuser.obfuscate(`TEST_VARIABLE = 1`, {
|
|
218
|
-
target: "browser",
|
|
219
|
-
lock: {
|
|
220
|
-
osLock: ["linux"],
|
|
221
|
-
countermeasures: false,
|
|
222
|
-
},
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
var TEST_VARIABLE;
|
|
226
|
-
eval(output);
|
|
227
|
-
|
|
228
|
-
expect(TEST_VARIABLE).toStrictEqual(1);
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
test("Variant #2: Linux on windows machine", async () => {
|
|
232
|
-
// Windows user-agent
|
|
233
|
-
var window = {
|
|
234
|
-
navigator: {
|
|
235
|
-
userAgent:
|
|
236
|
-
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246",
|
|
237
|
-
},
|
|
238
|
-
};
|
|
239
|
-
|
|
240
|
-
var output = await JsConfuser.obfuscate(
|
|
241
|
-
`
|
|
242
|
-
function caught(){
|
|
243
|
-
TEST_VARIABLE = "caught";
|
|
244
|
-
}`,
|
|
245
|
-
{
|
|
246
|
-
target: "browser",
|
|
247
|
-
lock: {
|
|
248
|
-
osLock: ["linux"],
|
|
249
|
-
countermeasures: "caught",
|
|
250
|
-
},
|
|
251
|
-
}
|
|
252
|
-
);
|
|
253
|
-
|
|
254
|
-
var TEST_VARIABLE;
|
|
255
|
-
eval(output);
|
|
256
|
-
|
|
257
|
-
expect(TEST_VARIABLE).toStrictEqual("caught");
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
test("Variant #3: Windows", async () => {
|
|
261
|
-
// Windows user-agent
|
|
262
|
-
var window = {
|
|
263
|
-
navigator: {
|
|
264
|
-
userAgent:
|
|
265
|
-
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246",
|
|
266
|
-
},
|
|
267
|
-
};
|
|
268
|
-
|
|
269
|
-
var output = await JsConfuser.obfuscate(`TEST_VARIABLE = 1`, {
|
|
270
|
-
target: "browser",
|
|
271
|
-
lock: {
|
|
272
|
-
osLock: ["windows"],
|
|
273
|
-
countermeasures: false,
|
|
274
|
-
},
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
var TEST_VARIABLE;
|
|
278
|
-
eval(output);
|
|
279
|
-
|
|
280
|
-
expect(TEST_VARIABLE).toStrictEqual(1);
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
test("Variant #4: Windows on linux machine", async () => {
|
|
284
|
-
// Linux user-agent
|
|
285
|
-
var window = {
|
|
286
|
-
navigator: {
|
|
287
|
-
userAgent:
|
|
288
|
-
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36",
|
|
289
|
-
},
|
|
290
|
-
};
|
|
291
|
-
|
|
292
|
-
var output = await JsConfuser.obfuscate(
|
|
293
|
-
`
|
|
294
|
-
function caught(){
|
|
295
|
-
TEST_VARIABLE = "caught";
|
|
296
|
-
}
|
|
297
|
-
`,
|
|
298
|
-
{
|
|
299
|
-
target: "browser",
|
|
300
|
-
lock: {
|
|
301
|
-
osLock: ["windows"],
|
|
302
|
-
countermeasures: "caught",
|
|
303
|
-
},
|
|
304
|
-
}
|
|
305
|
-
);
|
|
306
|
-
|
|
307
|
-
var TEST_VARIABLE;
|
|
308
|
-
eval(output);
|
|
309
|
-
|
|
310
|
-
expect(TEST_VARIABLE).toStrictEqual("caught");
|
|
311
|
-
});
|
|
312
|
-
});
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import JsConfuser from "../../../src/index";
|
|
2
|
-
|
|
3
|
-
test("Variant #1: SelfDefending should forcibly enable `compact`", async () => {
|
|
4
|
-
var output = await JsConfuser.obfuscate(`console.log(1)`, {
|
|
5
|
-
target: "node",
|
|
6
|
-
compact: false,
|
|
7
|
-
lock: {
|
|
8
|
-
selfDefending: true,
|
|
9
|
-
},
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
expect(output).not.toContain("\n");
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
test("Variant #2: SelfDefending should not crash when unchanged", async () => {
|
|
16
|
-
var output = await JsConfuser.obfuscate(
|
|
17
|
-
`
|
|
18
|
-
function caught(){
|
|
19
|
-
TEST_CAUGHT = true;
|
|
20
|
-
}
|
|
21
|
-
TEST_VAR = 100;
|
|
22
|
-
`,
|
|
23
|
-
{
|
|
24
|
-
target: "node",
|
|
25
|
-
lock: {
|
|
26
|
-
selfDefending: true,
|
|
27
|
-
countermeasures: "caught",
|
|
28
|
-
},
|
|
29
|
-
}
|
|
30
|
-
);
|
|
31
|
-
|
|
32
|
-
var TEST_VAR, TEST_CAUGHT;
|
|
33
|
-
|
|
34
|
-
eval(output);
|
|
35
|
-
|
|
36
|
-
expect(TEST_VAR).toStrictEqual(100);
|
|
37
|
-
expect(TEST_CAUGHT).toStrictEqual(undefined);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
test("Variant #2: SelfDefending should crash when changed", async () => {
|
|
41
|
-
var output = await JsConfuser.obfuscate(
|
|
42
|
-
`
|
|
43
|
-
function caught(){
|
|
44
|
-
TEST_CAUGHT = true;
|
|
45
|
-
}
|
|
46
|
-
TEST_VAR = 100;
|
|
47
|
-
`,
|
|
48
|
-
{
|
|
49
|
-
target: "node",
|
|
50
|
-
lock: {
|
|
51
|
-
selfDefending: true,
|
|
52
|
-
countermeasures: "caught",
|
|
53
|
-
},
|
|
54
|
-
}
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
// Re-run through obfuscator without compact = new lines = crash should occur
|
|
58
|
-
var output2 = await JsConfuser.obfuscate(output, {
|
|
59
|
-
target: "node",
|
|
60
|
-
compact: false,
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
var TEST_VAR, TEST_CAUGHT;
|
|
64
|
-
|
|
65
|
-
eval(output2);
|
|
66
|
-
|
|
67
|
-
expect(TEST_CAUGHT).toStrictEqual(true);
|
|
68
|
-
});
|
|
@@ -1,336 +0,0 @@
|
|
|
1
|
-
import JsConfuser from "../../../src/index";
|
|
2
|
-
|
|
3
|
-
var _eval = eval;
|
|
4
|
-
|
|
5
|
-
function evalInNonStrictMode(str: string) {
|
|
6
|
-
var TEST_OUTPUT;
|
|
7
|
-
|
|
8
|
-
function TEST_OUTPUT_SET(value) {
|
|
9
|
-
TEST_OUTPUT = value;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
try {
|
|
13
|
-
// 'new Function' runs in non-strict mode
|
|
14
|
-
// The original 'eval' function is passed in each test
|
|
15
|
-
// This is because once 'eval' is changed, it is changed for all new Function() calls!
|
|
16
|
-
var fn = new Function("TEST_OUTPUT_SET", "eval", str);
|
|
17
|
-
|
|
18
|
-
fn(TEST_OUTPUT_SET, _eval);
|
|
19
|
-
} catch (err) {
|
|
20
|
-
return { error: err, TEST_OUTPUT: TEST_OUTPUT };
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
return { error: null, TEST_OUTPUT: TEST_OUTPUT };
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
describe("Global Concealing", () => {
|
|
27
|
-
test("Variant #1: Detect Eval tamper (no tamper)", async () => {
|
|
28
|
-
var code = `
|
|
29
|
-
global.TEST_GLOBAL_OUTPUT = global.TEST_GLOBAL;
|
|
30
|
-
`;
|
|
31
|
-
|
|
32
|
-
var output = await JsConfuser(code, {
|
|
33
|
-
target: "node",
|
|
34
|
-
globalConcealing: true,
|
|
35
|
-
lock: {
|
|
36
|
-
tamperProtection: true,
|
|
37
|
-
},
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
var TEST_GLOBAL = {};
|
|
41
|
-
(global as any).TEST_GLOBAL = TEST_GLOBAL;
|
|
42
|
-
|
|
43
|
-
evalInNonStrictMode(output);
|
|
44
|
-
|
|
45
|
-
// Make reuse global variable as 'new Function' runs in isolated environment
|
|
46
|
-
var TEST_OUTPUT = (global as any).TEST_GLOBAL_OUTPUT;
|
|
47
|
-
|
|
48
|
-
expect(TEST_OUTPUT).toStrictEqual(TEST_GLOBAL);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
test("Variant #2: Detect Eval tamper (tampered)", async () => {
|
|
52
|
-
var code = `
|
|
53
|
-
function onTamperDetected(){
|
|
54
|
-
TEST_OUTPUT_SET(true);
|
|
55
|
-
}
|
|
56
|
-
global.TEST_GLOBAL_VARIANT_7_OUTPUT = global.TEST_GLOBAL_VARIANT_7;
|
|
57
|
-
`;
|
|
58
|
-
|
|
59
|
-
var output = await JsConfuser(code, {
|
|
60
|
-
target: "node",
|
|
61
|
-
globalConcealing: (varName) => varName != "TEST_OUTPUT_SET",
|
|
62
|
-
lock: {
|
|
63
|
-
tamperProtection: true,
|
|
64
|
-
countermeasures: "onTamperDetected",
|
|
65
|
-
},
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
// Inject 'eval' tamper code
|
|
69
|
-
output =
|
|
70
|
-
`var _eval = eval;
|
|
71
|
-
eval = (codeStr)=>( console.log(codeStr), _eval(codeStr) );
|
|
72
|
-
` + output;
|
|
73
|
-
|
|
74
|
-
var TEST_GLOBAL_VARIANT_7 = {};
|
|
75
|
-
(global as any).TEST_GLOBAL_VARIANT_7 = TEST_GLOBAL_VARIANT_7;
|
|
76
|
-
|
|
77
|
-
var { error, TEST_OUTPUT } = evalInNonStrictMode(output);
|
|
78
|
-
|
|
79
|
-
expect(error).toBeNull();
|
|
80
|
-
expect(TEST_OUTPUT).toStrictEqual(true);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
test("Variant #3: Native check on functions", async () => {
|
|
84
|
-
var mockConsoleLog = (...msgs) => {
|
|
85
|
-
console.log(...msgs);
|
|
86
|
-
};
|
|
87
|
-
mockConsoleLog.toString = () => "{ [native code] }";
|
|
88
|
-
(global as any).mockConsoleLog = mockConsoleLog;
|
|
89
|
-
|
|
90
|
-
var output = await JsConfuser(
|
|
91
|
-
`
|
|
92
|
-
function onTamperDetected(){
|
|
93
|
-
TEST_OUTPUT_SET(true);
|
|
94
|
-
}
|
|
95
|
-
mockConsoleLog("console.log was not tampered")
|
|
96
|
-
`,
|
|
97
|
-
{
|
|
98
|
-
target: "node",
|
|
99
|
-
globalConcealing: (varName) => varName != "TEST_OUTPUT_SET",
|
|
100
|
-
lock: {
|
|
101
|
-
tamperProtection: true,
|
|
102
|
-
countermeasures: "onTamperDetected",
|
|
103
|
-
},
|
|
104
|
-
}
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
|
|
108
|
-
(global as any).Object.getOwnPropertyDescriptor = () => undefined;
|
|
109
|
-
|
|
110
|
-
var { TEST_OUTPUT, error } = evalInNonStrictMode(output);
|
|
111
|
-
|
|
112
|
-
(global as any).Object.getOwnPropertyDescriptor = getOwnPropertyDescriptor;
|
|
113
|
-
|
|
114
|
-
expect(TEST_OUTPUT).not.toStrictEqual(true);
|
|
115
|
-
expect(error).toBeNull();
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
test("Variant #4: Native check on functions (tampered)", async () => {
|
|
119
|
-
var mockConsoleLog = (...msgs) => {
|
|
120
|
-
console.log(...msgs);
|
|
121
|
-
};
|
|
122
|
-
mockConsoleLog.toString = () => "[native code]";
|
|
123
|
-
(global as any).mockConsoleLog = mockConsoleLog;
|
|
124
|
-
|
|
125
|
-
var output = await JsConfuser(
|
|
126
|
-
`
|
|
127
|
-
function onTamperDetected(){
|
|
128
|
-
TEST_OUTPUT_SET(true);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
mockConsoleLog("console.log was not tampered")
|
|
132
|
-
`,
|
|
133
|
-
{
|
|
134
|
-
target: "node",
|
|
135
|
-
globalConcealing: (varName) => varName != "TEST_OUTPUT_SET",
|
|
136
|
-
lock: {
|
|
137
|
-
tamperProtection: true,
|
|
138
|
-
countermeasures: "onTamperDetected",
|
|
139
|
-
},
|
|
140
|
-
}
|
|
141
|
-
);
|
|
142
|
-
|
|
143
|
-
(global as any).mockConsoleLog = (...str) =>
|
|
144
|
-
console.log("Tampered console.log: ", ...str);
|
|
145
|
-
|
|
146
|
-
// Unfortunately the program errors dude to console.log being tampered
|
|
147
|
-
var { TEST_OUTPUT, error } = evalInNonStrictMode(output);
|
|
148
|
-
|
|
149
|
-
expect(TEST_OUTPUT).toStrictEqual(true);
|
|
150
|
-
|
|
151
|
-
// Ensure error was thrown
|
|
152
|
-
expect(error).not.toBeNull();
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
test("Variant #5: Native check on non-existent functions", async () => {
|
|
156
|
-
var output = await JsConfuser(
|
|
157
|
-
`
|
|
158
|
-
a.b.c.d()
|
|
159
|
-
`,
|
|
160
|
-
{
|
|
161
|
-
target: "node",
|
|
162
|
-
globalConcealing: true,
|
|
163
|
-
lock: {
|
|
164
|
-
tamperProtection: true,
|
|
165
|
-
},
|
|
166
|
-
}
|
|
167
|
-
);
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
test("Variant #6: Custom implementation for lock.tamperProtection", async () => {
|
|
171
|
-
var foundNames = [];
|
|
172
|
-
var output = await JsConfuser(
|
|
173
|
-
`
|
|
174
|
-
fetch()
|
|
175
|
-
console.log()
|
|
176
|
-
shouldBeFound()
|
|
177
|
-
console["trace"]()
|
|
178
|
-
var NotFound = "NotFound"
|
|
179
|
-
console[NotFound]()
|
|
180
|
-
|
|
181
|
-
toString()
|
|
182
|
-
|
|
183
|
-
var shouldNotBeFound;
|
|
184
|
-
|
|
185
|
-
shouldNotBeFound()
|
|
186
|
-
`,
|
|
187
|
-
{
|
|
188
|
-
target: "node",
|
|
189
|
-
globalConcealing: true,
|
|
190
|
-
lock: {
|
|
191
|
-
tamperProtection: (fnName) => {
|
|
192
|
-
foundNames.push(fnName);
|
|
193
|
-
|
|
194
|
-
return false;
|
|
195
|
-
},
|
|
196
|
-
},
|
|
197
|
-
}
|
|
198
|
-
);
|
|
199
|
-
|
|
200
|
-
expect(foundNames).toContain("fetch");
|
|
201
|
-
expect(foundNames).toContain("console.log");
|
|
202
|
-
expect(foundNames).toContain("shouldBeFound");
|
|
203
|
-
expect(foundNames).toContain("console.trace");
|
|
204
|
-
expect(foundNames).toContain("toString");
|
|
205
|
-
|
|
206
|
-
expect(foundNames.join("")).not.toContain("NotFound");
|
|
207
|
-
|
|
208
|
-
expect(foundNames).not.toContain("shouldNotBeFound");
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
test("Variant #7: Protect native function Math.floor", async () => {
|
|
212
|
-
var output = await JsConfuser(
|
|
213
|
-
`
|
|
214
|
-
TEST_OUTPUT_SET(Math.floor(10.1));
|
|
215
|
-
`,
|
|
216
|
-
{
|
|
217
|
-
target: "node",
|
|
218
|
-
globalConcealing: (varName) => varName != "TEST_OUTPUT_SET",
|
|
219
|
-
lock: {
|
|
220
|
-
tamperProtection: true,
|
|
221
|
-
},
|
|
222
|
-
}
|
|
223
|
-
);
|
|
224
|
-
|
|
225
|
-
expect(output).not.toContain("Math['floor");
|
|
226
|
-
|
|
227
|
-
var { TEST_OUTPUT, error } = evalInNonStrictMode(output);
|
|
228
|
-
|
|
229
|
-
expect(error).toBeNull();
|
|
230
|
-
expect(TEST_OUTPUT).toStrictEqual(10);
|
|
231
|
-
});
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
describe("RGF", () => {
|
|
235
|
-
test("Variant #1: Use Eval instead of new Function", async () => {
|
|
236
|
-
var output = await JsConfuser(
|
|
237
|
-
`
|
|
238
|
-
function myFunction1(){
|
|
239
|
-
TEST_OUTPUT_SET(true);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
myFunction1();
|
|
243
|
-
`,
|
|
244
|
-
{
|
|
245
|
-
target: "node",
|
|
246
|
-
rgf: true,
|
|
247
|
-
lock: {
|
|
248
|
-
tamperProtection: true,
|
|
249
|
-
},
|
|
250
|
-
renameVariables: true,
|
|
251
|
-
|
|
252
|
-
// Allow RGF to transform 'myFunction1'
|
|
253
|
-
// Otherwise, RGF will skip 'myFunction1' as 'TEST_OUTPUT_SET' is an outside variable
|
|
254
|
-
globalVariables: new Set(["TEST_OUTPUT_SET"]),
|
|
255
|
-
}
|
|
256
|
-
);
|
|
257
|
-
|
|
258
|
-
expect(output).not.toContain(
|
|
259
|
-
"function myFunction1(){TEST_OUTPUT_SET(true)"
|
|
260
|
-
);
|
|
261
|
-
expect(output).toContain("eval");
|
|
262
|
-
expect(output).not.toContain("new Function");
|
|
263
|
-
|
|
264
|
-
var { TEST_OUTPUT, error } = evalInNonStrictMode(output);
|
|
265
|
-
|
|
266
|
-
expect(error).toBeNull();
|
|
267
|
-
expect(TEST_OUTPUT).toStrictEqual(true);
|
|
268
|
-
});
|
|
269
|
-
|
|
270
|
-
test("Variant #2: Detect Eval tamper", async () => {
|
|
271
|
-
var output = await JsConfuser(
|
|
272
|
-
`
|
|
273
|
-
function onTamperDetected(){
|
|
274
|
-
TEST_OUTPUT_SET("Correct Value");
|
|
275
|
-
}
|
|
276
|
-
function myFunction1(){
|
|
277
|
-
TEST_OUTPUT_SET("Function still called");
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
myFunction1();
|
|
281
|
-
`,
|
|
282
|
-
{
|
|
283
|
-
target: "node",
|
|
284
|
-
rgf: true,
|
|
285
|
-
lock: {
|
|
286
|
-
tamperProtection: true,
|
|
287
|
-
countermeasures: "onTamperDetected",
|
|
288
|
-
},
|
|
289
|
-
renameVariables: true,
|
|
290
|
-
|
|
291
|
-
// Allow RGF to transform 'myFunction1'
|
|
292
|
-
// Otherwise, RGF will skip 'myFunction1' as 'TEST_OUTPUT_SET' is an outside variable
|
|
293
|
-
globalVariables: new Set(["TEST_OUTPUT_SET"]),
|
|
294
|
-
}
|
|
295
|
-
);
|
|
296
|
-
|
|
297
|
-
expect(output).not.toContain("function myFunction1(){TEST_OUTPUT_SET(");
|
|
298
|
-
expect(output).toContain("eval");
|
|
299
|
-
|
|
300
|
-
// Inject 'eval' tamper code
|
|
301
|
-
output =
|
|
302
|
-
`var _eval = eval;
|
|
303
|
-
eval = (code)=>( TEST_OUTPUT_SET(code), console.log(code), _eval(code) );` +
|
|
304
|
-
output;
|
|
305
|
-
|
|
306
|
-
var { TEST_OUTPUT, error } = evalInNonStrictMode(output);
|
|
307
|
-
|
|
308
|
-
expect(TEST_OUTPUT).toStrictEqual("Correct Value");
|
|
309
|
-
expect(error).toBeTruthy(); // An error occurs because the RGF array was not initialized
|
|
310
|
-
});
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
describe("Strict Mode", () => {
|
|
314
|
-
test("Variant #1: Disallow Strict Mode", async () => {
|
|
315
|
-
var output = await JsConfuser(
|
|
316
|
-
`
|
|
317
|
-
"use strict"; // Note: Jest testing environment is already in Strict Mode
|
|
318
|
-
function onTamperDetected(){
|
|
319
|
-
TEST_OUTPUT = true;
|
|
320
|
-
}
|
|
321
|
-
`,
|
|
322
|
-
{
|
|
323
|
-
target: "node",
|
|
324
|
-
lock: {
|
|
325
|
-
tamperProtection: true,
|
|
326
|
-
countermeasures: "onTamperDetected",
|
|
327
|
-
},
|
|
328
|
-
}
|
|
329
|
-
);
|
|
330
|
-
|
|
331
|
-
var TEST_OUTPUT;
|
|
332
|
-
eval(output);
|
|
333
|
-
|
|
334
|
-
expect(TEST_OUTPUT).toStrictEqual(true);
|
|
335
|
-
});
|
|
336
|
-
});
|