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
|
@@ -1,243 +1,208 @@
|
|
|
1
1
|
"use strict";
|
|
2
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); }
|
|
3
4
|
Object.defineProperty(exports, "__esModule", {
|
|
4
5
|
value: true
|
|
5
6
|
});
|
|
6
|
-
exports
|
|
7
|
-
var
|
|
8
|
-
var _order = require("../../order");
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
9
9
|
var _template = _interopRequireDefault(require("../../templates/template"));
|
|
10
|
-
var
|
|
11
|
-
var _compare = require("../../util/compare");
|
|
12
|
-
var _gen = require("../../util/gen");
|
|
13
|
-
var _insert = require("../../util/insert");
|
|
14
|
-
var _random = require("../../util/random");
|
|
15
|
-
var _transform = _interopRequireDefault(require("../transform"));
|
|
16
|
-
var _encoding = require("./encoding");
|
|
10
|
+
var _order = require("../../order");
|
|
17
11
|
var _probability = require("../../probability");
|
|
18
|
-
var
|
|
19
|
-
var
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
apply(tree) {
|
|
42
|
-
super.apply(tree);
|
|
43
|
-
|
|
44
|
-
// Pad array with useless strings
|
|
45
|
-
var dead = (0, _random.getRandomInteger)(5, 15);
|
|
46
|
-
for (var i = 0; i < dead; i++) {
|
|
47
|
-
var str = (0, _random.getRandomString)((0, _random.getRandomInteger)(5, 40));
|
|
48
|
-
var fn = this.transform((0, _gen.Literal)(str), [tree]);
|
|
49
|
-
if (fn) {
|
|
50
|
-
fn();
|
|
51
|
-
}
|
|
12
|
+
var _assert = require("assert");
|
|
13
|
+
var _bufferToStringTemplate = require("../../templates/bufferToStringTemplate");
|
|
14
|
+
var _getGlobalTemplate = require("../../templates/getGlobalTemplate");
|
|
15
|
+
var _astUtils = require("../../utils/ast-utils");
|
|
16
|
+
var _randomUtils = require("../../utils/random-utils");
|
|
17
|
+
var _encoding = require("./encoding");
|
|
18
|
+
var _node = require("../../utils/node");
|
|
19
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
20
|
+
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); }
|
|
21
|
+
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; }
|
|
22
|
+
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
|
23
|
+
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."); }
|
|
24
|
+
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; } }
|
|
25
|
+
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
26
|
+
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
27
|
+
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; }
|
|
28
|
+
var STRING_CONCEALING = Symbol("StringConcealing");
|
|
29
|
+
var _default = exports["default"] = function _default(_ref) {
|
|
30
|
+
var Plugin = _ref.Plugin;
|
|
31
|
+
var me = Plugin(_order.Order.StringConcealing, {
|
|
32
|
+
changeData: {
|
|
33
|
+
strings: 0
|
|
52
34
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
getGlobalFnName: this.getPlaceholder() + _constants.predictableFunctionTag
|
|
60
|
-
}));
|
|
61
|
-
for (var functionObject of this.functionObjects) {
|
|
62
|
-
var {
|
|
63
|
-
block,
|
|
64
|
-
fnName: getterFnName,
|
|
65
|
-
encodingImplementation
|
|
66
|
-
} = functionObject;
|
|
67
|
-
var decodeFn = this.getPlaceholder() + _constants.predictableFunctionTag + _constants.criticalFunctionTag;
|
|
68
|
-
(0, _insert.append)(block, encodingImplementation.template.single({
|
|
69
|
-
__fnName__: decodeFn,
|
|
70
|
-
__bufferToString__: bufferToStringName
|
|
71
|
-
}));
|
|
72
|
-
// All these are fake and never ran
|
|
73
|
-
var ifStatements = (0, _template.default)(`if ( z == x ) {
|
|
74
|
-
return y[${cacheName}[z]] = ${getterFnName}(x, y);
|
|
75
|
-
}
|
|
76
|
-
if ( y ) {
|
|
77
|
-
[b, y] = [a(b), x || z]
|
|
78
|
-
return ${getterFnName}(x, b, z)
|
|
79
|
-
}
|
|
80
|
-
if ( z && a !== ${decodeFn} ) {
|
|
81
|
-
${getterFnName} = ${decodeFn}
|
|
82
|
-
return ${getterFnName}(x, -1, z, a, b)
|
|
83
|
-
}
|
|
84
|
-
if ( a === ${getterFnName} ) {
|
|
85
|
-
${decodeFn} = y
|
|
86
|
-
return ${decodeFn}(z)
|
|
87
|
-
}
|
|
88
|
-
if( a === undefined ) {
|
|
89
|
-
${getterFnName} = b
|
|
90
|
-
}
|
|
91
|
-
if( z == a ) {
|
|
92
|
-
return y ? x[b[y]] : ${cacheName}[x] || (z=(b[x] || a), ${cacheName}[x] = z(${this.arrayName}[x]))
|
|
93
|
-
}
|
|
94
|
-
`).compile();
|
|
35
|
+
});
|
|
36
|
+
var blocks = [];
|
|
37
|
+
var stringMap = new Map();
|
|
38
|
+
var stringArrayName = me.getPlaceholder() + "_array";
|
|
39
|
+
var encodingImplementations = Object.create(null);
|
|
40
|
+
var availableStringEncodings = me.options.customStringEncodings;
|
|
95
41
|
|
|
96
|
-
|
|
97
|
-
|
|
42
|
+
// If no custom encodings are provided, use the default encoding
|
|
43
|
+
if (!availableStringEncodings || availableStringEncodings.length === 0) {
|
|
44
|
+
availableStringEncodings = [_encoding.createDefaultStringEncoding];
|
|
45
|
+
}
|
|
46
|
+
function hasAllEncodings() {
|
|
47
|
+
return availableStringEncodings.length === 0;
|
|
48
|
+
}
|
|
49
|
+
function createStringEncoding() {
|
|
50
|
+
var encodingIndex = (0, _randomUtils.getRandomInteger)(0, availableStringEncodings.length);
|
|
51
|
+
var encoding = availableStringEncodings[encodingIndex];
|
|
52
|
+
if (typeof encoding === "function") {
|
|
53
|
+
encoding = encoding(encodingImplementations);
|
|
54
|
+
var duplicateIdentity = typeof encoding.identity !== "undefined" && typeof encodingImplementations[encoding.identity] !== "undefined";
|
|
55
|
+
if (duplicateIdentity || encoding === null) {
|
|
56
|
+
// Null returned -> All encodings have been created
|
|
57
|
+
// Duplicate identity -> Most likely all encodings have been created
|
|
98
58
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
var ${getterFnName} = (x, y, z, a, b)=>{
|
|
108
|
-
if(typeof a === "undefined") {
|
|
109
|
-
a = ${decodeFn}
|
|
110
|
-
}
|
|
111
|
-
if(typeof b === "undefined") {
|
|
112
|
-
b = ${cacheName}
|
|
113
|
-
}
|
|
59
|
+
// No longer create new encodings using this function
|
|
60
|
+
availableStringEncodings = availableStringEncodings.filter(function (x) {
|
|
61
|
+
return x !== encoding;
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// Return a random encoding already made
|
|
65
|
+
encoding = (0, _randomUtils.choice)(Object.values(encodingImplementations));
|
|
66
|
+
(0, _assert.ok)(encoding, "Failed to create main string encoding");
|
|
114
67
|
}
|
|
115
|
-
`).single();
|
|
116
|
-
varDeclaration.declarations[0].init.body.body.push(...ifStatements);
|
|
117
|
-
(0, _insert.prepend)(block, varDeclaration);
|
|
118
68
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
69
|
+
if (typeof encoding.identity === "undefined") {
|
|
70
|
+
encoding.identity = encodingIndex.toString();
|
|
71
|
+
}
|
|
72
|
+
if (typeof encoding.code === "string") {
|
|
73
|
+
encoding.code = new _template["default"](encoding.code);
|
|
74
|
+
}
|
|
75
|
+
encodingImplementations[encoding.identity] = encoding;
|
|
76
|
+
return encoding;
|
|
124
77
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
78
|
+
return {
|
|
79
|
+
visitor: {
|
|
80
|
+
Program: {
|
|
81
|
+
exit: function exit(programPath) {
|
|
82
|
+
var mainEncodingImplementation;
|
|
131
83
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
// Find created functions
|
|
139
|
-
var functionObjects = parents.filter(node => node.$stringConcealingFunctionObject).map(item => item.$stringConcealingFunctionObject);
|
|
140
|
-
|
|
141
|
-
// Choose random functionObject to use
|
|
142
|
-
var functionObject = (0, _random.choice)(functionObjects);
|
|
143
|
-
if (!functionObject || !(0, _encoding.hasAllEncodings)() && (0, _random.chance)(25 / this.functionObjects.length) && !currentBlock.$stringConcealingFunctionObject) {
|
|
144
|
-
// No functions, create one
|
|
145
|
-
|
|
146
|
-
var newFunctionObject = {
|
|
147
|
-
block: currentBlock,
|
|
148
|
-
encodingImplementation: (0, _encoding.createEncodingImplementation)(),
|
|
149
|
-
fnName: this.getPlaceholder() + _constants.predictableFunctionTag
|
|
150
|
-
};
|
|
151
|
-
this.functionObjects.push(newFunctionObject);
|
|
152
|
-
currentBlock.$stringConcealingFunctionObject = newFunctionObject;
|
|
153
|
-
functionObject = newFunctionObject;
|
|
154
|
-
}
|
|
155
|
-
var {
|
|
156
|
-
fnName,
|
|
157
|
-
encodingImplementation
|
|
158
|
-
} = functionObject;
|
|
159
|
-
var index = -1;
|
|
160
|
-
|
|
161
|
-
// String already decoded?
|
|
162
|
-
if (this.set.has(object.value)) {
|
|
163
|
-
var row = this.index[object.value];
|
|
164
|
-
if (parents.includes(row[2])) {
|
|
165
|
-
[index, fnName] = row;
|
|
166
|
-
(0, _assert.ok)(typeof index === "number");
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
if (index == -1) {
|
|
170
|
-
// The decode function must return correct result
|
|
171
|
-
var encoded = encodingImplementation.encode(object.value);
|
|
172
|
-
if (encodingImplementation.decode(encoded) !== object.value) {
|
|
173
|
-
this.ignore.add(object.value);
|
|
174
|
-
this.warn(encodingImplementation.identity, object.value.slice(0, 100));
|
|
175
|
-
delete _encoding.EncodingImplementations[encodingImplementation.identity];
|
|
176
|
-
return;
|
|
177
|
-
}
|
|
178
|
-
this.arrayExpression.elements.push((0, _gen.Literal)(encoded));
|
|
179
|
-
index = this.arrayExpression.elements.length - 1;
|
|
180
|
-
this.index[object.value] = [index, fnName, currentBlock];
|
|
181
|
-
this.set.add(object.value);
|
|
182
|
-
}
|
|
183
|
-
(0, _assert.ok)(index != -1, "index == -1");
|
|
184
|
-
var callExpr = (0, _gen.CallExpression)((0, _gen.Identifier)(fnName), [(0, _gen.Literal)(index)]);
|
|
84
|
+
// Create a main encoder function for the Program
|
|
85
|
+
programPath.node[STRING_CONCEALING] = {
|
|
86
|
+
encodingImplementation: mainEncodingImplementation = createStringEncoding(),
|
|
87
|
+
fnName: me.getPlaceholder() + "_MAIN_STR"
|
|
88
|
+
};
|
|
89
|
+
blocks.push(programPath);
|
|
185
90
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
91
|
+
// Use that encoder function for these fake strings
|
|
92
|
+
var fakeStringCount = (0, _randomUtils.getRandomInteger)(75, 125);
|
|
93
|
+
for (var i = 0; i < fakeStringCount; i++) {
|
|
94
|
+
var fakeString = (0, _randomUtils.getRandomString)((0, _randomUtils.getRandomInteger)(5, 50));
|
|
95
|
+
stringMap.set(mainEncodingImplementation.encode(fakeString), stringMap.size);
|
|
96
|
+
}
|
|
97
|
+
programPath.traverse({
|
|
98
|
+
StringLiteral: {
|
|
99
|
+
exit: function exit(path) {
|
|
100
|
+
var _block;
|
|
101
|
+
var originalValue = path.node.value;
|
|
190
102
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
103
|
+
// Ignore require() calls / Import statements
|
|
104
|
+
if ((0, _astUtils.isModuleImport)(path)) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Minimum length of 3 characters
|
|
109
|
+
if (originalValue.length < 3) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Check user setting
|
|
114
|
+
if (!(0, _probability.computeProbabilityMap)(me.options.stringConcealing, originalValue)) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
var block = path.findParent(function (p) {
|
|
118
|
+
var _p$node;
|
|
119
|
+
return p.isBlock() && !!((_p$node = p.node) !== null && _p$node !== void 0 && _p$node[STRING_CONCEALING]);
|
|
120
|
+
});
|
|
121
|
+
var stringConcealingInterface = (_block = block) === null || _block === void 0 || (_block = _block.node) === null || _block === void 0 ? void 0 : _block[STRING_CONCEALING];
|
|
122
|
+
if (!block || !hasAllEncodings() && (0, _randomUtils.chance)(75 - blocks.length)) {
|
|
123
|
+
// Create a new encoder function
|
|
124
|
+
// Select random block parent (or Program)
|
|
125
|
+
block = path.findParent(function (p) {
|
|
126
|
+
return p.isBlock();
|
|
127
|
+
});
|
|
128
|
+
var stringConcealingNode = block.node;
|
|
129
|
+
|
|
130
|
+
// Ensure not to overwrite the previous encoders
|
|
131
|
+
if (!stringConcealingNode[STRING_CONCEALING]) {
|
|
132
|
+
// Create a new encoding function for this block
|
|
133
|
+
var encodingImplementation = createStringEncoding();
|
|
134
|
+
var fnName = me.getPlaceholder() + "_STR_" + blocks.length;
|
|
135
|
+
stringConcealingInterface = {
|
|
136
|
+
encodingImplementation: encodingImplementation,
|
|
137
|
+
fnName: fnName
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
// Save this info in the AST for future strings
|
|
141
|
+
stringConcealingNode[STRING_CONCEALING] = stringConcealingInterface;
|
|
142
|
+
blocks.push(block);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
(0, _assert.ok)(stringConcealingInterface);
|
|
146
|
+
var encodedValue = stringConcealingInterface.encodingImplementation.encode(originalValue);
|
|
147
|
+
|
|
148
|
+
// If a decoder function is provided, use it to validate each encoded string
|
|
149
|
+
if (typeof stringConcealingInterface.encodingImplementation.decode === "function") {
|
|
150
|
+
var decodedValue = stringConcealingInterface.encodingImplementation.decode(encodedValue);
|
|
151
|
+
if (decodedValue !== originalValue) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
var index = stringMap.get(encodedValue);
|
|
156
|
+
if (typeof index === "undefined") {
|
|
157
|
+
index = stringMap.size;
|
|
158
|
+
stringMap.set(encodedValue, index);
|
|
159
|
+
}
|
|
160
|
+
me.changeData.strings++;
|
|
161
|
+
|
|
162
|
+
// Ensure the string is computed so we can replace it with complex call expression
|
|
163
|
+
(0, _astUtils.ensureComputedExpression)(path);
|
|
164
|
+
|
|
165
|
+
// Replace the string literal with a call to the decoder function
|
|
166
|
+
path.replaceWith(t.callExpression(t.identifier(stringConcealingInterface.fnName), [(0, _node.numericLiteral)(index)]));
|
|
167
|
+
|
|
168
|
+
// Skip the transformation for the newly created node
|
|
169
|
+
path.skip();
|
|
170
|
+
}
|
|
230
171
|
}
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
172
|
+
});
|
|
173
|
+
var bufferToStringName = me.getPlaceholder() + "_bufferToString";
|
|
174
|
+
var getGlobalFnName = me.getPlaceholder() + "_getGlobal";
|
|
175
|
+
var bufferToStringCode = _bufferToStringTemplate.BufferToStringTemplate.compile({
|
|
176
|
+
GetGlobalTemplate: (0, _getGlobalTemplate.createGetGlobalTemplate)(me, programPath),
|
|
177
|
+
getGlobalFnName: getGlobalFnName,
|
|
178
|
+
BufferToString: bufferToStringName
|
|
179
|
+
});
|
|
180
|
+
(0, _astUtils.prependProgram)(programPath, bufferToStringCode);
|
|
181
|
+
|
|
182
|
+
// Create the string array
|
|
183
|
+
(0, _astUtils.prependProgram)(programPath, t.variableDeclaration("var", [t.variableDeclarator(t.identifier(stringArrayName), t.arrayExpression(Array.from(stringMap.keys()).map(function (x) {
|
|
184
|
+
return t.stringLiteral(x);
|
|
185
|
+
})))]));
|
|
186
|
+
for (var _i = 0, _blocks = blocks; _i < _blocks.length; _i++) {
|
|
187
|
+
var block = _blocks[_i];
|
|
188
|
+
var _ref2 = block.node[STRING_CONCEALING],
|
|
189
|
+
encodingImplementation = _ref2.encodingImplementation,
|
|
190
|
+
fnName = _ref2.fnName;
|
|
191
|
+
var decodeFnName = fnName + "_decode";
|
|
192
|
+
(0, _assert.ok)(encodingImplementation.code instanceof _template["default"]);
|
|
193
|
+
|
|
194
|
+
// The decoder function
|
|
195
|
+
var decoder = encodingImplementation.code.compile({
|
|
196
|
+
fnName: decodeFnName,
|
|
197
|
+
__bufferToStringFunction__: bufferToStringName
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
// The main function to get the string value
|
|
201
|
+
var retrieveFunctionDeclaration = new _template["default"]("\n function ".concat(fnName, "(index) {\n return ").concat(decodeFnName, "(").concat(stringArrayName, "[index]);\n }\n ")).single();
|
|
202
|
+
(0, _astUtils.prepend)(block, [].concat(_toConsumableArray(decoder), [retrieveFunctionDeclaration]));
|
|
203
|
+
}
|
|
237
204
|
}
|
|
238
205
|
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}
|
|
243
|
-
exports.default = StringConcealing;
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
};
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
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); }
|
|
3
4
|
Object.defineProperty(exports, "__esModule", {
|
|
4
5
|
value: true
|
|
5
6
|
});
|
|
6
|
-
exports
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var _compare = require("../../util/compare");
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
9
|
+
var _randomUtils = require("../../utils/random-utils");
|
|
10
10
|
var _probability = require("../../probability");
|
|
11
|
-
var
|
|
12
|
-
function
|
|
11
|
+
var _constants = require("../../constants");
|
|
12
|
+
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); }
|
|
13
|
+
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
14
|
function pad(x, len) {
|
|
14
15
|
while (x.length < len) {
|
|
15
16
|
x = "0" + x;
|
|
@@ -24,54 +25,45 @@ function even(x) {
|
|
|
24
25
|
}
|
|
25
26
|
function toHexRepresentation(str) {
|
|
26
27
|
var escapedString = "";
|
|
27
|
-
str.split("").forEach(
|
|
28
|
-
var code =
|
|
28
|
+
str.split("").forEach(function (_char) {
|
|
29
|
+
var code = _char.charCodeAt(0);
|
|
29
30
|
if (code < 128) {
|
|
30
31
|
escapedString += "\\x" + even(pad(code.toString(16), 2));
|
|
31
32
|
} else {
|
|
32
|
-
escapedString +=
|
|
33
|
+
escapedString += _char;
|
|
33
34
|
}
|
|
34
35
|
});
|
|
35
36
|
return escapedString;
|
|
36
37
|
}
|
|
37
38
|
function toUnicodeRepresentation(str) {
|
|
38
39
|
var escapedString = "";
|
|
39
|
-
str.split("").forEach(
|
|
40
|
-
var code =
|
|
40
|
+
str.split("").forEach(function (_char2) {
|
|
41
|
+
var code = _char2.charCodeAt(0);
|
|
41
42
|
if (code < 128) {
|
|
42
43
|
escapedString += "\\u" + even(pad(code.toString(16), 4));
|
|
43
44
|
} else {
|
|
44
|
-
escapedString +=
|
|
45
|
+
escapedString += _char2;
|
|
45
46
|
}
|
|
46
47
|
});
|
|
47
48
|
return escapedString;
|
|
48
49
|
}
|
|
50
|
+
var _default = exports["default"] = function _default(me) {
|
|
51
|
+
return {
|
|
52
|
+
visitor: {
|
|
53
|
+
StringLiteral: {
|
|
54
|
+
exit: function exit(path) {
|
|
55
|
+
var value = path.node.value;
|
|
49
56
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
transform(object, parents) {
|
|
65
|
-
// Allow percentages
|
|
66
|
-
if (!(0, _probability.ComputeProbabilityMap)(this.options.stringEncoding, x => x, object.value)) return;
|
|
67
|
-
var type = (0, _random.choice)(["hexadecimal", "unicode"]);
|
|
68
|
-
var escapedString = (type == "hexadecimal" ? toHexRepresentation : toUnicodeRepresentation)(object.value);
|
|
69
|
-
return () => {
|
|
70
|
-
if (object.type !== "Literal") return;
|
|
71
|
-
|
|
72
|
-
// ESCodeGen tries to escape backslashes, here is a work-around
|
|
73
|
-
this.replace(object, (0, _gen.Identifier)(`'${escapedString}'`));
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
exports.default = StringEncoding;
|
|
57
|
+
// Allow percentages
|
|
58
|
+
if (!(0, _probability.computeProbabilityMap)(me.options.stringEncoding, value)) return;
|
|
59
|
+
var type = (0, _randomUtils.choice)(["hexadecimal", "unicode"]);
|
|
60
|
+
var escapedString = (type == "hexadecimal" ? toHexRepresentation : toUnicodeRepresentation)(value);
|
|
61
|
+
var id = t.identifier("\"".concat(escapedString, "\""));
|
|
62
|
+
id[_constants.GEN_NODE] = true;
|
|
63
|
+
path.replaceWith(id);
|
|
64
|
+
path.skip();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
};
|