js-confuser 1.7.2 → 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/.github/workflows/node.js.yml +1 -1
- package/CHANGELOG.md +105 -0
- package/Migration.md +57 -0
- package/README.md +23 -913
- package/dist/constants.js +69 -13
- package/dist/index.js +108 -152
- package/dist/obfuscator.js +316 -118
- package/dist/options.js +1 -109
- 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 +213 -93
- 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 -577
- package/dist/transforms/dispatcher.js +300 -309
- 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 +217 -103
- package/dist/transforms/identifier/movedDeclarations.js +167 -91
- package/dist/transforms/identifier/renameVariables.js +240 -187
- package/dist/transforms/lock/integrity.js +61 -184
- package/dist/transforms/lock/lock.js +263 -303
- 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 +263 -163
- package/dist/transforms/renameLabels.js +132 -56
- package/dist/transforms/rgf.js +142 -240
- package/dist/transforms/shuffle.js +52 -145
- package/dist/transforms/string/encoding.js +45 -173
- package/dist/transforms/string/stringCompression.js +81 -126
- package/dist/transforms/string/stringConcealing.js +189 -224
- 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 -77
- package/src/index.ts +70 -163
- package/src/obfuscationResult.ts +43 -0
- package/src/obfuscator.ts +328 -135
- package/src/options.ts +154 -623
- package/src/order.ts +14 -14
- package/src/presets.ts +39 -34
- package/src/probability.ts +21 -36
- package/src/templates/{bufferToString.ts → bufferToStringTemplate.ts} +5 -54
- 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 +183 -92
- package/src/transforms/astScrambler.ts +99 -0
- package/src/transforms/calculator.ts +96 -224
- package/src/transforms/controlFlowFlattening.ts +1594 -0
- package/src/transforms/deadCode.ts +85 -628
- package/src/transforms/dispatcher.ts +431 -636
- package/src/transforms/extraction/duplicateLiteralsRemoval.ts +147 -299
- 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 +261 -189
- package/src/transforms/identifier/movedDeclarations.ts +228 -142
- package/src/transforms/identifier/renameVariables.ts +252 -258
- package/src/transforms/lock/integrity.ts +84 -260
- package/src/transforms/lock/lock.ts +342 -491
- 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 -215
- package/src/transforms/renameLabels.ts +176 -77
- package/src/transforms/rgf.ts +293 -386
- package/src/transforms/shuffle.ts +80 -254
- package/src/transforms/string/encoding.ts +26 -129
- package/src/transforms/string/stringCompression.ts +118 -236
- package/src/transforms/string/stringConcealing.ts +255 -339
- 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 -108
- package/dist/templates/crash.js +0 -59
- 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 -1281
- 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 -70
- package/dist/transforms/identifier/variableAnalysis.js +0 -104
- package/dist/transforms/lock/antiDebug.js +0 -76
- package/dist/transforms/stack.js +0 -343
- package/dist/transforms/transform.js +0 -350
- 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 -9
- 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 -130
- package/dist/util/scope.js +0 -20
- package/docs/ControlFlowFlattening.md +0 -595
- package/docs/Countermeasures.md +0 -63
- package/docs/ES5.md +0 -197
- package/docs/Integrity.md +0 -75
- package/docs/RGF.md +0 -419
- 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/crash.ts +0 -55
- 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 -2146
- package/src/transforms/controlFlowFlattening/expressionObfuscation.ts +0 -179
- package/src/transforms/es5/antiClass.ts +0 -272
- 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 -85
- package/src/transforms/identifier/variableAnalysis.ts +0 -118
- package/src/transforms/lock/antiDebug.ts +0 -112
- package/src/transforms/stack.ts +0 -551
- package/src/transforms/transform.ts +0 -453
- package/src/traverse.ts +0 -120
- package/src/types.ts +0 -131
- package/src/util/compare.ts +0 -181
- package/src/util/gen.ts +0 -651
- package/src/util/guard.ts +0 -7
- 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 -141
- package/src/util/scope.ts +0 -21
- package/test/code/Cash.src.js +0 -1011
- package/test/code/Cash.test.ts +0 -49
- 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 -132
- package/test/presets.test.ts +0 -22
- package/test/probability.test.ts +0 -44
- package/test/templates/template.test.ts +0 -14
- 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 -72
- package/test/transforms/identifier/movedDeclarations.test.ts +0 -275
- package/test/transforms/identifier/renameVariables.test.ts +0 -621
- 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/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
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createLiteral = void 0;
|
|
7
|
+
exports.deepClone = deepClone;
|
|
8
|
+
exports.numericLiteral = numericLiteral;
|
|
9
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
10
|
+
var _assert = require("assert");
|
|
11
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
12
|
+
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; }
|
|
13
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
14
|
+
var createLiteral = exports.createLiteral = function createLiteral(value) {
|
|
15
|
+
if (value === null) return t.nullLiteral();
|
|
16
|
+
if (value === undefined) return t.identifier("undefined");
|
|
17
|
+
switch (_typeof(value)) {
|
|
18
|
+
case "string":
|
|
19
|
+
return t.stringLiteral(value);
|
|
20
|
+
case "number":
|
|
21
|
+
return numericLiteral(value);
|
|
22
|
+
case "boolean":
|
|
23
|
+
return t.booleanLiteral(value);
|
|
24
|
+
}
|
|
25
|
+
(0, _assert.ok)(false);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Handles both positive and negative numeric literals
|
|
30
|
+
* @param value
|
|
31
|
+
* @returns
|
|
32
|
+
*/
|
|
33
|
+
function numericLiteral(value) {
|
|
34
|
+
(0, _assert.ok)(typeof value === "number");
|
|
35
|
+
if (value < 0) {
|
|
36
|
+
return t.unaryExpression("-", t.numericLiteral(-value));
|
|
37
|
+
}
|
|
38
|
+
return t.numericLiteral(value);
|
|
39
|
+
}
|
|
40
|
+
function deepClone(node) {
|
|
41
|
+
function deepClone(obj) {
|
|
42
|
+
// Handle non-objects like null, undefined, primitive values, or functions
|
|
43
|
+
if (obj === null || _typeof(obj) !== "object") {
|
|
44
|
+
return obj;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Handle Date
|
|
48
|
+
if (obj instanceof Date) {
|
|
49
|
+
return new Date(obj);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Handle Array
|
|
53
|
+
if (Array.isArray(obj)) {
|
|
54
|
+
return obj.map(deepClone);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Handle Objects
|
|
58
|
+
var clonedObj = {};
|
|
59
|
+
|
|
60
|
+
// Handle string and symbol property keys
|
|
61
|
+
|
|
62
|
+
Object.getOwnPropertyNames(obj).forEach(function (key) {
|
|
63
|
+
var value = obj[key];
|
|
64
|
+
clonedObj[key] = deepClone(value);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Copy simple symbols (Avoid objects = infinite recursion)
|
|
68
|
+
Object.getOwnPropertySymbols(obj).forEach(function (symbol) {
|
|
69
|
+
var value = obj[symbol];
|
|
70
|
+
if (_typeof(value) !== "object") {
|
|
71
|
+
clonedObj[symbol] = deepClone(value);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
return clonedObj;
|
|
75
|
+
}
|
|
76
|
+
return deepClone(node);
|
|
77
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createObject = createObject;
|
|
7
|
+
/**
|
|
8
|
+
* Creates an object from the given keys and values arrays.
|
|
9
|
+
* @param keys
|
|
10
|
+
* @param values
|
|
11
|
+
*/
|
|
12
|
+
function createObject(keys, values) {
|
|
13
|
+
if (keys.length !== values.length) {
|
|
14
|
+
throw new Error("length mismatch");
|
|
15
|
+
}
|
|
16
|
+
var newObject = {};
|
|
17
|
+
keys.forEach(function (x, i) {
|
|
18
|
+
newObject[x] = values[i];
|
|
19
|
+
});
|
|
20
|
+
return newObject;
|
|
21
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.chance = chance;
|
|
7
|
+
exports.choice = choice;
|
|
8
|
+
exports.getRandom = getRandom;
|
|
9
|
+
exports.getRandomHexString = getRandomHexString;
|
|
10
|
+
exports.getRandomInteger = getRandomInteger;
|
|
11
|
+
exports.getRandomString = getRandomString;
|
|
12
|
+
exports.shuffle = shuffle;
|
|
13
|
+
exports.splitIntoChunks = splitIntoChunks;
|
|
14
|
+
var _assert = require("assert");
|
|
15
|
+
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
|
16
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
17
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
18
|
+
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
19
|
+
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
20
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
21
|
+
/**
|
|
22
|
+
* Returns a random element from the given array
|
|
23
|
+
* @param choices Array of items
|
|
24
|
+
* @returns One of the items in the array at random
|
|
25
|
+
*/
|
|
26
|
+
function choice(choices) {
|
|
27
|
+
var index = Math.floor(Math.random() * choices.length);
|
|
28
|
+
return choices[index];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Returns a true/false based on the percent chance (0%-100%)
|
|
33
|
+
* @param percentChance AS A PERCENTAGE 0 - 100%
|
|
34
|
+
*/
|
|
35
|
+
function chance(percentChance) {
|
|
36
|
+
return Math.random() < percentChance / 100;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* **Mutates the given array**
|
|
41
|
+
* @param array
|
|
42
|
+
*/
|
|
43
|
+
function shuffle(array) {
|
|
44
|
+
array.sort(function () {
|
|
45
|
+
return Math.random() - 0.5;
|
|
46
|
+
});
|
|
47
|
+
return array;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Returns a random hexadecimal string.
|
|
52
|
+
*
|
|
53
|
+
* @example getRandomHexString(6) => "CA96BF"
|
|
54
|
+
* @param length
|
|
55
|
+
* @returns
|
|
56
|
+
*/
|
|
57
|
+
function getRandomHexString(length) {
|
|
58
|
+
return _toConsumableArray(Array(length)).map(function () {
|
|
59
|
+
return Math.floor(Math.random() * 16).toString(16);
|
|
60
|
+
}).join("").toUpperCase();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Returns a random string.
|
|
65
|
+
*/
|
|
66
|
+
function getRandomString(length) {
|
|
67
|
+
var result = "";
|
|
68
|
+
var characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
69
|
+
var charactersLength = characters.length;
|
|
70
|
+
for (var i = 0; i < length; i++) {
|
|
71
|
+
result += characters.charAt(Math.floor(Math.random() * charactersLength));
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
function getRandom(min, max) {
|
|
76
|
+
return Math.random() * (max - min) + min;
|
|
77
|
+
}
|
|
78
|
+
function getRandomInteger(min, max) {
|
|
79
|
+
return Math.floor(getRandom(min, max));
|
|
80
|
+
}
|
|
81
|
+
function splitIntoChunks(str, size) {
|
|
82
|
+
(0, _assert.ok)(typeof str === "string", "str must be typeof string");
|
|
83
|
+
(0, _assert.ok)(typeof size === "number", "size must be typeof number");
|
|
84
|
+
(0, _assert.ok)(Math.floor(size) === size, "size must be integer");
|
|
85
|
+
var numChunks = Math.ceil(str.length / size);
|
|
86
|
+
var chunks = new Array(numChunks);
|
|
87
|
+
for (var i = 0, o = 0; i < numChunks; ++i, o += size) {
|
|
88
|
+
chunks[i] = str.substr(o, size);
|
|
89
|
+
}
|
|
90
|
+
return chunks;
|
|
91
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.isStaticValue = isStaticValue;
|
|
8
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
9
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
10
|
+
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; }
|
|
11
|
+
// Function to check if a node is a static value
|
|
12
|
+
function isStaticValue(node) {
|
|
13
|
+
// Check for literals which are considered static
|
|
14
|
+
if (t.isStringLiteral(node) || t.isNumericLiteral(node) || t.isBooleanLiteral(node) || t.isNullLiteral(node)) {
|
|
15
|
+
if (t.isDirectiveLiteral(node)) return false;
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Handle unary expressions like -42
|
|
20
|
+
if (t.isUnaryExpression(node)) {
|
|
21
|
+
// Only consider certain operators as static (e.g., -, +)
|
|
22
|
+
if (["-", "+", "!", "~", "void"].includes(node.operator)) {
|
|
23
|
+
return isStaticValue(node.argument);
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Handle binary expressions with static values only
|
|
29
|
+
if (t.isBinaryExpression(node)) {
|
|
30
|
+
return isStaticValue(node.left) && isStaticValue(node.right);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Handle logical expressions (&&, ||) with static values only
|
|
34
|
+
if (t.isLogicalExpression(node)) {
|
|
35
|
+
return isStaticValue(node.left) && isStaticValue(node.right);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Handle conditional (ternary) expressions with static values
|
|
39
|
+
if (t.isConditionalExpression(node)) {
|
|
40
|
+
return isStaticValue(node.test) && isStaticValue(node.consequent) && isStaticValue(node.alternate);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Handle array expressions where all elements are static
|
|
44
|
+
if (t.isArrayExpression(node)) {
|
|
45
|
+
return node.elements.every(function (element) {
|
|
46
|
+
return element !== null && isStaticValue(element);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Handle object expressions where all properties are static
|
|
51
|
+
if (t.isObjectExpression(node)) {
|
|
52
|
+
return node.properties.every(function (prop) {
|
|
53
|
+
if (t.isObjectProperty(prop)) {
|
|
54
|
+
return isStaticValue(prop.key) && isStaticValue(prop.value);
|
|
55
|
+
} else if (t.isSpreadElement(prop)) {
|
|
56
|
+
return isStaticValue(prop.argument);
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Add more cases as needed, depending on what you consider "static"
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.applyDefaultsToOptions = applyDefaultsToOptions;
|
|
7
|
+
exports.validateOptions = validateOptions;
|
|
8
|
+
var _assert = require("assert");
|
|
9
|
+
var _presets = _interopRequireDefault(require("./presets"));
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
11
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
12
|
+
var validProperties = new Set(["preset", "target", "indent", "compact", "hexadecimalNumbers", "minify", "es5", "renameVariables", "renameGlobals", "renameLabels", "identifierGenerator", "controlFlowFlattening", "globalConcealing", "stringCompression", "stringConcealing", "stringEncoding", "stringSplitting", "duplicateLiteralsRemoval", "dispatcher", "rgf", "objectExtraction", "flatten", "deadCode", "calculator", "lock", "movedDeclarations", "opaquePredicates", "shuffle", "variableMasking", "verbose", "globalVariables", "debugComments", "preserveFunctionLength", "astScrambler", "customStringEncodings", "functionOutlining", "pack"]);
|
|
13
|
+
var validLockProperties = new Set(["selfDefending", "antiDebug", "tamperProtection", "startDate", "endDate", "domainLock", "integrity", "countermeasures", "customLocks"]);
|
|
14
|
+
function validateOptions(options) {
|
|
15
|
+
if (!options || Object.keys(options).length <= 1) {
|
|
16
|
+
/**
|
|
17
|
+
* Give a welcoming introduction to those who skipped the documentation.
|
|
18
|
+
*/
|
|
19
|
+
var line = "You provided zero obfuscation options. By default everything is disabled.\nYou can use a preset with:\n\n> {target: '".concat(options.target || "node", "', preset: 'high' | 'medium' | 'low'}.\n\n\nView all settings here:\nhttps://github.com/MichaelXF/js-confuser#options");
|
|
20
|
+
throw new Error("\n\n" + line.split("\n").map(function (x) {
|
|
21
|
+
return "\t".concat(x);
|
|
22
|
+
}).join("\n") + "\n\n");
|
|
23
|
+
}
|
|
24
|
+
(0, _assert.ok)(options, "options cannot be null");
|
|
25
|
+
(0, _assert.ok)(options.target, "Missing options.target option (required, must one the following: 'browser' or 'node')");
|
|
26
|
+
(0, _assert.ok)(["browser", "node"].includes(options.target), "'".concat(options.target, "' is not a valid target mode"));
|
|
27
|
+
Object.keys(options).forEach(function (key) {
|
|
28
|
+
if (!validProperties.has(key)) {
|
|
29
|
+
throw new TypeError("Invalid option: '" + key + "'");
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
if (options.lock) {
|
|
33
|
+
(0, _assert.ok)(_typeof(options.lock) === "object", "options.lock must be an object");
|
|
34
|
+
Object.keys(options.lock).forEach(function (key) {
|
|
35
|
+
if (!validLockProperties.has(key)) {
|
|
36
|
+
throw new TypeError("Invalid lock option: '" + key + "'");
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Validate domain-lock option
|
|
41
|
+
if (options.lock.domainLock && typeof options.lock.domainLock !== "undefined") {
|
|
42
|
+
(0, _assert.ok)(Array.isArray(options.lock.domainLock), "domainLock must be an array");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Validate start-date option
|
|
46
|
+
if (typeof options.lock.startDate !== "undefined" && options.lock.startDate) {
|
|
47
|
+
(0, _assert.ok)(typeof options.lock.startDate === "number" || options.lock.startDate instanceof Date, "startDate must be Date object or number");
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Validate end-date option
|
|
51
|
+
if (typeof options.lock.endDate !== "undefined" && options.lock.endDate) {
|
|
52
|
+
(0, _assert.ok)(typeof options.lock.endDate === "number" || options.lock.endDate instanceof Date, "endDate must be Date object or number");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (options.preset) {
|
|
56
|
+
if (!_presets["default"][options.preset]) {
|
|
57
|
+
throw new TypeError("Unknown preset of '" + options.preset + "'");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Sets the default values and validates the configuration.
|
|
64
|
+
*/
|
|
65
|
+
function applyDefaultsToOptions(options) {
|
|
66
|
+
if (options.preset) {
|
|
67
|
+
// Clone and allow overriding
|
|
68
|
+
options = Object.assign({}, _presets["default"][options.preset], options);
|
|
69
|
+
}
|
|
70
|
+
if (!options.hasOwnProperty("compact")) {
|
|
71
|
+
options.compact = true; // Compact is on by default
|
|
72
|
+
}
|
|
73
|
+
if (!options.hasOwnProperty("renameGlobals")) {
|
|
74
|
+
options.renameGlobals = true; // RenameGlobals is on by default
|
|
75
|
+
}
|
|
76
|
+
if (!options.hasOwnProperty("preserveFunctionLength")) {
|
|
77
|
+
options.preserveFunctionLength = true; // preserveFunctionLength is on by default
|
|
78
|
+
}
|
|
79
|
+
if (!options.hasOwnProperty("renameLabels")) {
|
|
80
|
+
options.renameLabels = true; // RenameLabels is on by default
|
|
81
|
+
}
|
|
82
|
+
if (options.globalVariables && !(options.globalVariables instanceof Set)) {
|
|
83
|
+
options.globalVariables = new Set(Object.keys(options.globalVariables));
|
|
84
|
+
}
|
|
85
|
+
if (options.lock) {
|
|
86
|
+
(0, _assert.ok)(_typeof(options.lock) === "object", "options.lock must be an object");
|
|
87
|
+
if (options.lock.selfDefending) {
|
|
88
|
+
options.compact = true; // self defending forcibly enables this
|
|
89
|
+
}
|
|
90
|
+
if (!options.lock.customLocks) {
|
|
91
|
+
options.lock.customLocks = [];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Convert 'startDate' and 'endDate' to Dates
|
|
95
|
+
if (typeof options.lock.startDate === "number") {
|
|
96
|
+
options.lock.startDate = new Date(options.lock.startDate);
|
|
97
|
+
}
|
|
98
|
+
if (typeof options.lock.endDate === "number") {
|
|
99
|
+
options.lock.endDate = new Date(options.lock.endDate);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// options.globalVariables outlines generic globals that should be present in the execution context
|
|
104
|
+
if (!options.hasOwnProperty("globalVariables")) {
|
|
105
|
+
options.globalVariables = new Set([]);
|
|
106
|
+
if (options.target == "browser") {
|
|
107
|
+
// browser
|
|
108
|
+
["window", "document", "postMessage", "alert", "confirm", "location", "btoa", "atob", "unescape", "encodeURIComponent"].forEach(function (x) {
|
|
109
|
+
return options.globalVariables.add(x);
|
|
110
|
+
});
|
|
111
|
+
} else {
|
|
112
|
+
// node
|
|
113
|
+
["global", "Buffer", "require", "process", "exports", "module", "__dirname", "__filename"].forEach(function (x) {
|
|
114
|
+
return options.globalVariables.add(x);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
["globalThis", "console", "parseInt", "parseFloat", "Math", "JSON", "RegExp", "Promise", "String", "Boolean", "Function", "Object", "Array", "Proxy", "Error", "TypeError", "ReferenceError", "RangeError", "EvalError", "setTimeout", "clearTimeout", "setInterval", "clearInterval", "setImmediate", "clearImmediate", "queueMicrotask", "isNaN", "isFinite", "Set", "Map", "WeakSet", "WeakMap", "Symbol"].forEach(function (x) {
|
|
118
|
+
return options.globalVariables.add(x);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return options;
|
|
122
|
+
}
|
package/index.d.ts
CHANGED
|
@@ -1,19 +1,3 @@
|
|
|
1
|
-
import
|
|
2
|
-
import ObfuscatorClass from "./src/obfuscator";
|
|
3
|
-
import {
|
|
4
|
-
IJsConfuser as JsConfuser,
|
|
5
|
-
IJsConfuserDebugObfuscation,
|
|
6
|
-
IJsConfuserDebugTransformations,
|
|
7
|
-
IJsConfuserObfuscate,
|
|
8
|
-
IJsConfuserObfuscateAST,
|
|
9
|
-
IJsConfuserPresets,
|
|
10
|
-
} from "./src/types";
|
|
1
|
+
import JsConfuser from "./src";
|
|
11
2
|
|
|
12
3
|
export default JsConfuser;
|
|
13
|
-
export const obfuscate: IJsConfuserObfuscate;
|
|
14
|
-
export const obfuscateAST: IJsConfuserObfuscateAST;
|
|
15
|
-
export const presets: IJsConfuserPresets;
|
|
16
|
-
export const debugTransformations: IJsConfuserDebugTransformations;
|
|
17
|
-
export const debugObfuscation: IJsConfuserDebugObfuscation;
|
|
18
|
-
export const Obfuscator: typeof ObfuscatorClass;
|
|
19
|
-
export const Transform: typeof TransformClass;
|
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "js-confuser",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-alpha.0",
|
|
4
4
|
"description": "JavaScript Obfuscation Tool.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
|
-
"
|
|
9
|
-
"
|
|
8
|
+
"build": "tsc && babel src --out-dir dist --extensions \".ts,.tsx\"",
|
|
9
|
+
"dev": "node babel.register.js",
|
|
10
10
|
"test": "jest --forceExit",
|
|
11
|
-
"test:coverage": "jest --coverage",
|
|
12
|
-
"prepublishOnly": "npm run build
|
|
11
|
+
"test:coverage": "jest --coverage --coverageReporters=html",
|
|
12
|
+
"prepublishOnly": "npm run build"
|
|
13
13
|
},
|
|
14
14
|
"keywords": [
|
|
15
15
|
"obfuscator",
|
|
@@ -22,21 +22,28 @@
|
|
|
22
22
|
"author": "MichaelXF",
|
|
23
23
|
"license": "MIT",
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"
|
|
26
|
-
"
|
|
25
|
+
"@babel/generator": "^7.25.6",
|
|
26
|
+
"@babel/parser": "^7.25.6",
|
|
27
|
+
"@babel/traverse": "^7.25.6",
|
|
28
|
+
"@babel/types": "^7.25.6",
|
|
29
|
+
"pako": "^2.1.0"
|
|
27
30
|
},
|
|
28
31
|
"devDependencies": {
|
|
29
|
-
"@babel/cli": "^7.
|
|
30
|
-
"@babel/
|
|
31
|
-
"@babel/plugin-proposal-
|
|
32
|
-
"@babel/plugin-proposal-
|
|
33
|
-
"@babel/preset-env": "^7.
|
|
34
|
-
"@babel/preset-typescript": "^7.
|
|
35
|
-
"@babel/register": "^7.
|
|
36
|
-
"@
|
|
37
|
-
"@types/
|
|
38
|
-
"
|
|
39
|
-
"
|
|
32
|
+
"@babel/cli": "^7.24.8",
|
|
33
|
+
"@babel/plugin-proposal-class-properties": "^7.18.6",
|
|
34
|
+
"@babel/plugin-proposal-decorators": "^7.24.7",
|
|
35
|
+
"@babel/plugin-proposal-private-methods": "^7.18.6",
|
|
36
|
+
"@babel/preset-env": "^7.25.3",
|
|
37
|
+
"@babel/preset-typescript": "^7.24.7",
|
|
38
|
+
"@babel/register": "^7.24.6",
|
|
39
|
+
"@eslint/js": "^9.9.0",
|
|
40
|
+
"@types/babel__core": "^7.20.5",
|
|
41
|
+
"@types/jest": "^29.5.12",
|
|
42
|
+
"@types/node": "^22.2.0",
|
|
43
|
+
"globals": "^15.9.0",
|
|
44
|
+
"jest": "^29.7.0",
|
|
45
|
+
"typescript": "^5.5.4",
|
|
46
|
+
"typescript-eslint": "^8.1.0"
|
|
40
47
|
},
|
|
41
48
|
"repository": {
|
|
42
49
|
"type": "git",
|
|
@@ -46,9 +53,7 @@
|
|
|
46
53
|
"url": "https://github.com/MichaelXF/js-confuser/issues"
|
|
47
54
|
},
|
|
48
55
|
"homepage": "https://js-confuser.com",
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"html"
|
|
52
|
-
]
|
|
56
|
+
"engines": {
|
|
57
|
+
"node": ">=12.0.0"
|
|
53
58
|
}
|
|
54
59
|
}
|