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,372 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _traverse = _interopRequireDefault(require("../traverse"));
|
|
8
|
-
var _gen = require("../util/gen");
|
|
9
|
-
var _random = require("../util/random");
|
|
10
|
-
var _assert = require("assert");
|
|
11
|
-
var _obfuscator = _interopRequireDefault(require("../obfuscator"));
|
|
12
|
-
var _probability = require("../probability");
|
|
13
|
-
var _constants = require("../constants");
|
|
14
|
-
var _order = require("../order");
|
|
15
|
-
var _insert = require("../util/insert");
|
|
16
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
17
|
-
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; }
|
|
18
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
19
|
-
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); }
|
|
20
|
-
/**
|
|
21
|
-
* Base-class for all transformations.
|
|
22
|
-
* - Transformations can have preparation transformations `.before`
|
|
23
|
-
* - Transformations can have cleanup transformations `.after`
|
|
24
|
-
*
|
|
25
|
-
* - `match()` function returns true/false if possible candidate
|
|
26
|
-
* - `transform()` function modifies the object
|
|
27
|
-
*
|
|
28
|
-
* ```js
|
|
29
|
-
* class Example extends Transform {
|
|
30
|
-
* constructor(o){
|
|
31
|
-
* super(o);
|
|
32
|
-
* }
|
|
33
|
-
*
|
|
34
|
-
* match(object, parents){
|
|
35
|
-
* return object.type == "...";
|
|
36
|
-
* }
|
|
37
|
-
*
|
|
38
|
-
* transform(object, parents){
|
|
39
|
-
* // onEnter
|
|
40
|
-
*
|
|
41
|
-
* return ()=>{
|
|
42
|
-
* // onExit
|
|
43
|
-
* }
|
|
44
|
-
* }
|
|
45
|
-
*
|
|
46
|
-
* apply(tree){
|
|
47
|
-
* // onStart
|
|
48
|
-
*
|
|
49
|
-
* super.apply(tree);
|
|
50
|
-
*
|
|
51
|
-
* // onEnd
|
|
52
|
-
* }
|
|
53
|
-
* }
|
|
54
|
-
* ```
|
|
55
|
-
*/
|
|
56
|
-
class Transform {
|
|
57
|
-
constructor(obfuscator) {
|
|
58
|
-
let priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
|
|
59
|
-
/**
|
|
60
|
-
* The obfuscator.
|
|
61
|
-
*/
|
|
62
|
-
_defineProperty(this, "obfuscator", void 0);
|
|
63
|
-
/**
|
|
64
|
-
* The user's options.
|
|
65
|
-
*/
|
|
66
|
-
_defineProperty(this, "options", void 0);
|
|
67
|
-
/**
|
|
68
|
-
* Only required for top-level transformations.
|
|
69
|
-
*/
|
|
70
|
-
_defineProperty(this, "priority", void 0);
|
|
71
|
-
/**
|
|
72
|
-
* Transforms to run before, such as `Variable Analysis`.
|
|
73
|
-
*/
|
|
74
|
-
_defineProperty(this, "before", void 0);
|
|
75
|
-
/**
|
|
76
|
-
* Transforms to run after.
|
|
77
|
-
*/
|
|
78
|
-
_defineProperty(this, "after", void 0);
|
|
79
|
-
_defineProperty(this, "initVariables", new Map());
|
|
80
|
-
_defineProperty(this, "zeroWidthGenerator", (0, _random.createZeroWidthGenerator)());
|
|
81
|
-
_defineProperty(this, "createInitVariable", (value, parents) => {
|
|
82
|
-
var key = value.templates[0];
|
|
83
|
-
if (this.initVariables.has(key)) {
|
|
84
|
-
return this.initVariables.get(key);
|
|
85
|
-
}
|
|
86
|
-
var root = parents[parents.length - 1];
|
|
87
|
-
(0, _assert.ok)(root.type === "Program");
|
|
88
|
-
var name = this.getPlaceholder();
|
|
89
|
-
this.initVariables.set(key, name);
|
|
90
|
-
(0, _insert.prepend)(root, (0, _gen.VariableDeclaration)((0, _gen.VariableDeclarator)(name, value.single().expression)));
|
|
91
|
-
return name;
|
|
92
|
-
});
|
|
93
|
-
(0, _assert.ok)(obfuscator instanceof _obfuscator.default, "obfuscator should be an Obfuscator");
|
|
94
|
-
this.obfuscator = obfuscator;
|
|
95
|
-
this.options = this.obfuscator.options;
|
|
96
|
-
this.priority = priority;
|
|
97
|
-
this.before = [];
|
|
98
|
-
this.after = [];
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* The transformation name.
|
|
103
|
-
*/
|
|
104
|
-
get className() {
|
|
105
|
-
return _order.ObfuscateOrder[this.priority] || this.__proto__.constructor.name;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Gets the `Lock` transformation.
|
|
110
|
-
*/
|
|
111
|
-
get lockTransform() {
|
|
112
|
-
var transform = this.obfuscator.transforms["Lock"];
|
|
113
|
-
(0, _assert.ok)(transform, "Lock transform not created");
|
|
114
|
-
return transform;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Wraps the given name with the `__JS_CONFUSER_VAR__` function call.
|
|
119
|
-
*
|
|
120
|
-
* If `Rename Variables` is disabled, the name is returned as-is.
|
|
121
|
-
* @param name
|
|
122
|
-
* @returns
|
|
123
|
-
*/
|
|
124
|
-
jsConfuserVar(name) {
|
|
125
|
-
if (!this.obfuscator.transforms["RenameVariables"]) {
|
|
126
|
-
return `"${name}"`;
|
|
127
|
-
}
|
|
128
|
-
return `__JS_CONFUSER_VAR__(${name})`;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Run an AST through the transformation (including `pre` and `post` transforms)
|
|
133
|
-
* @param tree
|
|
134
|
-
*/
|
|
135
|
-
apply(tree) {
|
|
136
|
-
if (tree.type == "Program" && this.options.verbose) {
|
|
137
|
-
if (this.priority === -1) {
|
|
138
|
-
console.log("#", ">", this.className);
|
|
139
|
-
} else {
|
|
140
|
-
console.log("#", this.priority, this.className);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Run through pre-transformations
|
|
146
|
-
*/
|
|
147
|
-
this.before.forEach(x => x.apply(tree));
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Run this transformation
|
|
151
|
-
*/
|
|
152
|
-
(0, _traverse.default)(tree, (object, parents) => {
|
|
153
|
-
return this.input(object, parents);
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Cleanup transformations
|
|
158
|
-
*/
|
|
159
|
-
this.after.forEach(x => x.apply(tree));
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* The `match` function filters for possible candidates.
|
|
164
|
-
*
|
|
165
|
-
* - If `true`, the node is sent to the `transform()` method
|
|
166
|
-
* - else it's discarded.
|
|
167
|
-
*
|
|
168
|
-
* @param object
|
|
169
|
-
* @param parents
|
|
170
|
-
* @param block
|
|
171
|
-
*/
|
|
172
|
-
match(object, parents) {
|
|
173
|
-
throw new Error("not implemented");
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Modifies the given node.
|
|
178
|
-
*
|
|
179
|
-
* - Return a function to be ran when the node is exited.
|
|
180
|
-
* - The node is safe to modify in most cases.
|
|
181
|
-
*
|
|
182
|
-
* @param object - Current node
|
|
183
|
-
* @param parents - Array of ancestors `[Closest, ..., Root]`
|
|
184
|
-
* @param block
|
|
185
|
-
*/
|
|
186
|
-
transform(object, parents) {
|
|
187
|
-
throw new Error("not implemented");
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Calls `.match` with the given parameters, and then `.transform` if satisfied.
|
|
192
|
-
* @private
|
|
193
|
-
*/
|
|
194
|
-
input(object, parents) {
|
|
195
|
-
if (this.match(object, parents)) {
|
|
196
|
-
return this.transform(object, parents);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* Returns a random string.
|
|
202
|
-
*
|
|
203
|
-
* Used for creating temporary variables names, typically before RenameVariables has ran.
|
|
204
|
-
*
|
|
205
|
-
* These long temp names will be converted to short, mangled names by RenameVariables.
|
|
206
|
-
*/
|
|
207
|
-
getPlaceholder() {
|
|
208
|
-
const genRanHex = size => [...Array(size)].map(() => Math.floor(Math.random() * 10).toString(10)).join("");
|
|
209
|
-
return _constants.placeholderVariablePrefix + genRanHex(10);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Returns an independent name generator with it's own counter.
|
|
214
|
-
* @param overrideMode - Override the user's `identifierGenerator` option
|
|
215
|
-
* @returns
|
|
216
|
-
*/
|
|
217
|
-
getGenerator(overrideMode) {
|
|
218
|
-
var count = 0;
|
|
219
|
-
var identifiers = new Set();
|
|
220
|
-
return {
|
|
221
|
-
generate: () => {
|
|
222
|
-
var retValue;
|
|
223
|
-
do {
|
|
224
|
-
count++;
|
|
225
|
-
retValue = this.generateIdentifier(-1, count, overrideMode);
|
|
226
|
-
} while (identifiers.has(retValue));
|
|
227
|
-
identifiers.add(retValue);
|
|
228
|
-
return retValue;
|
|
229
|
-
}
|
|
230
|
-
};
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
/**
|
|
234
|
-
* Generates a valid variable name.
|
|
235
|
-
* @param length Default length is 6 to 10 characters.
|
|
236
|
-
* @returns **`string`**
|
|
237
|
-
*/
|
|
238
|
-
generateIdentifier() {
|
|
239
|
-
var _this = this;
|
|
240
|
-
let length = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : -1;
|
|
241
|
-
let count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
|
|
242
|
-
let overrideMode = arguments.length > 2 ? arguments[2] : undefined;
|
|
243
|
-
if (length == -1) {
|
|
244
|
-
length = (0, _random.getRandomInteger)(6, 8);
|
|
245
|
-
}
|
|
246
|
-
var set = new Set();
|
|
247
|
-
if (count == -1) {
|
|
248
|
-
this.obfuscator.varCount++;
|
|
249
|
-
count = this.obfuscator.varCount;
|
|
250
|
-
set = this.obfuscator.generated;
|
|
251
|
-
}
|
|
252
|
-
var identifier;
|
|
253
|
-
do {
|
|
254
|
-
identifier = (0, _probability.ComputeProbabilityMap)(overrideMode || this.options.identifierGenerator, function () {
|
|
255
|
-
let mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "randomized";
|
|
256
|
-
switch (mode) {
|
|
257
|
-
case "randomized":
|
|
258
|
-
var characters = "_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("");
|
|
259
|
-
var numbers = "0123456789".split("");
|
|
260
|
-
var combined = [...characters, ...numbers];
|
|
261
|
-
var result = "";
|
|
262
|
-
for (var i = 0; i < length; i++) {
|
|
263
|
-
result += (0, _random.choice)(i == 0 ? characters : combined);
|
|
264
|
-
}
|
|
265
|
-
return result;
|
|
266
|
-
case "hexadecimal":
|
|
267
|
-
const genRanHex = size => [...Array(size)].map(() => Math.floor(Math.random() * 16).toString(16)).join("");
|
|
268
|
-
return "_0x" + genRanHex(length).toUpperCase();
|
|
269
|
-
case "mangled":
|
|
270
|
-
while (1) {
|
|
271
|
-
var result = (0, _random.alphabeticalGenerator)(count);
|
|
272
|
-
count++;
|
|
273
|
-
if (_constants.reservedKeywords.has(result) || _constants.reservedIdentifiers.has(result)) {} else {
|
|
274
|
-
return result;
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
throw new Error("impossible but TypeScript insists");
|
|
278
|
-
case "number":
|
|
279
|
-
return "var_" + count;
|
|
280
|
-
case "zeroWidth":
|
|
281
|
-
return _this.zeroWidthGenerator.generate();
|
|
282
|
-
}
|
|
283
|
-
throw new Error("Invalid 'identifierGenerator' mode: " + mode);
|
|
284
|
-
});
|
|
285
|
-
} while (set.has(identifier));
|
|
286
|
-
if (!identifier) {
|
|
287
|
-
throw new Error("identifier null");
|
|
288
|
-
}
|
|
289
|
-
set.add(identifier);
|
|
290
|
-
return identifier;
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* Smartly appends a comment to a Node.
|
|
294
|
-
* - Includes the transformation's name.
|
|
295
|
-
* @param node
|
|
296
|
-
* @param text
|
|
297
|
-
* @param i
|
|
298
|
-
*/
|
|
299
|
-
addComment(node, text) {
|
|
300
|
-
if (this.options.debugComments) {
|
|
301
|
-
return (0, _gen.AddComment)(node, `[${this.className}] ${text}`);
|
|
302
|
-
}
|
|
303
|
-
return node;
|
|
304
|
-
}
|
|
305
|
-
replace(node1, node2) {
|
|
306
|
-
for (var key in node1) {
|
|
307
|
-
delete node1[key];
|
|
308
|
-
}
|
|
309
|
-
this.objectAssign(node1, node2);
|
|
310
|
-
}
|
|
311
|
-
replaceIdentifierOrLiteral(node1, node2, parents) {
|
|
312
|
-
// Fix 2. Make parent property key computed
|
|
313
|
-
if (parents[0] && (parents[0].type == "Property" || parents[0].type == "MethodDefinition") && parents[0].key == node1) {
|
|
314
|
-
parents[0].computed = true;
|
|
315
|
-
parents[0].shorthand = false;
|
|
316
|
-
}
|
|
317
|
-
this.replace(node1, node2);
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
/**
|
|
321
|
-
* Smartly merges two Nodes.
|
|
322
|
-
* - Null checking
|
|
323
|
-
* - Preserves comments
|
|
324
|
-
* @param node1
|
|
325
|
-
* @param node2
|
|
326
|
-
*/
|
|
327
|
-
objectAssign(node1, node2) {
|
|
328
|
-
(0, _assert.ok)(node1);
|
|
329
|
-
(0, _assert.ok)(node2);
|
|
330
|
-
var comments1 = node1.leadingComments || [];
|
|
331
|
-
var comments2 = node2.leadingComments || [];
|
|
332
|
-
var comments = [...comments1, ...comments2];
|
|
333
|
-
node2.leadingComments = comments;
|
|
334
|
-
node1._transform = node2._transform = this.className;
|
|
335
|
-
return Object.assign(node1, node2);
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
/**
|
|
339
|
-
* Verbose logging for this transformation.
|
|
340
|
-
* @param messages
|
|
341
|
-
*/
|
|
342
|
-
log() {
|
|
343
|
-
if (this.options.verbose) {
|
|
344
|
-
for (var _len = arguments.length, messages = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
345
|
-
messages[_key] = arguments[_key];
|
|
346
|
-
}
|
|
347
|
-
console.log("[" + this.className + "]", ...messages);
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
/**
|
|
352
|
-
* Verbose logging for warning/important messages.
|
|
353
|
-
* @param messages
|
|
354
|
-
*/
|
|
355
|
-
warn() {
|
|
356
|
-
if (this.options.verbose) {
|
|
357
|
-
for (var _len2 = arguments.length, messages = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
358
|
-
messages[_key2] = arguments[_key2];
|
|
359
|
-
}
|
|
360
|
-
console.log("[ WARN " + this.className + " ]", ...messages);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
/**
|
|
365
|
-
* Throws an error. Appends the transformation's name to the error's message.
|
|
366
|
-
* @param error
|
|
367
|
-
*/
|
|
368
|
-
error(error) {
|
|
369
|
-
throw new Error(`${this.className} Error: ${error.message}`);
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
exports.default = Transform;
|
package/dist/traverse.js
DELETED
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.assertNoCircular = assertNoCircular;
|
|
7
|
-
exports.default = traverse;
|
|
8
|
-
exports.getBlock = getBlock;
|
|
9
|
-
exports.isBlock = isBlock;
|
|
10
|
-
exports.walk = walk;
|
|
11
|
-
/**
|
|
12
|
-
* A block refers to any object that has a **`.body`** property where code is nested.
|
|
13
|
-
*
|
|
14
|
-
* Types: `BlockStatement`, `Program`
|
|
15
|
-
*
|
|
16
|
-
* @param object
|
|
17
|
-
* @param parents
|
|
18
|
-
*/
|
|
19
|
-
function getBlock(object, parents) {
|
|
20
|
-
if (!Array.isArray(parents)) {
|
|
21
|
-
throw new Error("parents must be an array");
|
|
22
|
-
}
|
|
23
|
-
return [object, ...parents].find(node => isBlock(node));
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Must have a **`.body`** property and be an array.
|
|
28
|
-
*
|
|
29
|
-
* - "BlockStatement"
|
|
30
|
-
* - "Program"
|
|
31
|
-
*
|
|
32
|
-
* @param object
|
|
33
|
-
*/
|
|
34
|
-
function isBlock(object) {
|
|
35
|
-
return object && (object.type == "BlockStatement" || object.type == "Program");
|
|
36
|
-
}
|
|
37
|
-
function walk(object, parents, onEnter) {
|
|
38
|
-
if (typeof object === "object" && object) {
|
|
39
|
-
var newParents = [object, ...parents];
|
|
40
|
-
|
|
41
|
-
// if (!Array.isArray(object)) {
|
|
42
|
-
// validateChain(object, parents);
|
|
43
|
-
// }
|
|
44
|
-
|
|
45
|
-
// 1. Call `onEnter` function and remember any onExit callback returned
|
|
46
|
-
var onExit = onEnter(object, parents);
|
|
47
|
-
|
|
48
|
-
// 2. Traverse children
|
|
49
|
-
if (Array.isArray(object)) {
|
|
50
|
-
var copy = [...object];
|
|
51
|
-
for (var element of copy) {
|
|
52
|
-
if (walk(element, newParents, onEnter) === "EXIT") {
|
|
53
|
-
return "EXIT";
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
} else {
|
|
57
|
-
var keys = Object.keys(object);
|
|
58
|
-
for (var key of keys) {
|
|
59
|
-
if (!key.startsWith("$")) {
|
|
60
|
-
if (walk(object[key], newParents, onEnter) === "EXIT") {
|
|
61
|
-
return "EXIT";
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
if (onExit === "EXIT") {
|
|
67
|
-
return "EXIT";
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// 3. Done with children, call `onExit` callback
|
|
71
|
-
if (onExit) {
|
|
72
|
-
onExit();
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* The bare-bones walker.
|
|
79
|
-
*
|
|
80
|
-
* - Recursively traverse an AST object.
|
|
81
|
-
* - Calls the `onEnter` function with:
|
|
82
|
-
* - - `object` - The current node
|
|
83
|
-
* - - `parents` - Array of ancestors `[closest, ..., root]`
|
|
84
|
-
* - The `onEnter` callback can return an `onExit` callback for that node.
|
|
85
|
-
*
|
|
86
|
-
* - *Note*: Does not validate the property names.
|
|
87
|
-
*
|
|
88
|
-
* @param tree
|
|
89
|
-
* @param onEnter
|
|
90
|
-
*/
|
|
91
|
-
function traverse(tree, onEnter) {
|
|
92
|
-
walk(tree, [], onEnter);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* This is debugging function used to test for circular references.
|
|
97
|
-
*/
|
|
98
|
-
function assertNoCircular(object) {
|
|
99
|
-
var seen = new Set();
|
|
100
|
-
traverse(object, (node, nodeParents) => {
|
|
101
|
-
if (node && typeof node === "object") {
|
|
102
|
-
if (seen.has(node)) {
|
|
103
|
-
console.log(nodeParents);
|
|
104
|
-
console.log(node);
|
|
105
|
-
throw new Error("FOUND CIRCULAR REFERENCE");
|
|
106
|
-
}
|
|
107
|
-
seen.add(node);
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
}
|
package/dist/util/compare.js
DELETED
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.isDirective = isDirective;
|
|
7
|
-
exports.isEquivalent = isEquivalent;
|
|
8
|
-
exports.isIndependent = isIndependent;
|
|
9
|
-
exports.isInsideType = isInsideType;
|
|
10
|
-
exports.isLoop = isLoop;
|
|
11
|
-
exports.isModuleSource = isModuleSource;
|
|
12
|
-
exports.isMoveable = isMoveable;
|
|
13
|
-
exports.isPrimitive = isPrimitive;
|
|
14
|
-
exports.isValidIdentifier = isValidIdentifier;
|
|
15
|
-
var _traverse = require("../traverse");
|
|
16
|
-
function isEquivalent(first, second) {
|
|
17
|
-
var extra = {
|
|
18
|
-
start: 1,
|
|
19
|
-
end: 1,
|
|
20
|
-
loc: 1
|
|
21
|
-
};
|
|
22
|
-
function removeExtra(obj) {
|
|
23
|
-
if (typeof obj === "object") {
|
|
24
|
-
for (var property in obj) {
|
|
25
|
-
if (obj && obj.hasOwnProperty(property)) {
|
|
26
|
-
if (typeof obj[property] == "object") {
|
|
27
|
-
removeExtra(obj[property]);
|
|
28
|
-
} else {
|
|
29
|
-
if (extra[property]) {
|
|
30
|
-
delete obj[property];
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return obj;
|
|
37
|
-
}
|
|
38
|
-
return JSON.stringify(removeExtra(first)) == JSON.stringify(removeExtra(second));
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Statements that allowed `break;` and `continue;` statements
|
|
42
|
-
* @param object
|
|
43
|
-
*/
|
|
44
|
-
function isLoop(object) {
|
|
45
|
-
return ["SwitchStatement", "WhileStatement", "DoWhileStatement", "ForStatement", "ForInStatement", "ForOfStatement"].includes(object.type);
|
|
46
|
-
}
|
|
47
|
-
function isValidIdentifier(name) {
|
|
48
|
-
if (typeof name !== "string") {
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
if (name.includes(".") || name.includes(" ")) {
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
54
|
-
var x = name.match(/^[A-Za-z$_][A-Za-z0-9$_]*/);
|
|
55
|
-
return !!(x && x[0] == name);
|
|
56
|
-
}
|
|
57
|
-
function isInsideType(type, object, parents) {
|
|
58
|
-
return [object, ...parents].some(x => x.type == type);
|
|
59
|
-
}
|
|
60
|
-
function isDirective(object, parents) {
|
|
61
|
-
var dIndex = parents.findIndex(x => x.directive);
|
|
62
|
-
if (dIndex == -1) {
|
|
63
|
-
return false;
|
|
64
|
-
}
|
|
65
|
-
return parents[dIndex].expression == (parents[dIndex - 1] || object);
|
|
66
|
-
}
|
|
67
|
-
function isModuleSource(object, parents) {
|
|
68
|
-
if (!parents[0]) {
|
|
69
|
-
return false;
|
|
70
|
-
}
|
|
71
|
-
if (parents[0].type == "ImportDeclaration" && parents[0].source == object) {
|
|
72
|
-
return true;
|
|
73
|
-
}
|
|
74
|
-
if (parents[0].type == "ImportExpression" && parents[0].source == object) {
|
|
75
|
-
return true;
|
|
76
|
-
}
|
|
77
|
-
if (parents[1] && parents[1].type == "CallExpression" && parents[1].arguments[0] === object && parents[1].callee.type == "Identifier") {
|
|
78
|
-
if (parents[1].callee.name == "require" || parents[1].callee.name == "import") {
|
|
79
|
-
return true;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
function isMoveable(object, parents) {
|
|
85
|
-
return !isDirective(object, parents) && !isModuleSource(object, parents);
|
|
86
|
-
}
|
|
87
|
-
function isIndependent(object, parents) {
|
|
88
|
-
if (object.type == "Literal") {
|
|
89
|
-
return true;
|
|
90
|
-
}
|
|
91
|
-
if (object.type == "Identifier") {
|
|
92
|
-
if (primitiveIdentifiers.has(object.name)) {
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
|
-
var parent = parents[0];
|
|
96
|
-
if (parent && parent.type == "Property") {
|
|
97
|
-
if (!parent.computed && parent.key == object) {
|
|
98
|
-
return true;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return false;
|
|
102
|
-
}
|
|
103
|
-
if (object.type == "ArrayExpression" || object.type == "ObjectExpression" || object.type == "Property") {
|
|
104
|
-
var allowIt = true;
|
|
105
|
-
(0, _traverse.walk)(object, parents, ($object, $parents) => {
|
|
106
|
-
if (object != $object) {
|
|
107
|
-
if (!Array.isArray($object) && !isIndependent($object, $parents)) {
|
|
108
|
-
allowIt = false;
|
|
109
|
-
return "EXIT";
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
return allowIt;
|
|
114
|
-
}
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
var primitiveIdentifiers = new Set(["undefined", "NaN"]);
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* booleans, numbers, string, null, undefined, NaN, infinity
|
|
121
|
-
*
|
|
122
|
-
* Types:
|
|
123
|
-
* - `Literal` with typeof `node.value` = `"number" | "string" | "boolean"`
|
|
124
|
-
* - `Identifier` with `name` = `"undefined" | "NaN"`
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
* @param node
|
|
128
|
-
* @returns
|
|
129
|
-
*/
|
|
130
|
-
function isPrimitive(node) {
|
|
131
|
-
if (node.type == "Literal") {
|
|
132
|
-
if (node.value === null) {
|
|
133
|
-
return true;
|
|
134
|
-
} else if (typeof node.value === "number") {
|
|
135
|
-
return true;
|
|
136
|
-
} else if (typeof node.value === "string") {
|
|
137
|
-
return true;
|
|
138
|
-
} else if (typeof node.value === "boolean") {
|
|
139
|
-
return true;
|
|
140
|
-
}
|
|
141
|
-
} else if (node.type == "Identifier") {
|
|
142
|
-
return primitiveIdentifiers.has(node.name);
|
|
143
|
-
}
|
|
144
|
-
return false;
|
|
145
|
-
}
|