js-confuser 1.7.1 → 1.7.3
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 +1 -1
- package/CHANGELOG.md +73 -0
- package/README.md +32 -31
- package/dist/compiler.js +2 -8
- package/dist/constants.js +22 -10
- package/dist/index.js +15 -30
- package/dist/obfuscator.js +15 -62
- package/dist/options.js +33 -40
- package/dist/order.js +4 -7
- package/dist/parser.js +5 -13
- package/dist/precedence.js +6 -8
- package/dist/presets.js +4 -6
- package/dist/probability.js +13 -24
- package/dist/templates/bufferToString.js +121 -5
- package/dist/templates/core.js +35 -0
- package/dist/templates/crash.js +22 -11
- package/dist/templates/es5.js +125 -6
- package/dist/templates/functionLength.js +24 -6
- package/dist/templates/globals.js +9 -0
- package/dist/templates/template.js +189 -43
- package/dist/transforms/antiTooling.js +26 -22
- package/dist/transforms/calculator.js +19 -55
- package/dist/transforms/controlFlowFlattening/controlFlowFlattening.js +242 -333
- package/dist/transforms/controlFlowFlattening/expressionObfuscation.js +46 -25
- package/dist/transforms/deadCode.js +542 -31
- package/dist/transforms/dispatcher.js +112 -112
- package/dist/transforms/es5/antiClass.js +70 -44
- package/dist/transforms/es5/antiDestructuring.js +14 -38
- package/dist/transforms/es5/antiES6Object.js +39 -48
- package/dist/transforms/es5/antiSpreadOperator.js +5 -14
- package/dist/transforms/es5/antiTemplate.js +10 -19
- package/dist/transforms/es5/es5.js +7 -40
- package/dist/transforms/extraction/classExtraction.js +83 -0
- package/dist/transforms/extraction/duplicateLiteralsRemoval.js +41 -80
- package/dist/transforms/extraction/objectExtraction.js +24 -56
- package/dist/transforms/finalizer.js +6 -20
- package/dist/transforms/flatten.js +51 -99
- package/dist/transforms/identifier/globalAnalysis.js +21 -26
- package/dist/transforms/identifier/globalConcealing.js +72 -56
- package/dist/transforms/identifier/movedDeclarations.js +66 -38
- package/dist/transforms/identifier/renameVariables.js +36 -68
- package/dist/transforms/identifier/variableAnalysis.js +21 -48
- package/dist/transforms/lock/antiDebug.js +20 -25
- package/dist/transforms/lock/integrity.js +53 -52
- package/dist/transforms/lock/lock.js +161 -126
- package/dist/transforms/minify.js +77 -108
- package/dist/transforms/opaquePredicates.js +12 -49
- package/dist/transforms/preparation.js +28 -49
- package/dist/transforms/renameLabels.js +5 -22
- package/dist/transforms/rgf.js +125 -72
- package/dist/transforms/shuffle.js +42 -47
- package/dist/transforms/stack.js +41 -98
- package/dist/transforms/string/encoding.js +76 -27
- package/dist/transforms/string/stringCompression.js +75 -68
- package/dist/transforms/string/stringConcealing.js +127 -135
- package/dist/transforms/string/stringEncoding.js +6 -26
- package/dist/transforms/string/stringSplitting.js +5 -30
- package/dist/transforms/transform.js +76 -104
- package/dist/traverse.js +11 -18
- package/dist/util/compare.js +27 -29
- package/dist/util/gen.js +32 -86
- package/dist/util/guard.js +5 -1
- package/dist/util/identifiers.js +9 -72
- package/dist/util/insert.js +27 -77
- package/dist/util/math.js +0 -3
- package/dist/util/object.js +3 -7
- package/dist/util/random.js +31 -36
- package/dist/util/scope.js +6 -3
- package/docs/Countermeasures.md +13 -6
- package/docs/Integrity.md +35 -28
- package/docs/RGF.md +6 -1
- package/docs/RenameVariables.md +116 -0
- package/docs/TamperProtection.md +100 -0
- package/docs/Template.md +117 -0
- package/package.json +3 -3
- package/src/constants.ts +17 -0
- package/src/index.ts +7 -5
- package/src/options.ts +60 -7
- package/src/order.ts +2 -2
- package/src/templates/bufferToString.ts +79 -11
- package/src/templates/core.ts +29 -0
- package/src/templates/crash.ts +6 -38
- package/src/templates/es5.ts +1 -1
- package/src/templates/functionLength.ts +21 -3
- package/src/templates/globals.ts +3 -0
- package/src/templates/template.ts +205 -46
- package/src/transforms/antiTooling.ts +33 -11
- package/src/transforms/calculator.ts +4 -2
- package/src/transforms/controlFlowFlattening/controlFlowFlattening.ts +12 -5
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +46 -10
- package/src/transforms/deadCode.ts +74 -42
- package/src/transforms/dispatcher.ts +99 -73
- package/src/transforms/es5/antiClass.ts +25 -12
- package/src/transforms/es5/antiDestructuring.ts +1 -1
- package/src/transforms/es5/antiES6Object.ts +2 -2
- package/src/transforms/es5/antiTemplate.ts +1 -1
- package/src/transforms/extraction/classExtraction.ts +168 -0
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +11 -16
- package/src/transforms/extraction/objectExtraction.ts +4 -15
- package/src/transforms/flatten.ts +20 -5
- package/src/transforms/identifier/globalAnalysis.ts +18 -1
- package/src/transforms/identifier/globalConcealing.ts +119 -72
- package/src/transforms/identifier/movedDeclarations.ts +90 -24
- package/src/transforms/identifier/renameVariables.ts +16 -1
- package/src/transforms/lock/antiDebug.ts +2 -2
- package/src/transforms/lock/integrity.ts +13 -11
- package/src/transforms/lock/lock.ts +122 -30
- package/src/transforms/minify.ts +28 -13
- package/src/transforms/opaquePredicates.ts +2 -2
- package/src/transforms/preparation.ts +16 -0
- package/src/transforms/rgf.ts +139 -12
- package/src/transforms/shuffle.ts +3 -3
- package/src/transforms/stack.ts +19 -4
- package/src/transforms/string/encoding.ts +88 -51
- package/src/transforms/string/stringCompression.ts +86 -17
- package/src/transforms/string/stringConcealing.ts +148 -118
- package/src/transforms/string/stringEncoding.ts +1 -2
- package/src/transforms/string/stringSplitting.ts +1 -2
- package/src/transforms/transform.ts +63 -46
- package/src/types.ts +2 -0
- package/src/util/compare.ts +39 -5
- package/src/util/gen.ts +10 -3
- package/src/util/guard.ts +10 -0
- package/src/util/insert.ts +17 -0
- package/src/util/random.ts +81 -1
- package/src/util/scope.ts +14 -2
- package/test/code/Cash.test.ts +94 -5
- package/test/code/StrictMode.src.js +65 -0
- package/test/code/StrictMode.test.js +37 -0
- package/test/compare.test.ts +62 -2
- package/test/options.test.ts +129 -55
- package/test/templates/template.test.ts +211 -1
- package/test/transforms/controlFlowFlattening/expressionObfuscation.test.ts +37 -18
- package/test/transforms/dispatcher.test.ts +55 -0
- package/test/transforms/extraction/classExtraction.test.ts +86 -0
- package/test/transforms/extraction/duplicateLiteralsRemoval.test.ts +8 -0
- package/test/transforms/extraction/objectExtraction.test.ts +2 -0
- package/test/transforms/identifier/globalConcealing.test.ts +89 -0
- package/test/transforms/identifier/movedDeclarations.test.ts +61 -0
- package/test/transforms/identifier/renameVariables.test.ts +75 -1
- package/test/transforms/lock/tamperProtection.test.ts +336 -0
- package/test/transforms/minify.test.ts +37 -0
- package/test/transforms/rgf.test.ts +50 -0
- package/dist/transforms/controlFlowFlattening/choiceFlowObfuscation.js +0 -62
- package/dist/transforms/controlFlowFlattening/controlFlowObfuscation.js +0 -159
- package/dist/transforms/controlFlowFlattening/switchCaseObfuscation.js +0 -106
- package/dist/transforms/eval.js +0 -84
- package/dist/transforms/hexadecimalNumbers.js +0 -63
- package/dist/transforms/hideInitializingCode.js +0 -270
- package/dist/transforms/identifier/nameRecycling.js +0 -218
- package/dist/transforms/label.js +0 -67
- package/dist/transforms/preparation/nameConflicts.js +0 -116
- package/dist/transforms/preparation/preparation.js +0 -188
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,76 @@
|
|
|
1
|
+
# `1.7.3`
|
|
2
|
+
Tamper Protection
|
|
3
|
+
|
|
4
|
+
### `Tamper Protection`
|
|
5
|
+
|
|
6
|
+
Tamper Protection safeguards the runtime behavior from being altered by JavaScript pitfalls.
|
|
7
|
+
|
|
8
|
+
[Learn more here.](/docs/TamperProtection.md)
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
- Rename Variables improvements:
|
|
13
|
+
|
|
14
|
+
- A new exposed function, `__JS_CONFUSER_VAR__`, can be used to access renamed variables. [Learn more here](/docs/RenameVariables.md).
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
```js
|
|
18
|
+
// Input
|
|
19
|
+
var name = "John Doe";
|
|
20
|
+
eval("console.log(" + __JS_CONFUSER_VAR__(name) + ")");
|
|
21
|
+
|
|
22
|
+
// Output
|
|
23
|
+
var CA1HU0 = 'John Doe';
|
|
24
|
+
eval('console.log(' + 'CA1HU0' + ')');
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
- Improved the `Zero Width` identifier generator (Thanks @doctor8296!)
|
|
28
|
+
|
|
29
|
+
- Pad the `String Concealing` array with more fake strings
|
|
30
|
+
|
|
31
|
+
- Improve `String Compression`
|
|
32
|
+
|
|
33
|
+
- New Web UI sneak peak: https://new--confuser.netlify.app/
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# `1.7.2`
|
|
37
|
+
Updates
|
|
38
|
+
|
|
39
|
+
- `Anti Tooling` & `Expression Obfuscation` improvements
|
|
40
|
+
- - No longer expanded by [webcrack](https://github.com/j4k0xb/webcrack), [synchrony](https://github.com/relative/synchrony) & [REstringer](https://github.com/PerimeterX/restringer)
|
|
41
|
+
|
|
42
|
+
- `String Concealing` improvements
|
|
43
|
+
- - Randomizes the charset for each obfuscation
|
|
44
|
+
- - Place multiple decryption functions throughout the code
|
|
45
|
+
- - These changes aim to defeat [JSConfuser-String-Decryptor](https://github.com/0v41n/JSConfuser-String-Decryptor) and any other RegEx-based decoders
|
|
46
|
+
|
|
47
|
+
- `Moved Declarations` improvements
|
|
48
|
+
- - Now moves some variables as unused parameters on certain functions
|
|
49
|
+
|
|
50
|
+
- `RGF` improvements
|
|
51
|
+
- - More likely to transform functions containing functions
|
|
52
|
+
|
|
53
|
+
- Fixed [#96](https://github.com/MichaelXF/js-confuser/issues/96)
|
|
54
|
+
- - Removed hardcoded limits on `String Concealing`, `String Compression`, and `Duplicate Literals Removal`
|
|
55
|
+
|
|
56
|
+
- Fixed [#106](https://github.com/MichaelXF/js-confuser/issues/106)
|
|
57
|
+
- - Final fix with const variables for `Object Extraction`
|
|
58
|
+
|
|
59
|
+
- Fixed [#131](https://github.com/MichaelXF/js-confuser/issues/131)
|
|
60
|
+
- - __dirname is no longer changed by `Global Concealing`
|
|
61
|
+
|
|
62
|
+
**New Option**
|
|
63
|
+
|
|
64
|
+
### `preserveFunctionLength`
|
|
65
|
+
- Modified functions will retain the correct `function.length` property. (`true/false`)
|
|
66
|
+
Enabled by default.
|
|
67
|
+
|
|
68
|
+
Minor improvements
|
|
69
|
+
- Preserve `function.length`
|
|
70
|
+
- Preserve Strict Mode behaviors
|
|
71
|
+
- Preserve indirect vs. direct [`eval`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) use
|
|
72
|
+
|
|
73
|
+
|
|
1
74
|
# `1.7.1`
|
|
2
75
|
Updates
|
|
3
76
|
|
package/README.md
CHANGED
|
@@ -131,6 +131,8 @@ Converts output to ES5-compatible code. (`true/false`)
|
|
|
131
131
|
|
|
132
132
|
Does not cover all cases such as Promises or Generator functions. Use [Babel](https://babel.dev/).
|
|
133
133
|
|
|
134
|
+
[Learn more here.](https://github.com/MichaelXF/js-confuser/blob/master/docs/ES5.md)
|
|
135
|
+
|
|
134
136
|
### `renameVariables`
|
|
135
137
|
|
|
136
138
|
Determines if variables should be renamed. (`true/false`)
|
|
@@ -181,33 +183,12 @@ var qFaI6S = function () {
|
|
|
181
183
|
qFaI6S();
|
|
182
184
|
```
|
|
183
185
|
|
|
186
|
+
[Learn mode here.](https://github.com/MichaelXF/js-confuser/blob/master/docs/RenameVariables.md)
|
|
187
|
+
|
|
184
188
|
### `renameGlobals`
|
|
185
189
|
|
|
186
190
|
Renames top-level variables, turn this off for web-related scripts. Enabled by default. (`true/false`)
|
|
187
191
|
|
|
188
|
-
```js
|
|
189
|
-
// Output (Same input from above)
|
|
190
|
-
var twoSum = function (Oc4nmjB, Fk3nptX) {
|
|
191
|
-
var on_KnCm = {};
|
|
192
|
-
var lqAauc = Oc4nmjB["length"];
|
|
193
|
-
for (var mALijp8 = 0; mALijp8 < lqAauc; mALijp8++) {
|
|
194
|
-
if (Oc4nmjB[mALijp8] in on_KnCm) {
|
|
195
|
-
return [on_KnCm[Oc4nmjB[mALijp8]], mALijp8];
|
|
196
|
-
}
|
|
197
|
-
on_KnCm[Fk3nptX - Oc4nmjB[mALijp8]] = mALijp8;
|
|
198
|
-
}
|
|
199
|
-
return [-1, -1];
|
|
200
|
-
};
|
|
201
|
-
var test = function () {
|
|
202
|
-
var y5ySeZ = [2, 7, 11, 15];
|
|
203
|
-
var gHYMOm = 9;
|
|
204
|
-
var aAdj3v = [0, 1];
|
|
205
|
-
var GnLVHX = twoSum(y5ySeZ, gHYMOm);
|
|
206
|
-
!(ok(GnLVHX[0] === aAdj3v[0]), ok(GnLVHX[1] === aAdj3v[1]));
|
|
207
|
-
};
|
|
208
|
-
test();
|
|
209
|
-
```
|
|
210
|
-
|
|
211
192
|
### `identifierGenerator`
|
|
212
193
|
|
|
213
194
|
Determines how variables are renamed.
|
|
@@ -392,8 +373,11 @@ yAt1T_y(-93)["log"]("Hello World");
|
|
|
392
373
|
```
|
|
393
374
|
|
|
394
375
|
### `stringCompression`
|
|
376
|
+
|
|
395
377
|
String Compression uses LZW's compression algorithm to compress strings. (`true/false/0-1`)
|
|
396
378
|
|
|
379
|
+
Use a number to control the percentage of strings.
|
|
380
|
+
|
|
397
381
|
`"console"` -> `inflate('replaĕ!ğğuģģ<~@')`
|
|
398
382
|
|
|
399
383
|
### `stringConcealing`
|
|
@@ -408,6 +392,8 @@ Use a number to control the percentage of strings.
|
|
|
408
392
|
|
|
409
393
|
String Encoding transforms a string into an encoded representation. (`true/false/0-1`)
|
|
410
394
|
|
|
395
|
+
**⚠️ Warning: Significantly increases file size! It is not recommended for most use cases.**
|
|
396
|
+
|
|
411
397
|
Use a number to control the percentage of strings.
|
|
412
398
|
|
|
413
399
|
`"console"` -> `'\x63\x6f\x6e\x73\x6f\x6c\x65'`
|
|
@@ -595,9 +581,16 @@ Creates a calculator function to handle arithmetic and logical expressions. (`tr
|
|
|
595
581
|
|
|
596
582
|
Adds `debugger` statements throughout the code. Additionally adds a background function for DevTools detection. (`true/false/0-1`)
|
|
597
583
|
|
|
598
|
-
### `lock.
|
|
584
|
+
### `lock.tamperProtection`
|
|
599
585
|
|
|
600
|
-
|
|
586
|
+
Tamper Protection safeguards the runtime behavior from being altered by JavaScript pitfalls. (`true/false`)
|
|
587
|
+
|
|
588
|
+
**⚠️ Tamper Protection requires eval and ran in a non-strict mode environment!**
|
|
589
|
+
|
|
590
|
+
- **This can break your code.**
|
|
591
|
+
- **Due to the security concerns of arbitrary code execution, you must enable this yourself.**
|
|
592
|
+
|
|
593
|
+
[Learn more here](https://github.com/MichaelXF/js-confuser/blob/master/TamperProtection.md).
|
|
601
594
|
|
|
602
595
|
### `lock.startDate`
|
|
603
596
|
|
|
@@ -647,10 +640,14 @@ Integrity ensures the source code is unchanged. (`true/false/0-1`)
|
|
|
647
640
|
|
|
648
641
|
A custom callback function to invoke when a lock is triggered. (`string/false`)
|
|
649
642
|
|
|
650
|
-
[Learn more
|
|
643
|
+
[Learn more here.](https://github.com/MichaelXF/js-confuser/blob/master/docs/Countermeasures.md)
|
|
651
644
|
|
|
652
645
|
Otherwise, the obfuscator falls back to crashing the process.
|
|
653
646
|
|
|
647
|
+
### `lock.context`
|
|
648
|
+
|
|
649
|
+
Properties that must be present on the `window` object (or `global` for NodeJS). (`string[]`)
|
|
650
|
+
|
|
654
651
|
### `movedDeclarations`
|
|
655
652
|
|
|
656
653
|
Moves variable declarations to the top of the context. (`true/false`)
|
|
@@ -666,9 +663,8 @@ function getAreaOfCircle(radius) {
|
|
|
666
663
|
}
|
|
667
664
|
|
|
668
665
|
// Output
|
|
669
|
-
function getAreaOfCircle(yLu5YB1) {
|
|
670
|
-
|
|
671
|
-
var F8QuPL = Math["PI"];
|
|
666
|
+
function getAreaOfCircle(yLu5YB1, eUf7Wle, XVYH4D, F8QuPL) {
|
|
667
|
+
F8QuPL = Math["PI"];
|
|
672
668
|
typeof ((eUf7Wle = Math["pow"](yLu5YB1, 2)), (XVYH4D = F8QuPL * eUf7Wle));
|
|
673
669
|
return XVYH4D;
|
|
674
670
|
}
|
|
@@ -804,6 +800,7 @@ You must enable locks yourself, and configure them to your needs.
|
|
|
804
800
|
lock: {
|
|
805
801
|
integrity: true,
|
|
806
802
|
selfDefending: true,
|
|
803
|
+
tamperProtection: true,
|
|
807
804
|
domainLock: ["mywebsite.com"],
|
|
808
805
|
osLock: ["windows", "linux"],
|
|
809
806
|
browserLock: ["firefox"],
|
|
@@ -832,10 +829,14 @@ These features are experimental or a security concern.
|
|
|
832
829
|
// set to false for web-related scripts
|
|
833
830
|
renameGlobals: false,
|
|
834
831
|
|
|
835
|
-
//
|
|
832
|
+
// custom implementation
|
|
836
833
|
identifierGenerator: function(){
|
|
837
834
|
return "myvar_" + (counter++);
|
|
838
|
-
}
|
|
835
|
+
},
|
|
836
|
+
|
|
837
|
+
// Modified functions will retain the correct `function.length` property.
|
|
838
|
+
// Enabled by default.
|
|
839
|
+
preserveFunctionLength: false
|
|
839
840
|
}
|
|
840
841
|
```
|
|
841
842
|
|
package/dist/compiler.js
CHANGED
|
@@ -5,22 +5,18 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.compileJsSync = compileJsSync;
|
|
7
7
|
exports.default = compileJs;
|
|
8
|
-
|
|
9
8
|
const escodegen = require("escodegen");
|
|
10
|
-
|
|
11
9
|
async function compileJs(tree, options) {
|
|
12
10
|
return compileJsSync(tree, options);
|
|
13
11
|
}
|
|
14
|
-
|
|
15
12
|
function compileJsSync(tree, options) {
|
|
16
13
|
var api = {
|
|
17
|
-
format: {
|
|
14
|
+
format: {
|
|
15
|
+
...escodegen.FORMAT_MINIFY
|
|
18
16
|
}
|
|
19
17
|
};
|
|
20
|
-
|
|
21
18
|
if (!options.compact) {
|
|
22
19
|
api = {};
|
|
23
|
-
|
|
24
20
|
if (options.indent && options.indent != 4) {
|
|
25
21
|
api.format = {};
|
|
26
22
|
api.format.indent = {
|
|
@@ -31,10 +27,8 @@ function compileJsSync(tree, options) {
|
|
|
31
27
|
};
|
|
32
28
|
}
|
|
33
29
|
}
|
|
34
|
-
|
|
35
30
|
if (options.debugComments) {
|
|
36
31
|
api.comment = true;
|
|
37
32
|
}
|
|
38
|
-
|
|
39
33
|
return escodegen.generate(tree, api);
|
|
40
34
|
}
|
package/dist/constants.js
CHANGED
|
@@ -3,20 +3,32 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.reservedKeywords = exports.reservedIdentifiers = exports.placeholderVariablePrefix = exports.noRenameVariablePrefix = void 0;
|
|
7
|
-
|
|
6
|
+
exports.variableFunctionName = exports.reservedKeywords = exports.reservedIdentifiers = exports.predictableFunctionTag = exports.placeholderVariablePrefix = exports.noRenameVariablePrefix = exports.criticalFunctionTag = void 0;
|
|
8
7
|
/**
|
|
9
8
|
* Keywords disallowed for variable names in ES5 and under.
|
|
10
9
|
*/
|
|
11
|
-
const reservedKeywords = new Set(["abstract", "arguments", "await", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "debugger", "default", "delete", "do", "double", "else", "enum", "eval", "export", "extends", "false", "final", "finally", "float", "for", "function", "goto", "if", "implements", "import", "in", "instanceof", "int", "interface", "let", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "typeof", "var", "void", "volatile", "while", "with", "yield"]);
|
|
10
|
+
const reservedKeywords = exports.reservedKeywords = new Set(["abstract", "arguments", "await", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "debugger", "default", "delete", "do", "double", "else", "enum", "eval", "export", "extends", "false", "final", "finally", "float", "for", "function", "goto", "if", "implements", "import", "in", "instanceof", "int", "interface", "let", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "typeof", "var", "void", "volatile", "while", "with", "yield"]);
|
|
11
|
+
|
|
12
12
|
/**
|
|
13
13
|
* Identifiers that are not actually variables.
|
|
14
14
|
*/
|
|
15
|
+
const reservedIdentifiers = exports.reservedIdentifiers = new Set(["undefined", "null", "NaN", "Infinity", "eval", "arguments"]);
|
|
16
|
+
const noRenameVariablePrefix = exports.noRenameVariablePrefix = "__NO_JS_CONFUSER_RENAME__";
|
|
17
|
+
const placeholderVariablePrefix = exports.placeholderVariablePrefix = "__p_";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Tells the obfuscator this function is predictable:
|
|
21
|
+
* - Never called with extraneous parameters
|
|
22
|
+
*/
|
|
23
|
+
const predictableFunctionTag = exports.predictableFunctionTag = "__JS_PREDICT__";
|
|
15
24
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
exports.
|
|
21
|
-
|
|
22
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Tells the obfuscator this function is critical for the Obfuscated code.
|
|
27
|
+
* - Example: string decryption function
|
|
28
|
+
*/
|
|
29
|
+
const criticalFunctionTag = exports.criticalFunctionTag = "__JS_CRITICAL__";
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Allows the user to grab the variable name of a renamed variable.
|
|
33
|
+
*/
|
|
34
|
+
const variableFunctionName = exports.variableFunctionName = "__JS_CONFUSER_VAR__";
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,12 @@ Object.defineProperty(exports, "Obfuscator", {
|
|
|
9
9
|
return _obfuscator.default;
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
|
+
Object.defineProperty(exports, "Template", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _template.default;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
12
18
|
Object.defineProperty(exports, "Transform", {
|
|
13
19
|
enumerable: true,
|
|
14
20
|
get: function () {
|
|
@@ -24,29 +30,18 @@ Object.defineProperty(exports, "presets", {
|
|
|
24
30
|
return _presets.default;
|
|
25
31
|
}
|
|
26
32
|
});
|
|
27
|
-
|
|
28
33
|
var _compiler = _interopRequireWildcard(require("./compiler"));
|
|
29
|
-
|
|
30
34
|
var _parser = _interopRequireWildcard(require("./parser"));
|
|
31
|
-
|
|
32
35
|
var _obfuscator = _interopRequireDefault(require("./obfuscator"));
|
|
33
|
-
|
|
34
36
|
var _transform = _interopRequireDefault(require("./transforms/transform"));
|
|
35
|
-
|
|
37
|
+
var _template = _interopRequireDefault(require("./templates/template"));
|
|
36
38
|
var _object = require("./util/object");
|
|
37
|
-
|
|
38
39
|
var _presets = _interopRequireDefault(require("./presets"));
|
|
39
|
-
|
|
40
40
|
var assert = _interopRequireWildcard(require("assert"));
|
|
41
|
-
|
|
42
41
|
var _options = require("./options");
|
|
43
|
-
|
|
44
|
-
function
|
|
45
|
-
|
|
46
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
47
|
-
|
|
48
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
49
|
-
|
|
42
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
43
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
44
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
50
45
|
/**
|
|
51
46
|
* **JsConfuser**: Obfuscates JavaScript.
|
|
52
47
|
* @param code - The code to be obfuscated.
|
|
@@ -55,6 +50,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
55
50
|
async function obfuscate(code, options) {
|
|
56
51
|
return await JsConfuser(code, options);
|
|
57
52
|
}
|
|
53
|
+
|
|
58
54
|
/**
|
|
59
55
|
* Obfuscates an [ESTree](https://github.com/estree/estree) compliant AST.
|
|
60
56
|
*
|
|
@@ -65,8 +61,6 @@ async function obfuscate(code, options) {
|
|
|
65
61
|
*
|
|
66
62
|
* [See all settings here](https://github.com/MichaelXF/js-confuser#options)
|
|
67
63
|
*/
|
|
68
|
-
|
|
69
|
-
|
|
70
64
|
async function obfuscateAST(AST, options) {
|
|
71
65
|
assert.ok(typeof AST === "object", "AST must be type object");
|
|
72
66
|
assert.ok(AST.type == "Program", "AST.type must be equal to 'Program'");
|
|
@@ -77,18 +71,16 @@ async function obfuscateAST(AST, options) {
|
|
|
77
71
|
options.verbose && console.log("* Removing $ properties");
|
|
78
72
|
(0, _object.remove$Properties)(AST);
|
|
79
73
|
}
|
|
74
|
+
|
|
80
75
|
/**
|
|
81
76
|
* **JsConfuser**: Obfuscates JavaScript.
|
|
82
77
|
* @param code - The code to be obfuscated.
|
|
83
78
|
* @param options - An object of obfuscation options: `{preset: "medium", target: "browser"}`.
|
|
84
79
|
*/
|
|
85
|
-
|
|
86
|
-
|
|
87
80
|
var JsConfuser = async function (code, options) {
|
|
88
81
|
if (typeof code !== "string") {
|
|
89
82
|
throw new TypeError("code must be type string");
|
|
90
83
|
}
|
|
91
|
-
|
|
92
84
|
(0, _options.validateOptions)(options);
|
|
93
85
|
options = await (0, _options.correctOptions)(options);
|
|
94
86
|
options.verbose && console.log("* Parsing source code");
|
|
@@ -102,7 +94,6 @@ var JsConfuser = async function (code, options) {
|
|
|
102
94
|
var result = await (0, _compiler.default)(tree, options);
|
|
103
95
|
return result;
|
|
104
96
|
};
|
|
105
|
-
|
|
106
97
|
const debugTransformations = async function (code, options) {
|
|
107
98
|
(0, _options.validateOptions)(options);
|
|
108
99
|
options = await (0, _options.correctOptions)(options);
|
|
@@ -121,6 +112,7 @@ const debugTransformations = async function (code, options) {
|
|
|
121
112
|
await obfuscator.apply(tree, true);
|
|
122
113
|
return frames;
|
|
123
114
|
};
|
|
115
|
+
|
|
124
116
|
/**
|
|
125
117
|
* This method is used by the obfuscator website to display a progress bar and additional information
|
|
126
118
|
* about the obfuscation.
|
|
@@ -130,10 +122,7 @@ const debugTransformations = async function (code, options) {
|
|
|
130
122
|
* @param callback - Progress callback, called after each transformation
|
|
131
123
|
* @returns
|
|
132
124
|
*/
|
|
133
|
-
|
|
134
|
-
|
|
135
125
|
exports.debugTransformations = debugTransformations;
|
|
136
|
-
|
|
137
126
|
const debugObfuscation = async function (code, options, callback, performance) {
|
|
138
127
|
const startTime = performance.now();
|
|
139
128
|
(0, _options.validateOptions)(options);
|
|
@@ -166,7 +155,6 @@ const debugObfuscation = async function (code, options, callback, performance) {
|
|
|
166
155
|
totalPossibleTransforms: obfuscator.totalPossibleTransforms
|
|
167
156
|
};
|
|
168
157
|
};
|
|
169
|
-
|
|
170
158
|
exports.debugObfuscation = debugObfuscation;
|
|
171
159
|
JsConfuser.obfuscate = obfuscate;
|
|
172
160
|
JsConfuser.obfuscateAST = obfuscateAST;
|
|
@@ -175,14 +163,11 @@ JsConfuser.debugTransformations = debugTransformations;
|
|
|
175
163
|
JsConfuser.debugObfuscation = debugObfuscation;
|
|
176
164
|
JsConfuser.Obfuscator = _obfuscator.default;
|
|
177
165
|
JsConfuser.Transform = _transform.default;
|
|
178
|
-
|
|
166
|
+
JsConfuser.Template = _template.default;
|
|
179
167
|
if (typeof window !== "undefined") {
|
|
180
168
|
window["JsConfuser"] = JsConfuser;
|
|
181
169
|
}
|
|
182
|
-
|
|
183
170
|
if (typeof global !== "undefined") {
|
|
184
171
|
global["JsConfuser"] = JsConfuser;
|
|
185
172
|
}
|
|
186
|
-
|
|
187
|
-
var _default = JsConfuser;
|
|
188
|
-
exports.default = _default;
|
|
173
|
+
var _default = exports.default = JsConfuser;
|
package/dist/obfuscator.js
CHANGED
|
@@ -4,110 +4,72 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _assert = require("assert");
|
|
9
|
-
|
|
10
8
|
var _events = require("events");
|
|
11
|
-
|
|
12
9
|
var _traverse = _interopRequireDefault(require("./traverse"));
|
|
13
|
-
|
|
14
10
|
var _probability = require("./probability");
|
|
15
|
-
|
|
16
11
|
var _preparation = _interopRequireDefault(require("./transforms/preparation"));
|
|
17
|
-
|
|
18
12
|
var _objectExtraction = _interopRequireDefault(require("./transforms/extraction/objectExtraction"));
|
|
19
|
-
|
|
20
13
|
var _lock = _interopRequireDefault(require("./transforms/lock/lock"));
|
|
21
|
-
|
|
22
14
|
var _dispatcher = _interopRequireDefault(require("./transforms/dispatcher"));
|
|
23
|
-
|
|
24
15
|
var _deadCode = _interopRequireDefault(require("./transforms/deadCode"));
|
|
25
|
-
|
|
26
16
|
var _opaquePredicates = _interopRequireDefault(require("./transforms/opaquePredicates"));
|
|
27
|
-
|
|
28
17
|
var _calculator = _interopRequireDefault(require("./transforms/calculator"));
|
|
29
|
-
|
|
30
18
|
var _controlFlowFlattening = _interopRequireDefault(require("./transforms/controlFlowFlattening/controlFlowFlattening"));
|
|
31
|
-
|
|
32
19
|
var _globalConcealing = _interopRequireDefault(require("./transforms/identifier/globalConcealing"));
|
|
33
|
-
|
|
34
20
|
var _stringSplitting = _interopRequireDefault(require("./transforms/string/stringSplitting"));
|
|
35
|
-
|
|
36
21
|
var _stringConcealing = _interopRequireDefault(require("./transforms/string/stringConcealing"));
|
|
37
|
-
|
|
38
22
|
var _stringCompression = _interopRequireDefault(require("./transforms/string/stringCompression"));
|
|
39
|
-
|
|
40
23
|
var _duplicateLiteralsRemoval = _interopRequireDefault(require("./transforms/extraction/duplicateLiteralsRemoval"));
|
|
41
|
-
|
|
42
24
|
var _shuffle = _interopRequireDefault(require("./transforms/shuffle"));
|
|
43
|
-
|
|
44
25
|
var _movedDeclarations = _interopRequireDefault(require("./transforms/identifier/movedDeclarations"));
|
|
45
|
-
|
|
46
26
|
var _renameVariables = _interopRequireDefault(require("./transforms/identifier/renameVariables"));
|
|
47
|
-
|
|
48
27
|
var _renameLabels = _interopRequireDefault(require("./transforms/renameLabels"));
|
|
49
|
-
|
|
50
28
|
var _minify = _interopRequireDefault(require("./transforms/minify"));
|
|
51
|
-
|
|
52
29
|
var _es = _interopRequireDefault(require("./transforms/es5/es5"));
|
|
53
|
-
|
|
54
30
|
var _rgf = _interopRequireDefault(require("./transforms/rgf"));
|
|
55
|
-
|
|
56
31
|
var _flatten = _interopRequireDefault(require("./transforms/flatten"));
|
|
57
|
-
|
|
58
32
|
var _stack = _interopRequireDefault(require("./transforms/stack"));
|
|
59
|
-
|
|
60
33
|
var _antiTooling = _interopRequireDefault(require("./transforms/antiTooling"));
|
|
61
|
-
|
|
62
34
|
var _finalizer = _interopRequireDefault(require("./transforms/finalizer"));
|
|
63
|
-
|
|
64
|
-
function
|
|
65
|
-
|
|
66
|
-
function
|
|
67
|
-
|
|
35
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
36
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
37
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
38
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
68
39
|
/**
|
|
69
40
|
* The parent transformation holding the `state`.
|
|
70
41
|
*/
|
|
71
42
|
class Obfuscator extends _events.EventEmitter {
|
|
72
43
|
constructor(options) {
|
|
73
44
|
var _this;
|
|
74
|
-
|
|
75
45
|
super();
|
|
76
46
|
_this = this;
|
|
77
47
|
this.options = options;
|
|
78
|
-
|
|
79
48
|
_defineProperty(this, "varCount", void 0);
|
|
80
|
-
|
|
81
49
|
_defineProperty(this, "transforms", void 0);
|
|
82
|
-
|
|
83
50
|
_defineProperty(this, "array", void 0);
|
|
84
|
-
|
|
85
51
|
_defineProperty(this, "state", "transform");
|
|
86
|
-
|
|
87
52
|
_defineProperty(this, "generated", void 0);
|
|
88
|
-
|
|
89
53
|
_defineProperty(this, "totalPossibleTransforms", void 0);
|
|
90
|
-
|
|
91
54
|
this.varCount = 0;
|
|
92
55
|
this.transforms = Object.create(null);
|
|
93
56
|
this.generated = new Set();
|
|
94
57
|
this.totalPossibleTransforms = 0;
|
|
95
|
-
|
|
96
58
|
const test = function (map) {
|
|
97
59
|
for (var _len = arguments.length, transformers = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
98
60
|
transformers[_key - 1] = arguments[_key];
|
|
99
61
|
}
|
|
100
|
-
|
|
101
62
|
_this.totalPossibleTransforms += transformers.length;
|
|
102
|
-
|
|
103
63
|
if ((0, _probability.isProbabilityMapProbable)(map)) {
|
|
104
64
|
// options.verbose && console.log("+ Added " + transformer.name);
|
|
65
|
+
|
|
105
66
|
transformers.forEach(Transformer => _this.push(new Transformer(_this)));
|
|
106
|
-
} else {
|
|
67
|
+
} else {
|
|
68
|
+
// options.verbose && console.log("- Skipped adding " + transformer.name);
|
|
107
69
|
}
|
|
108
|
-
};
|
|
109
|
-
|
|
70
|
+
};
|
|
110
71
|
|
|
72
|
+
// Optimization: Only add needed transformers. If a probability always return false, no need in running that extra code.
|
|
111
73
|
test(true, _preparation.default);
|
|
112
74
|
test(true, _renameLabels.default);
|
|
113
75
|
test(options.objectExtraction, _objectExtraction.default);
|
|
@@ -134,28 +96,25 @@ class Obfuscator extends _events.EventEmitter {
|
|
|
134
96
|
|
|
135
97
|
if (options.lock && Object.keys(options.lock).filter(x => x == "domainLock" ? options.lock.domainLock && options.lock.domainLock.length : options.lock[x]).length) {
|
|
136
98
|
test(true, _lock.default);
|
|
137
|
-
}
|
|
138
|
-
|
|
99
|
+
}
|
|
139
100
|
|
|
140
|
-
|
|
101
|
+
// Make array
|
|
102
|
+
this.array = Object.values(this.transforms);
|
|
141
103
|
|
|
104
|
+
// Sort transformations based on their priority
|
|
142
105
|
this.array.sort((a, b) => a.priority - b.priority);
|
|
143
106
|
}
|
|
144
|
-
|
|
145
107
|
push(transform) {
|
|
146
108
|
if (transform.className) {
|
|
147
109
|
(0, _assert.ok)(!this.transforms[transform.className], "Already have " + transform.className);
|
|
148
110
|
}
|
|
149
|
-
|
|
150
111
|
this.transforms[transform.className] = transform;
|
|
151
112
|
}
|
|
152
|
-
|
|
153
113
|
resetState() {
|
|
154
114
|
this.varCount = 0;
|
|
155
115
|
this.generated = new Set();
|
|
156
116
|
this.state = "transform";
|
|
157
117
|
}
|
|
158
|
-
|
|
159
118
|
async apply(tree) {
|
|
160
119
|
let debugMode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
161
120
|
(0, _assert.ok)(tree.type == "Program", "The root node must be type 'Program'");
|
|
@@ -163,22 +122,19 @@ class Obfuscator extends _events.EventEmitter {
|
|
|
163
122
|
(0, _assert.ok)(Array.isArray(this.array));
|
|
164
123
|
this.resetState();
|
|
165
124
|
var completed = 0;
|
|
166
|
-
|
|
167
125
|
for (var transform of this.array) {
|
|
168
126
|
await transform.apply(tree);
|
|
169
127
|
completed++;
|
|
170
|
-
|
|
171
128
|
if (debugMode) {
|
|
172
129
|
this.emit("debug", transform.className, tree, completed);
|
|
173
130
|
}
|
|
174
131
|
}
|
|
175
|
-
|
|
176
132
|
if (this.options.verbose) {
|
|
177
133
|
console.log("-> Check for Eval Callbacks");
|
|
178
134
|
}
|
|
135
|
+
this.state = "eval";
|
|
179
136
|
|
|
180
|
-
|
|
181
|
-
|
|
137
|
+
// Find eval callbacks
|
|
182
138
|
(0, _traverse.default)(tree, (o, p) => {
|
|
183
139
|
if (o.$eval) {
|
|
184
140
|
return () => {
|
|
@@ -186,12 +142,9 @@ class Obfuscator extends _events.EventEmitter {
|
|
|
186
142
|
};
|
|
187
143
|
}
|
|
188
144
|
});
|
|
189
|
-
|
|
190
145
|
if (this.options.verbose) {
|
|
191
146
|
console.log("<- Done");
|
|
192
147
|
}
|
|
193
148
|
}
|
|
194
|
-
|
|
195
149
|
}
|
|
196
|
-
|
|
197
150
|
exports.default = Obfuscator;
|