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
|
@@ -3,79 +3,33 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports
|
|
7
|
-
var
|
|
6
|
+
exports["default"] = void 0;
|
|
7
|
+
var babelTypes = _interopRequireWildcard(require("@babel/types"));
|
|
8
|
+
var _parser = require("@babel/parser");
|
|
9
|
+
var _traverse = _interopRequireDefault(require("@babel/traverse"));
|
|
8
10
|
var _assert = require("assert");
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
function
|
|
11
|
+
var _randomUtils = require("../utils/random-utils");
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
13
|
+
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); }
|
|
14
|
+
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; }
|
|
15
|
+
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); }
|
|
16
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
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 _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; }
|
|
19
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
20
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
21
|
+
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
|
22
|
+
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
|
|
23
|
+
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
|
12
24
|
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; }
|
|
13
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" ==
|
|
14
|
-
function _toPrimitive(t, r) { if ("object" !=
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
*
|
|
22
|
-
* ```js
|
|
23
|
-
* var Base64Template = new Template(`
|
|
24
|
-
* function {name}(str){
|
|
25
|
-
* return btoa(str)
|
|
26
|
-
* }
|
|
27
|
-
* `);
|
|
28
|
-
*
|
|
29
|
-
* var functionDeclaration = Base64Template.single({ name: "atob" });
|
|
30
|
-
* ```
|
|
31
|
-
*
|
|
32
|
-
* 2. AST subtree insertion
|
|
33
|
-
*
|
|
34
|
-
* ```js
|
|
35
|
-
* var Base64Template = new Template(`
|
|
36
|
-
* function {name}(str){
|
|
37
|
-
* {getWindow}
|
|
38
|
-
*
|
|
39
|
-
* return {getWindowName}btoa(str)
|
|
40
|
-
* }`)
|
|
41
|
-
*
|
|
42
|
-
* var functionDeclaration = Base64Template.single({
|
|
43
|
-
* name: "atob",
|
|
44
|
-
* getWindowName: "newWindow",
|
|
45
|
-
* getWindow: () => {
|
|
46
|
-
* return acorn.parse("var newWindow = {}").body[0];
|
|
47
|
-
* }
|
|
48
|
-
* });
|
|
49
|
-
* ```
|
|
50
|
-
*
|
|
51
|
-
* Here, the `getWindow` variable is a function that returns an AST subtree. This must be a `Node[]` array or Template.
|
|
52
|
-
* Optionally, the function can be replaced with just the `Node[]` array or Template if it's already computed.
|
|
53
|
-
*
|
|
54
|
-
* 3. Template subtree insertion
|
|
55
|
-
*
|
|
56
|
-
* ```js
|
|
57
|
-
* var NewWindowTemplate = new Template(`
|
|
58
|
-
* var newWindow = {};
|
|
59
|
-
* `);
|
|
60
|
-
*
|
|
61
|
-
* var Base64Template = new Template(`
|
|
62
|
-
* function {name}(str){
|
|
63
|
-
* {NewWindowTemplate}
|
|
64
|
-
*
|
|
65
|
-
* return newWindow.btoa(str)
|
|
66
|
-
* }`)
|
|
67
|
-
*
|
|
68
|
-
* var functionDeclaration = Base64Template.single({
|
|
69
|
-
* name: "atob",
|
|
70
|
-
* NewWindowTemplate: NewWindowTemplate
|
|
71
|
-
* });
|
|
72
|
-
* ```
|
|
73
|
-
*/
|
|
74
|
-
class Template {
|
|
75
|
-
constructor() {
|
|
76
|
-
_defineProperty(this, "templates", void 0);
|
|
77
|
-
_defineProperty(this, "defaultVariables", void 0);
|
|
78
|
-
_defineProperty(this, "requiredVariables", void 0);
|
|
25
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
26
|
+
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); }
|
|
27
|
+
// Create a union type of the symbol keys in NodeSymbol
|
|
28
|
+
var Template = exports["default"] = /*#__PURE__*/function () {
|
|
29
|
+
function Template() {
|
|
30
|
+
_classCallCheck(this, Template);
|
|
31
|
+
_defineProperty(this, "astIdentifierPrefix", "__t_" + (0, _randomUtils.getRandomString)(6));
|
|
32
|
+
_defineProperty(this, "symbols", []);
|
|
79
33
|
for (var _len = arguments.length, templates = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
80
34
|
templates[_key] = arguments[_key];
|
|
81
35
|
}
|
|
@@ -84,128 +38,189 @@ class Template {
|
|
|
84
38
|
this.requiredVariables = new Set();
|
|
85
39
|
this.findRequiredVariables();
|
|
86
40
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if (matches !== null) {
|
|
94
|
-
matches.forEach(variable => {
|
|
95
|
-
var name = variable.slice(1, -1);
|
|
96
|
-
|
|
97
|
-
// $ variables are for default variables
|
|
98
|
-
if (name.startsWith("$")) {
|
|
99
|
-
throw new Error("Default variables are no longer supported.");
|
|
100
|
-
} else {
|
|
101
|
-
this.requiredVariables.add(name);
|
|
102
|
-
}
|
|
103
|
-
});
|
|
41
|
+
return _createClass(Template, [{
|
|
42
|
+
key: "addSymbols",
|
|
43
|
+
value: function addSymbols() {
|
|
44
|
+
var _this$symbols;
|
|
45
|
+
(_this$symbols = this.symbols).push.apply(_this$symbols, arguments);
|
|
46
|
+
return this;
|
|
104
47
|
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
// Validate all variables were passed in
|
|
122
|
-
for (var requiredVariable of this.requiredVariables) {
|
|
123
|
-
if (typeof allVariables[requiredVariable] === "undefined") {
|
|
124
|
-
throw new Error(this.templates[0] + " missing variable: " + requiredVariable + " from " + JSON.stringify(allVariables));
|
|
48
|
+
}, {
|
|
49
|
+
key: "setDefaultVariables",
|
|
50
|
+
value: function setDefaultVariables(defaultVariables) {
|
|
51
|
+
this.defaultVariables = defaultVariables;
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
}, {
|
|
55
|
+
key: "findRequiredVariables",
|
|
56
|
+
value: function findRequiredVariables() {
|
|
57
|
+
var _this = this;
|
|
58
|
+
var matches = this.templates[0].match(/{[$A-Za-z0-9_]+}/g);
|
|
59
|
+
if (matches !== null) {
|
|
60
|
+
matches.forEach(function (variable) {
|
|
61
|
+
var name = variable.slice(1, -1);
|
|
62
|
+
_this.requiredVariables.add(name);
|
|
63
|
+
});
|
|
125
64
|
}
|
|
126
65
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
var
|
|
131
|
-
var
|
|
132
|
-
|
|
133
|
-
|
|
66
|
+
}, {
|
|
67
|
+
key: "interpolateTemplate",
|
|
68
|
+
value: function interpolateTemplate(variables) {
|
|
69
|
+
var _this2 = this;
|
|
70
|
+
var allVariables = _objectSpread(_objectSpread({}, this.defaultVariables), variables);
|
|
71
|
+
var _iterator = _createForOfIteratorHelper(this.requiredVariables),
|
|
72
|
+
_step;
|
|
73
|
+
try {
|
|
74
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
75
|
+
var requiredVariable = _step.value;
|
|
76
|
+
if (typeof allVariables[requiredVariable] === "undefined") {
|
|
77
|
+
throw new Error("".concat(this.templates[0], " missing variable: ").concat(requiredVariable, " from ").concat(JSON.stringify(allVariables)));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
} catch (err) {
|
|
81
|
+
_iterator.e(err);
|
|
82
|
+
} finally {
|
|
83
|
+
_iterator.f();
|
|
134
84
|
}
|
|
135
|
-
var
|
|
136
|
-
output =
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
85
|
+
var template = this.templates[Math.floor(Math.random() * this.templates.length)];
|
|
86
|
+
var output = template;
|
|
87
|
+
this.astVariableMappings = new Map();
|
|
88
|
+
Object.keys(allVariables).forEach(function (name) {
|
|
89
|
+
var bracketName = "{".concat(name.replace("$", "\\$"), "}");
|
|
90
|
+
var value = allVariables[name];
|
|
91
|
+
if (_this2.isASTVariable(value)) {
|
|
92
|
+
var astIdentifierName = _this2.astIdentifierPrefix + name;
|
|
93
|
+
_this2.astVariableMappings.set(name, astIdentifierName);
|
|
94
|
+
value = astIdentifierName;
|
|
95
|
+
}
|
|
96
|
+
var reg = new RegExp(bracketName, "g");
|
|
97
|
+
output = output.replace(reg, value);
|
|
98
|
+
});
|
|
99
|
+
return {
|
|
100
|
+
output: output,
|
|
101
|
+
template: template
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}, {
|
|
105
|
+
key: "isASTVariable",
|
|
106
|
+
value: function isASTVariable(variable) {
|
|
107
|
+
return typeof variable !== "string" && typeof variable !== "number";
|
|
108
|
+
}
|
|
109
|
+
}, {
|
|
110
|
+
key: "interpolateAST",
|
|
111
|
+
value: function interpolateAST(ast, variables) {
|
|
112
|
+
if (this.astVariableMappings.size === 0) return;
|
|
113
|
+
var allVariables = _objectSpread(_objectSpread({}, this.defaultVariables), variables);
|
|
114
|
+
var template = this;
|
|
143
115
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
116
|
+
// Reverse the lookup map
|
|
117
|
+
// Before {name -> __t_m4H6nk_name}
|
|
118
|
+
// After {__t_m4H6nk_name -> name}
|
|
119
|
+
var reverseMappings = new Map();
|
|
120
|
+
this.astVariableMappings.forEach(function (value, key) {
|
|
121
|
+
reverseMappings.set(value, key);
|
|
122
|
+
});
|
|
123
|
+
var insertedVariables = new Set();
|
|
124
|
+
(0, _traverse["default"])(ast, {
|
|
125
|
+
Identifier: function Identifier(path) {
|
|
126
|
+
var idName = path.node.name;
|
|
127
|
+
if (!idName.startsWith(template.astIdentifierPrefix)) return;
|
|
128
|
+
var variableName = reverseMappings.get(idName);
|
|
129
|
+
(0, _assert.ok)(variableName, "Variable ".concat(idName, " not found in mappings"));
|
|
130
|
+
var value = allVariables[variableName];
|
|
131
|
+
var isSingleUse = true; // Hard-coded nodes are deemed 'single use'
|
|
132
|
+
if (typeof value === "function") {
|
|
133
|
+
value = value();
|
|
134
|
+
isSingleUse = false;
|
|
135
|
+
}
|
|
136
|
+
if (value instanceof Template) {
|
|
137
|
+
value = value.compile(allVariables);
|
|
138
|
+
isSingleUse = false;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Duplicate node check
|
|
142
|
+
if (isSingleUse) {
|
|
143
|
+
if (insertedVariables.has(variableName)) {
|
|
144
|
+
(0, _assert.ok)(false, "Duplicate node inserted for variable: " + variableName);
|
|
145
|
+
}
|
|
146
|
+
insertedVariables.add(variableName);
|
|
168
147
|
}
|
|
169
|
-
if (!Array.isArray(insertNodes)) {
|
|
170
|
-
// Replace with expression
|
|
171
148
|
|
|
172
|
-
|
|
149
|
+
// Insert new nodes
|
|
150
|
+
if (!Array.isArray(value)) {
|
|
151
|
+
path.replaceWith(value);
|
|
173
152
|
} else {
|
|
174
|
-
|
|
175
|
-
var expressionStatement = p[0];
|
|
176
|
-
var body = p[1];
|
|
177
|
-
(0, _assert.ok)(expressionStatement.type === "ExpressionStatement");
|
|
178
|
-
(0, _assert.ok)(Array.isArray(body));
|
|
179
|
-
var index = body.indexOf(expressionStatement);
|
|
180
|
-
body.splice(index, 1, ...insertNodes);
|
|
153
|
+
path.replaceWithMultiple(value);
|
|
181
154
|
}
|
|
182
|
-
|
|
155
|
+
path.skip();
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}, {
|
|
160
|
+
key: "file",
|
|
161
|
+
value: function file() {
|
|
162
|
+
var _this3 = this;
|
|
163
|
+
var variables = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
164
|
+
var _this$interpolateTemp = this.interpolateTemplate(variables),
|
|
165
|
+
output = _this$interpolateTemp.output;
|
|
166
|
+
var file;
|
|
167
|
+
try {
|
|
168
|
+
file = (0, _parser.parse)(output, {
|
|
169
|
+
sourceType: "module",
|
|
170
|
+
allowReturnOutsideFunction: true
|
|
171
|
+
});
|
|
172
|
+
} catch (e) {
|
|
173
|
+
throw new Error(output + "\n" + "Template failed to parse: " + e.message);
|
|
183
174
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
175
|
+
this.interpolateAST(file, variables);
|
|
176
|
+
if (this.symbols.length > 0) {
|
|
177
|
+
file.program.body.forEach(function (node) {
|
|
178
|
+
var _iterator2 = _createForOfIteratorHelper(_this3.symbols),
|
|
179
|
+
_step2;
|
|
180
|
+
try {
|
|
181
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
182
|
+
var symbol = _step2.value;
|
|
183
|
+
node[symbol] = true;
|
|
184
|
+
}
|
|
185
|
+
} catch (err) {
|
|
186
|
+
_iterator2.e(err);
|
|
187
|
+
} finally {
|
|
188
|
+
_iterator2.f();
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
return file;
|
|
197
193
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
if (nodes.length !== 1) {
|
|
205
|
-
nodes = nodes.filter(node => node.type !== "EmptyStatement");
|
|
206
|
-
(0, _assert.ok)(nodes.length === 1, `Expected single node, got ${nodes.map(node => node.type).join(", ")}`);
|
|
194
|
+
}, {
|
|
195
|
+
key: "compile",
|
|
196
|
+
value: function compile() {
|
|
197
|
+
var variables = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
198
|
+
var file = this.file(variables);
|
|
199
|
+
return file.program.body;
|
|
207
200
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
201
|
+
}, {
|
|
202
|
+
key: "single",
|
|
203
|
+
value: function single() {
|
|
204
|
+
var variables = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
205
|
+
var nodes = this.compile(variables);
|
|
206
|
+
if (nodes.length !== 1) {
|
|
207
|
+
var filteredNodes = nodes.filter(function (node) {
|
|
208
|
+
return node.type !== "EmptyStatement";
|
|
209
|
+
});
|
|
210
|
+
(0, _assert.ok)(filteredNodes.length === 1, "Expected single node, got ".concat(filteredNodes.map(function (node) {
|
|
211
|
+
return node.type;
|
|
212
|
+
}).join(", ")));
|
|
213
|
+
return filteredNodes[0];
|
|
214
|
+
}
|
|
215
|
+
return nodes[0];
|
|
216
|
+
}
|
|
217
|
+
}, {
|
|
218
|
+
key: "expression",
|
|
219
|
+
value: function expression() {
|
|
220
|
+
var variables = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
221
|
+
var statement = this.single(variables);
|
|
222
|
+
babelTypes.assertExpressionStatement(statement);
|
|
223
|
+
return statement.expression;
|
|
224
|
+
}
|
|
225
|
+
}]);
|
|
226
|
+
}();
|
|
@@ -0,0 +1,100 @@
|
|
|
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["default"] = void 0;
|
|
8
|
+
var t = _interopRequireWildcard(require("@babel/types"));
|
|
9
|
+
var _assert = require("assert");
|
|
10
|
+
var _order = require("../order");
|
|
11
|
+
var _constants = require("../constants");
|
|
12
|
+
var _template = _interopRequireDefault(require("../templates/template"));
|
|
13
|
+
var _astUtils = require("../utils/ast-utils");
|
|
14
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
15
|
+
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); }
|
|
16
|
+
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; }
|
|
17
|
+
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
|
18
|
+
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."); }
|
|
19
|
+
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
20
|
+
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
21
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
22
|
+
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; } }
|
|
23
|
+
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; }
|
|
24
|
+
var _default = exports["default"] = function _default(_ref) {
|
|
25
|
+
var Plugin = _ref.Plugin;
|
|
26
|
+
var me = Plugin(_order.Order.AstScrambler, {
|
|
27
|
+
changeData: {
|
|
28
|
+
expressions: 0
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
var callExprName;
|
|
32
|
+
return {
|
|
33
|
+
visitor: {
|
|
34
|
+
"Block|SwitchCase": {
|
|
35
|
+
exit: function exit(_path) {
|
|
36
|
+
var path = _path;
|
|
37
|
+
var isProgram = path.isProgram();
|
|
38
|
+
var containerKey;
|
|
39
|
+
if (path.isSwitchCase()) {
|
|
40
|
+
containerKey = "consequent";
|
|
41
|
+
} else if (path.isBlock()) {
|
|
42
|
+
containerKey = "body";
|
|
43
|
+
}
|
|
44
|
+
var container = path.node[containerKey];
|
|
45
|
+
var newContainer = [];
|
|
46
|
+
(0, _assert.ok)(Array.isArray(container));
|
|
47
|
+
var expressions = [];
|
|
48
|
+
var flushExpressions = function flushExpressions() {
|
|
49
|
+
if (!expressions.length) return;
|
|
50
|
+
|
|
51
|
+
// Not enough expressions to require a call expression
|
|
52
|
+
if (expressions.length === 1) {
|
|
53
|
+
newContainer.push(t.expressionStatement(expressions[0]));
|
|
54
|
+
expressions = [];
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (!callExprName) {
|
|
58
|
+
callExprName = me.getPlaceholder() + "_ast";
|
|
59
|
+
}
|
|
60
|
+
me.changeData.expressions += expressions.length;
|
|
61
|
+
newContainer.push(t.expressionStatement(t.callExpression(t.identifier(callExprName), expressions)));
|
|
62
|
+
expressions = [];
|
|
63
|
+
};
|
|
64
|
+
var _iterator = _createForOfIteratorHelper(container),
|
|
65
|
+
_step;
|
|
66
|
+
try {
|
|
67
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
68
|
+
var statement = _step.value;
|
|
69
|
+
if (
|
|
70
|
+
// Preserve last expression at the top level
|
|
71
|
+
(isProgram ? statement !== container.at(-1) : true) && t.isExpressionStatement(statement) && !statement[_constants.SKIP]) {
|
|
72
|
+
if (t.isSequenceExpression(statement.expression)) {
|
|
73
|
+
var _expressions;
|
|
74
|
+
(_expressions = expressions).push.apply(_expressions, _toConsumableArray(statement.expression.expressions));
|
|
75
|
+
} else {
|
|
76
|
+
expressions.push(statement.expression);
|
|
77
|
+
}
|
|
78
|
+
} else {
|
|
79
|
+
flushExpressions();
|
|
80
|
+
newContainer.push(statement);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
} catch (err) {
|
|
84
|
+
_iterator.e(err);
|
|
85
|
+
} finally {
|
|
86
|
+
_iterator.f();
|
|
87
|
+
}
|
|
88
|
+
flushExpressions();
|
|
89
|
+
path.node[containerKey] = newContainer;
|
|
90
|
+
if (path.isProgram()) {
|
|
91
|
+
if (callExprName) {
|
|
92
|
+
var functionDeclaration = new _template["default"]("\n function ".concat(callExprName, "(){\n ").concat(callExprName, " = function(){};\n }\n ")).single();
|
|
93
|
+
(0, _astUtils.append)(path, functionDeclaration);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
};
|