From d1842982084690cf37e503de6c8c765d70cd4d51 Mon Sep 17 00:00:00 2001 From: sanex3339 Date: Fri, 4 Nov 2016 14:26:24 +0300 Subject: [PATCH] custom nodes structure rework --- dist/index.js | 1179 +++++++++-------- src/NodeAppender.ts | 177 +++ src/NodeUtils.ts | 88 -- src/Obfuscator.ts | 62 +- src/custom-nodes/AbstractCustomNode.ts | 7 +- src/custom-nodes/CustomNodeAppender.ts | 82 -- .../ConsoleOutputDisableExpressionNode.ts | 49 +- .../DebugProtectionFunctionCallNode.ts | 3 +- .../DebugProtectionFunctionIntervalNode.ts | 3 +- .../DebugProtectionFunctionNode.ts | 3 +- .../domain-lock-nodes/DomainLockNode.ts | 51 +- .../NodeCallsControllerFunctionNode.ts | 83 ++ .../SelfDefendingUnicodeNode.ts | 48 +- .../UnicodeArrayCallsWrapper.ts | 3 +- .../unicode-array-nodes/UnicodeArrayNode.ts | 3 +- .../UnicodeArrayRotateFunctionNode.ts | 3 +- src/interfaces/custom-nodes/ICustomNode.d.ts | 5 +- src/node-groups/AbstractNodesGroup.ts | 15 +- src/node-groups/ConsoleOutputNodesGroup.ts | 27 +- src/node-groups/DebugProtectionNodesGroup.ts | 6 +- src/node-groups/DomainLockNodesGroup.ts | 27 +- src/node-groups/SelfDefendingNodesGroup.ts | 27 +- src/node-groups/UnicodeArrayNodesGroup.ts | 6 +- .../SingleNodeCallControllerTemplate.ts | 24 + .../DomainLockNodeTemplate.ts | 111 +- test/dev/dev.ts | 3 +- ...ConsoleOutputDisableExpressionNode.spec.ts | 4 +- .../domain-lock-nodes/DomainLockNode.spec.ts | 4 +- .../UnicodeArrayCallsWrapper.spec.ts | 2 +- .../UnicodeArrayNode.spec.ts | 4 +- .../UnicodeArrayRotateFunctionNode.spec.ts | 4 +- .../DomainLockNodeTemplate.spec.ts | 37 +- test/index.spec.ts | 2 +- test/unit-tests/NodeUtils.spec.ts | 132 -- ...eAppender.spec.ts => NodeAppender.spec.ts} | 150 ++- 35 files changed, 1437 insertions(+), 997 deletions(-) create mode 100644 src/NodeAppender.ts delete mode 100644 src/custom-nodes/CustomNodeAppender.ts create mode 100644 src/custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode.ts create mode 100644 src/templates/custom-nodes/SingleNodeCallControllerTemplate.ts rename test/unit-tests/custom-nodes/{CustomNodeAppender.spec.ts => NodeAppender.spec.ts} (65%) diff --git a/dist/index.js b/dist/index.js index ce0a8472..80d98597 100644 --- a/dist/index.js +++ b/dist/index.js @@ -88,7 +88,7 @@ module.exports = /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 85); +/******/ return __webpack_require__(__webpack_require__.s = 87); /******/ }) /************************************************************************/ /******/ ([ @@ -102,8 +102,8 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var chance_1 = __webpack_require__(79); -var JSFuck_1 = __webpack_require__(20); +var chance_1 = __webpack_require__(81); +var JSFuck_1 = __webpack_require__(21); var Utils = function () { function Utils() { @@ -292,14 +292,12 @@ exports.Utils = Utils; var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); -function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var escodegen = __webpack_require__(11); -var esprima = __webpack_require__(23); -var estraverse = __webpack_require__(3); -var NodeType_1 = __webpack_require__(5); +var escodegen = __webpack_require__(12); +var esprima = __webpack_require__(24); +var estraverse = __webpack_require__(4); +var NodeType_1 = __webpack_require__(7); var Nodes_1 = __webpack_require__(2); var Utils_1 = __webpack_require__(0); @@ -320,15 +318,6 @@ var NodeUtils = function () { } }); } - }, { - key: 'appendNode', - value: function appendNode(blockScopeNode, nodeBodyStatements) { - if (!NodeUtils.validateBodyStatements(nodeBodyStatements)) { - nodeBodyStatements = []; - } - nodeBodyStatements = NodeUtils.parentizeBodyStatementsBeforeAppend(blockScopeNode, nodeBodyStatements); - blockScopeNode.body = [].concat(_toConsumableArray(blockScopeNode.body), _toConsumableArray(nodeBodyStatements)); - } }, { key: 'convertCodeToStructure', value: function convertCodeToStructure(code) { @@ -375,15 +364,6 @@ var NodeUtils = function () { } return NodeUtils.getBlockScopeOfNode(parentNode); } - }, { - key: 'insertNodeAtIndex', - value: function insertNodeAtIndex(blockScopeNode, nodeBodyStatements, index) { - if (!NodeUtils.validateBodyStatements(nodeBodyStatements)) { - nodeBodyStatements = []; - } - nodeBodyStatements = NodeUtils.parentizeBodyStatementsBeforeAppend(blockScopeNode, nodeBodyStatements); - blockScopeNode.body = [].concat(_toConsumableArray(blockScopeNode.body.slice(0, index)), _toConsumableArray(nodeBodyStatements), _toConsumableArray(blockScopeNode.body.slice(index))); - } }, { key: 'parentize', value: function parentize(node) { @@ -407,15 +387,6 @@ var NodeUtils = function () { } }); } - }, { - key: 'prependNode', - value: function prependNode(blockScopeNode, nodeBodyStatements) { - if (!NodeUtils.validateBodyStatements(nodeBodyStatements)) { - nodeBodyStatements = []; - } - nodeBodyStatements = NodeUtils.parentizeBodyStatementsBeforeAppend(blockScopeNode, nodeBodyStatements); - blockScopeNode.body = [].concat(_toConsumableArray(nodeBodyStatements), _toConsumableArray(blockScopeNode.body)); - } }, { key: 'typedReplace', value: function typedReplace(node, nodeType, visitor) { @@ -439,43 +410,6 @@ var NodeUtils = function () { } }); } - }, { - key: 'parentizeBodyStatementsBeforeAppend', - value: function parentizeBodyStatementsBeforeAppend(blockScopeNode, nodeBodyStatements) { - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = nodeBodyStatements[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var statement = _step.value; - - statement.parentNode = blockScopeNode; - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - return nodeBodyStatements; - } - }, { - key: 'validateBodyStatements', - value: function validateBodyStatements(nodeBodyStatements) { - return nodeBodyStatements.every(function (statementNode) { - return !!statementNode && statementNode.hasOwnProperty('type'); - }); - } }]); return NodeUtils; @@ -495,7 +429,7 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var NodeType_1 = __webpack_require__(5); +var NodeType_1 = __webpack_require__(7); var Nodes = function () { function Nodes() { @@ -606,12 +540,139 @@ exports.Nodes = Nodes; /***/ }, /* 3 */ +/***/ function(module, exports, __webpack_require__) { + +"use strict"; +"use strict"; + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Utils_1 = __webpack_require__(0); + +var NodeAppender = function () { + function NodeAppender() { + _classCallCheck(this, NodeAppender); + } + + _createClass(NodeAppender, null, [{ + key: 'appendNode', + value: function appendNode(blockScopeNode, nodeBodyStatements) { + if (!NodeAppender.validateBodyStatements(nodeBodyStatements)) { + nodeBodyStatements = []; + } + nodeBodyStatements = NodeAppender.parentizeBodyStatementsBeforeAppend(blockScopeNode, nodeBodyStatements); + blockScopeNode.body = [].concat(_toConsumableArray(blockScopeNode.body), _toConsumableArray(nodeBodyStatements)); + } + }, { + key: 'appendNodeToOptimalBlockScope', + value: function appendNodeToOptimalBlockScope(blockScopeStackTraceData, blockScopeNode, nodeBodyStatements) { + var index = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; + + var targetBlockScope = void 0; + if (!blockScopeStackTraceData.length) { + targetBlockScope = blockScopeNode; + } else { + targetBlockScope = NodeAppender.getOptimalBlockScope(blockScopeStackTraceData, index); + } + NodeAppender.prependNode(targetBlockScope, nodeBodyStatements); + } + }, { + key: 'getOptimalBlockScope', + value: function getOptimalBlockScope(blockScopeTraceData, index) { + var deep = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Infinity; + + var firstCall = blockScopeTraceData[index]; + if (deep <= 0) { + throw new Error('Invalid `deep` argument value. Value should be bigger then 0.'); + } + if (deep > 1 && firstCall.stackTrace.length) { + return NodeAppender.getOptimalBlockScope(firstCall.stackTrace, 0, --deep); + } else { + return firstCall.callee; + } + } + }, { + key: 'getRandomStackTraceIndex', + value: function getRandomStackTraceIndex(stackTraceRootLength) { + return Utils_1.Utils.getRandomGenerator().integer({ + min: 0, + max: Math.max(0, Math.round(stackTraceRootLength - 1)) + }); + } + }, { + key: 'insertNodeAtIndex', + value: function insertNodeAtIndex(blockScopeNode, nodeBodyStatements, index) { + if (!NodeAppender.validateBodyStatements(nodeBodyStatements)) { + nodeBodyStatements = []; + } + nodeBodyStatements = NodeAppender.parentizeBodyStatementsBeforeAppend(blockScopeNode, nodeBodyStatements); + blockScopeNode.body = [].concat(_toConsumableArray(blockScopeNode.body.slice(0, index)), _toConsumableArray(nodeBodyStatements), _toConsumableArray(blockScopeNode.body.slice(index))); + } + }, { + key: 'prependNode', + value: function prependNode(blockScopeNode, nodeBodyStatements) { + if (!NodeAppender.validateBodyStatements(nodeBodyStatements)) { + nodeBodyStatements = []; + } + nodeBodyStatements = NodeAppender.parentizeBodyStatementsBeforeAppend(blockScopeNode, nodeBodyStatements); + blockScopeNode.body = [].concat(_toConsumableArray(nodeBodyStatements), _toConsumableArray(blockScopeNode.body)); + } + }, { + key: 'parentizeBodyStatementsBeforeAppend', + value: function parentizeBodyStatementsBeforeAppend(blockScopeNode, nodeBodyStatements) { + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = nodeBodyStatements[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var statement = _step.value; + + statement.parentNode = blockScopeNode; + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + return nodeBodyStatements; + } + }, { + key: 'validateBodyStatements', + value: function validateBodyStatements(nodeBodyStatements) { + return nodeBodyStatements.every(function (statementNode) { + return !!statementNode && statementNode.hasOwnProperty('type'); + }); + } + }]); + + return NodeAppender; +}(); + +exports.NodeAppender = NodeAppender; + +/***/ }, +/* 4 */ /***/ function(module, exports) { module.exports = require("estraverse"); /***/ }, -/* 4 */ +/* 5 */ /***/ function(module, exports) { "use strict"; @@ -623,44 +684,6 @@ module.exports = require("estraverse"); })(exports.AppendState || (exports.AppendState = {})); var AppendState = exports.AppendState; -/***/ }, -/* 5 */ -/***/ function(module, exports, __webpack_require__) { - -"use strict"; -"use strict"; - -var Utils_1 = __webpack_require__(0); -exports.NodeType = Utils_1.Utils.strEnumify({ - ArrayExpression: 'ArrayExpression', - ArrowFunctionExpression: 'ArrowFunctionExpression', - AssignmentExpression: 'AssignmentExpression', - BinaryExpression: 'BinaryExpression', - BlockStatement: 'BlockStatement', - CallExpression: 'CallExpression', - CatchClause: 'CatchClause', - ClassDeclaration: 'ClassDeclaration', - ExpressionStatement: 'ExpressionStatement', - FunctionDeclaration: 'FunctionDeclaration', - FunctionExpression: 'FunctionExpression', - Identifier: 'Identifier', - IfStatement: 'IfStatement', - Literal: 'Literal', - LogicalExpression: 'LogicalExpression', - MemberExpression: 'MemberExpression', - MethodDefinition: 'MethodDefinition', - ObjectExpression: 'ObjectExpression', - Program: 'Program', - Property: 'Property', - ReturnStatement: 'ReturnStatement', - TryStatement: 'TryStatement', - UnaryExpression: 'UnaryExpression', - UpdateExpression: 'UpdateExpression', - VariableDeclaration: 'VariableDeclaration', - VariableDeclarator: 'VariableDeclarator', - WhileStatement: 'WhileStatement' -}); - /***/ }, /* 6 */ /***/ function(module, exports) { @@ -698,6 +721,50 @@ exports.AbstractCustomNode = AbstractCustomNode; /***/ }, /* 7 */ +/***/ function(module, exports, __webpack_require__) { + +"use strict"; +"use strict"; + +var Utils_1 = __webpack_require__(0); +exports.NodeType = Utils_1.Utils.strEnumify({ + ArrayExpression: 'ArrayExpression', + ArrowFunctionExpression: 'ArrowFunctionExpression', + AssignmentExpression: 'AssignmentExpression', + BinaryExpression: 'BinaryExpression', + BlockStatement: 'BlockStatement', + CallExpression: 'CallExpression', + CatchClause: 'CatchClause', + ClassDeclaration: 'ClassDeclaration', + ExpressionStatement: 'ExpressionStatement', + FunctionDeclaration: 'FunctionDeclaration', + FunctionExpression: 'FunctionExpression', + Identifier: 'Identifier', + IfStatement: 'IfStatement', + Literal: 'Literal', + LogicalExpression: 'LogicalExpression', + MemberExpression: 'MemberExpression', + MethodDefinition: 'MethodDefinition', + ObjectExpression: 'ObjectExpression', + Program: 'Program', + Property: 'Property', + ReturnStatement: 'ReturnStatement', + TryStatement: 'TryStatement', + UnaryExpression: 'UnaryExpression', + UpdateExpression: 'UpdateExpression', + VariableDeclaration: 'VariableDeclaration', + VariableDeclarator: 'VariableDeclarator', + WhileStatement: 'WhileStatement' +}); + +/***/ }, +/* 8 */ +/***/ function(module, exports) { + +module.exports = require("format-unicorn"); + +/***/ }, +/* 9 */ /***/ function(module, exports) { "use strict"; @@ -715,13 +782,7 @@ var AbstractNodeObfuscator = function AbstractNodeObfuscator(nodes, options) { exports.AbstractNodeObfuscator = AbstractNodeObfuscator; /***/ }, -/* 8 */ -/***/ function(module, exports) { - -module.exports = require("format-unicorn"); - -/***/ }, -/* 9 */ +/* 10 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -731,8 +792,8 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var JavaScriptObfuscatorCLI_1 = __webpack_require__(31); -var JavaScriptObfuscatorInternal_1 = __webpack_require__(26); +var JavaScriptObfuscatorCLI_1 = __webpack_require__(32); +var JavaScriptObfuscatorInternal_1 = __webpack_require__(27); var JavaScriptObfuscator = function () { function JavaScriptObfuscator() { @@ -761,7 +822,7 @@ var JavaScriptObfuscator = function () { exports.JavaScriptObfuscator = JavaScriptObfuscator; /***/ }, -/* 10 */ +/* 11 */ /***/ function(module, exports) { "use strict"; @@ -772,10 +833,11 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var AbstractNodesGroup = function () { - function AbstractNodesGroup(options) { + function AbstractNodesGroup(stackTraceData, options) { _classCallCheck(this, AbstractNodesGroup); this.nodes = new Map(); + this.stackTraceData = stackTraceData; this.options = options; } @@ -792,13 +854,13 @@ var AbstractNodesGroup = function () { exports.AbstractNodesGroup = AbstractNodesGroup; /***/ }, -/* 11 */ +/* 12 */ /***/ function(module, exports) { module.exports = require("escodegen"); /***/ }, -/* 12 */ +/* 13 */ /***/ function(module, exports) { "use strict"; @@ -810,7 +872,7 @@ exports.SourceMapMode = { }; /***/ }, -/* 13 */ +/* 14 */ /***/ function(module, exports) { "use strict"; @@ -828,7 +890,7 @@ var AbstractReplacer = function AbstractReplacer(nodes, options) { exports.AbstractReplacer = AbstractReplacer; /***/ }, -/* 14 */ +/* 15 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -842,7 +904,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var AbstractReplacer_1 = __webpack_require__(13); +var AbstractReplacer_1 = __webpack_require__(14); var Utils_1 = __webpack_require__(0); var IdentifierReplacer = function (_AbstractReplacer_1$A) { @@ -887,77 +949,8 @@ var IdentifierReplacer = function (_AbstractReplacer_1$A) { exports.IdentifierReplacer = IdentifierReplacer; -/***/ }, -/* 15 */ -/***/ function(module, exports, __webpack_require__) { - -"use strict"; -"use strict"; - -var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var NodeUtils_1 = __webpack_require__(1); -var Utils_1 = __webpack_require__(0); - -var CustomNodeAppender = function () { - function CustomNodeAppender() { - _classCallCheck(this, CustomNodeAppender); - } - - _createClass(CustomNodeAppender, null, [{ - key: 'appendNode', - value: function appendNode(blockScopeStackTraceData, blockScopeNode, nodeBodyStatements) { - var index = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; - - var targetBlockScope = void 0; - if (!blockScopeStackTraceData.length) { - targetBlockScope = blockScopeNode; - } else { - targetBlockScope = CustomNodeAppender.getOptimalBlockScope(blockScopeStackTraceData, index); - } - NodeUtils_1.NodeUtils.prependNode(targetBlockScope, nodeBodyStatements); - } - }, { - key: 'getRandomStackTraceIndex', - value: function getRandomStackTraceIndex(stackTraceRootLength) { - return Utils_1.Utils.getRandomGenerator().integer({ - min: 0, - max: Math.max(0, Math.round(stackTraceRootLength - 1)) - }); - } - }, { - key: 'getOptimalBlockScope', - value: function getOptimalBlockScope(blockScopeTraceData, index) { - var firstCall = blockScopeTraceData[index]; - if (firstCall.stackTrace.length) { - return CustomNodeAppender.getOptimalBlockScope(firstCall.stackTrace, 0); - } else { - return firstCall.callee; - } - } - }]); - - return CustomNodeAppender; -}(); - -exports.CustomNodeAppender = CustomNodeAppender; - /***/ }, /* 16 */ -/***/ function(module, exports) { - -"use strict"; -"use strict"; - -exports.UnicodeArrayEncoding = { - base64: 'base64', - rc4: 'rc4' -}; - -/***/ }, -/* 17 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -971,9 +964,83 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var UnicodeArrayEncoding_1 = __webpack_require__(16); -var AbstractReplacer_1 = __webpack_require__(13); -var NumberLiteralReplacer_1 = __webpack_require__(21); +__webpack_require__(8); +var AppendState_1 = __webpack_require__(5); +var SingleNodeCallControllerTemplate_1 = __webpack_require__(65); +var AbstractCustomNode_1 = __webpack_require__(6); +var NodeAppender_1 = __webpack_require__(3); +var NodeUtils_1 = __webpack_require__(1); + +var NodeCallsControllerFunctionNode = function (_AbstractCustomNode_) { + _inherits(NodeCallsControllerFunctionNode, _AbstractCustomNode_); + + function NodeCallsControllerFunctionNode(stackTraceData, callsControllerFunctionName, randomStackTraceIndex, options) { + _classCallCheck(this, NodeCallsControllerFunctionNode); + + var _this = _possibleConstructorReturn(this, (NodeCallsControllerFunctionNode.__proto__ || Object.getPrototypeOf(NodeCallsControllerFunctionNode)).call(this, options)); + + _this.appendState = AppendState_1.AppendState.BeforeObfuscation; + _this.stackTraceData = stackTraceData; + _this.callsControllerFunctionName = callsControllerFunctionName; + _this.randomStackTraceIndex = randomStackTraceIndex; + return _this; + } + + _createClass(NodeCallsControllerFunctionNode, [{ + key: 'appendNode', + value: function appendNode(blockScopeNode) { + var targetBlockScope = void 0; + if (this.stackTraceData.length) { + targetBlockScope = NodeAppender_1.NodeAppender.getOptimalBlockScope(this.stackTraceData, this.randomStackTraceIndex, 1); + } else { + targetBlockScope = blockScopeNode; + } + NodeAppender_1.NodeAppender.prependNode(targetBlockScope, this.getNode()); + } + }, { + key: 'getNodeStructure', + value: function getNodeStructure() { + return NodeUtils_1.NodeUtils.convertCodeToStructure(SingleNodeCallControllerTemplate_1.SingleNodeCallControllerTemplate().formatUnicorn({ + singleNodeCallControllerFunctionName: this.callsControllerFunctionName + })); + } + }]); + + return NodeCallsControllerFunctionNode; +}(AbstractCustomNode_1.AbstractCustomNode); + +exports.NodeCallsControllerFunctionNode = NodeCallsControllerFunctionNode; + +/***/ }, +/* 17 */ +/***/ function(module, exports) { + +"use strict"; +"use strict"; + +exports.UnicodeArrayEncoding = { + base64: 'base64', + rc4: 'rc4' +}; + +/***/ }, +/* 18 */ +/***/ function(module, exports, __webpack_require__) { + +"use strict"; +"use strict"; + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var UnicodeArrayEncoding_1 = __webpack_require__(17); +var AbstractReplacer_1 = __webpack_require__(14); +var NumberLiteralReplacer_1 = __webpack_require__(22); var Utils_1 = __webpack_require__(0); var StringLiteralReplacer = function (_AbstractReplacer_1$A) { @@ -1044,13 +1111,13 @@ StringLiteralReplacer.rc4Keys = Utils_1.Utils.getRandomGenerator().n(function () exports.StringLiteralReplacer = StringLiteralReplacer; /***/ }, -/* 18 */ +/* 19 */ /***/ function(module, exports, __webpack_require__) { "use strict"; "use strict"; -var SourceMapMode_1 = __webpack_require__(12); +var SourceMapMode_1 = __webpack_require__(13); exports.NO_CUSTOM_NODES_PRESET = Object.freeze({ compact: true, debugProtection: false, @@ -1070,7 +1137,7 @@ exports.NO_CUSTOM_NODES_PRESET = Object.freeze({ }); /***/ }, -/* 19 */ +/* 20 */ /***/ function(module, exports) { "use strict"; @@ -1111,7 +1178,7 @@ var ObfuscationResult = function () { exports.ObfuscationResult = ObfuscationResult; /***/ }, -/* 20 */ +/* 21 */ /***/ function(module, exports) { "use strict"; @@ -1176,7 +1243,7 @@ exports.JSFuck = { }; /***/ }, -/* 21 */ +/* 22 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1190,7 +1257,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var AbstractReplacer_1 = __webpack_require__(13); +var AbstractReplacer_1 = __webpack_require__(14); var Utils_1 = __webpack_require__(0); var NumberLiteralReplacer = function (_AbstractReplacer_1$A) { @@ -1219,13 +1286,13 @@ var NumberLiteralReplacer = function (_AbstractReplacer_1$A) { exports.NumberLiteralReplacer = NumberLiteralReplacer; /***/ }, -/* 22 */ +/* 23 */ /***/ function(module, exports, __webpack_require__) { "use strict"; "use strict"; -var SourceMapMode_1 = __webpack_require__(12); +var SourceMapMode_1 = __webpack_require__(13); exports.DEFAULT_PRESET = Object.freeze({ compact: true, debugProtection: false, @@ -1245,25 +1312,25 @@ exports.DEFAULT_PRESET = Object.freeze({ }); /***/ }, -/* 23 */ +/* 24 */ /***/ function(module, exports) { module.exports = require("esprima"); /***/ }, -/* 24 */ +/* 25 */ /***/ function(module, exports) { module.exports = require("path"); /***/ }, -/* 25 */ +/* 26 */ /***/ function(module, exports) { module.exports = require("babel-polyfill"); /***/ }, -/* 26 */ +/* 27 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1273,12 +1340,12 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var esprima = __webpack_require__(23); -var escodegen = __webpack_require__(11); -var ObfuscationResult_1 = __webpack_require__(19); -var Obfuscator_1 = __webpack_require__(27); -var Options_1 = __webpack_require__(55); -var SourceMapCorrector_1 = __webpack_require__(28); +var esprima = __webpack_require__(24); +var escodegen = __webpack_require__(12); +var ObfuscationResult_1 = __webpack_require__(20); +var Obfuscator_1 = __webpack_require__(28); +var Options_1 = __webpack_require__(56); +var SourceMapCorrector_1 = __webpack_require__(29); var JavaScriptObfuscatorInternal = function () { function JavaScriptObfuscatorInternal(sourceCode) { @@ -1331,7 +1398,7 @@ JavaScriptObfuscatorInternal.escodegenParams = { exports.JavaScriptObfuscatorInternal = JavaScriptObfuscatorInternal; /***/ }, -/* 27 */ +/* 28 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1343,33 +1410,32 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var estraverse = __webpack_require__(3); -var AppendState_1 = __webpack_require__(4); -var NodeType_1 = __webpack_require__(5); -var CatchClauseObfuscator_1 = __webpack_require__(46); -var ConsoleOutputNodesGroup_1 = __webpack_require__(41); -var DebugProtectionNodesGroup_1 = __webpack_require__(42); -var DomainLockNodesGroup_1 = __webpack_require__(43); -var FunctionDeclarationObfuscator_1 = __webpack_require__(47); -var FunctionObfuscator_1 = __webpack_require__(48); -var LiteralObfuscator_1 = __webpack_require__(49); -var MemberExpressionObfuscator_1 = __webpack_require__(50); -var MethodDefinitionObfuscator_1 = __webpack_require__(51); +var estraverse = __webpack_require__(4); +var AppendState_1 = __webpack_require__(5); +var NodeType_1 = __webpack_require__(7); +var CatchClauseObfuscator_1 = __webpack_require__(47); +var ConsoleOutputNodesGroup_1 = __webpack_require__(42); +var DebugProtectionNodesGroup_1 = __webpack_require__(43); +var DomainLockNodesGroup_1 = __webpack_require__(44); +var FunctionDeclarationObfuscator_1 = __webpack_require__(48); +var FunctionObfuscator_1 = __webpack_require__(49); +var LiteralObfuscator_1 = __webpack_require__(50); +var MemberExpressionObfuscator_1 = __webpack_require__(51); +var MethodDefinitionObfuscator_1 = __webpack_require__(52); var Nodes_1 = __webpack_require__(2); var NodeUtils_1 = __webpack_require__(1); -var ObjectExpressionObfuscator_1 = __webpack_require__(52); -var SelfDefendingNodesGroup_1 = __webpack_require__(44); -var UnicodeArrayNodesGroup_1 = __webpack_require__(45); -var VariableDeclarationObfuscator_1 = __webpack_require__(53); -var StackTraceAnalyzer_1 = __webpack_require__(58); +var ObjectExpressionObfuscator_1 = __webpack_require__(53); +var SelfDefendingNodesGroup_1 = __webpack_require__(45); +var UnicodeArrayNodesGroup_1 = __webpack_require__(46); +var VariableDeclarationObfuscator_1 = __webpack_require__(54); +var StackTraceAnalyzer_1 = __webpack_require__(59); var Obfuscator = function () { function Obfuscator(options) { _classCallCheck(this, Obfuscator); - this.nodeObfuscators = new Map([[NodeType_1.NodeType.ArrowFunctionExpression, [FunctionObfuscator_1.FunctionObfuscator]], [NodeType_1.NodeType.ClassDeclaration, [FunctionDeclarationObfuscator_1.FunctionDeclarationObfuscator]], [NodeType_1.NodeType.CatchClause, [CatchClauseObfuscator_1.CatchClauseObfuscator]], [NodeType_1.NodeType.FunctionDeclaration, [FunctionDeclarationObfuscator_1.FunctionDeclarationObfuscator, FunctionObfuscator_1.FunctionObfuscator]], [NodeType_1.NodeType.FunctionExpression, [FunctionObfuscator_1.FunctionObfuscator]], [NodeType_1.NodeType.MemberExpression, [MemberExpressionObfuscator_1.MemberExpressionObfuscator]], [NodeType_1.NodeType.MethodDefinition, [MethodDefinitionObfuscator_1.MethodDefinitionObfuscator]], [NodeType_1.NodeType.ObjectExpression, [ObjectExpressionObfuscator_1.ObjectExpressionObfuscator]], [NodeType_1.NodeType.VariableDeclaration, [VariableDeclarationObfuscator_1.VariableDeclarationObfuscator]], [NodeType_1.NodeType.Literal, [LiteralObfuscator_1.LiteralObfuscator]]]); + this.customNodes = new Map(); this.options = options; - this.nodes = new Map([].concat(_toConsumableArray(new DomainLockNodesGroup_1.DomainLockNodesGroup(this.options).getNodes()), _toConsumableArray(new SelfDefendingNodesGroup_1.SelfDefendingNodesGroup(this.options).getNodes()), _toConsumableArray(new ConsoleOutputNodesGroup_1.ConsoleOutputNodesGroup(this.options).getNodes()), _toConsumableArray(new DebugProtectionNodesGroup_1.DebugProtectionNodesGroup(this.options).getNodes()), _toConsumableArray(new UnicodeArrayNodesGroup_1.UnicodeArrayNodesGroup(this.options).getNodes()))); } _createClass(Obfuscator, [{ @@ -1380,50 +1446,60 @@ var Obfuscator = function () { } NodeUtils_1.NodeUtils.parentize(node); var stackTraceData = new StackTraceAnalyzer_1.StackTraceAnalyzer(node.body).analyze(); - this.beforeObfuscation(node, stackTraceData); + this.initializeCustomNodes(stackTraceData); + this.beforeObfuscation(node); this.obfuscate(node); - this.afterObfuscation(node, stackTraceData); + this.afterObfuscation(node); return node; } }, { key: 'afterObfuscation', - value: function afterObfuscation(astTree, stackTraceData) { - this.nodes.forEach(function (node) { + value: function afterObfuscation(astTree) { + this.customNodes.forEach(function (node) { if (node.getAppendState() === AppendState_1.AppendState.AfterObfuscation) { - node.appendNode(astTree, stackTraceData); + node.appendNode(astTree); } }); } }, { key: 'beforeObfuscation', - value: function beforeObfuscation(astTree, stackTraceData) { - this.nodes.forEach(function (node) { + value: function beforeObfuscation(astTree) { + this.customNodes.forEach(function (node) { if (node.getAppendState() === AppendState_1.AppendState.BeforeObfuscation) { - node.appendNode(astTree, stackTraceData); + node.appendNode(astTree); } }); } + }, { + key: 'initializeCustomNodes', + value: function initializeCustomNodes(stackTraceData) { + var _this = this; + + Obfuscator.nodeGroups.map(function (nodeGroupConstructor) { + _this.customNodes = new Map([].concat(_toConsumableArray(_this.customNodes), _toConsumableArray(new nodeGroupConstructor(stackTraceData, _this.options).getNodes()))); + }); + } }, { key: 'initializeNodeObfuscators', value: function initializeNodeObfuscators(node, parentNode) { - var _this = this; + var _this2 = this; - var nodeObfuscators = this.nodeObfuscators.get(node.type); + var nodeObfuscators = Obfuscator.nodeObfuscators.get(node.type); if (!nodeObfuscators) { return; } nodeObfuscators.forEach(function (obfuscator) { - new obfuscator(_this.nodes, _this.options).obfuscateNode(node, parentNode); + new obfuscator(_this2.customNodes, _this2.options).obfuscateNode(node, parentNode); }); } }, { key: 'obfuscate', value: function obfuscate(node) { - var _this2 = this; + var _this3 = this; estraverse.replace(node, { enter: function enter(node, parentNode) { - _this2.initializeNodeObfuscators(node, parentNode); + _this3.initializeNodeObfuscators(node, parentNode); } }); } @@ -1432,10 +1508,12 @@ var Obfuscator = function () { return Obfuscator; }(); +Obfuscator.nodeGroups = [DomainLockNodesGroup_1.DomainLockNodesGroup, SelfDefendingNodesGroup_1.SelfDefendingNodesGroup, ConsoleOutputNodesGroup_1.ConsoleOutputNodesGroup, DebugProtectionNodesGroup_1.DebugProtectionNodesGroup, UnicodeArrayNodesGroup_1.UnicodeArrayNodesGroup]; +Obfuscator.nodeObfuscators = new Map([[NodeType_1.NodeType.ArrowFunctionExpression, [FunctionObfuscator_1.FunctionObfuscator]], [NodeType_1.NodeType.ClassDeclaration, [FunctionDeclarationObfuscator_1.FunctionDeclarationObfuscator]], [NodeType_1.NodeType.CatchClause, [CatchClauseObfuscator_1.CatchClauseObfuscator]], [NodeType_1.NodeType.FunctionDeclaration, [FunctionDeclarationObfuscator_1.FunctionDeclarationObfuscator, FunctionObfuscator_1.FunctionObfuscator]], [NodeType_1.NodeType.FunctionExpression, [FunctionObfuscator_1.FunctionObfuscator]], [NodeType_1.NodeType.MemberExpression, [MemberExpressionObfuscator_1.MemberExpressionObfuscator]], [NodeType_1.NodeType.MethodDefinition, [MethodDefinitionObfuscator_1.MethodDefinitionObfuscator]], [NodeType_1.NodeType.ObjectExpression, [ObjectExpressionObfuscator_1.ObjectExpressionObfuscator]], [NodeType_1.NodeType.VariableDeclaration, [VariableDeclarationObfuscator_1.VariableDeclarationObfuscator]], [NodeType_1.NodeType.Literal, [LiteralObfuscator_1.LiteralObfuscator]]]); exports.Obfuscator = Obfuscator; /***/ }, -/* 28 */ +/* 29 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1445,8 +1523,8 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var SourceMapMode_1 = __webpack_require__(12); -var ObfuscationResult_1 = __webpack_require__(19); +var SourceMapMode_1 = __webpack_require__(13); +var ObfuscationResult_1 = __webpack_require__(20); var Utils_1 = __webpack_require__(0); var SourceMapCorrector = function () { @@ -1493,7 +1571,7 @@ var SourceMapCorrector = function () { exports.SourceMapCorrector = SourceMapCorrector; /***/ }, -/* 29 */ +/* 30 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1550,7 +1628,7 @@ var UnicodeArray = function () { exports.UnicodeArray = UnicodeArray; /***/ }, -/* 30 */ +/* 31 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1560,9 +1638,9 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var fs = __webpack_require__(82); -var mkdirp = __webpack_require__(83); -var path = __webpack_require__(24); +var fs = __webpack_require__(84); +var mkdirp = __webpack_require__(85); +var path = __webpack_require__(25); var Utils_1 = __webpack_require__(0); var CLIUtils = function () { @@ -1642,7 +1720,7 @@ CLIUtils.encoding = 'utf8'; exports.CLIUtils = CLIUtils; /***/ }, -/* 31 */ +/* 32 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1652,13 +1730,13 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var commander = __webpack_require__(81); -var path = __webpack_require__(24); -var SourceMapMode_1 = __webpack_require__(12); -var UnicodeArrayEncoding_1 = __webpack_require__(16); -var DefaultPreset_1 = __webpack_require__(22); -var CLIUtils_1 = __webpack_require__(30); -var JavaScriptObfuscator_1 = __webpack_require__(9); +var commander = __webpack_require__(83); +var path = __webpack_require__(25); +var SourceMapMode_1 = __webpack_require__(13); +var UnicodeArrayEncoding_1 = __webpack_require__(17); +var DefaultPreset_1 = __webpack_require__(23); +var CLIUtils_1 = __webpack_require__(31); +var JavaScriptObfuscator_1 = __webpack_require__(10); var Utils_1 = __webpack_require__(0); var JavaScriptObfuscatorCLI = function () { @@ -1790,7 +1868,7 @@ var JavaScriptObfuscatorCLI = function () { exports.JavaScriptObfuscatorCLI = JavaScriptObfuscatorCLI; /***/ }, -/* 32 */ +/* 33 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1805,29 +1883,32 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } __webpack_require__(8); -var AppendState_1 = __webpack_require__(4); -var ConsoleOutputDisableExpressionTemplate_1 = __webpack_require__(64); +var AppendState_1 = __webpack_require__(5); +var ConsoleOutputDisableExpressionTemplate_1 = __webpack_require__(66); var AbstractCustomNode_1 = __webpack_require__(6); -var CustomNodeAppender_1 = __webpack_require__(15); +var NodeAppender_1 = __webpack_require__(3); var NodeUtils_1 = __webpack_require__(1); var Utils_1 = __webpack_require__(0); var ConsoleOutputDisableExpressionNode = function (_AbstractCustomNode_) { _inherits(ConsoleOutputDisableExpressionNode, _AbstractCustomNode_); - function ConsoleOutputDisableExpressionNode() { + function ConsoleOutputDisableExpressionNode(stackTraceData, callsControllerFunctionName, randomStackTraceIndex, options) { _classCallCheck(this, ConsoleOutputDisableExpressionNode); - var _this = _possibleConstructorReturn(this, (ConsoleOutputDisableExpressionNode.__proto__ || Object.getPrototypeOf(ConsoleOutputDisableExpressionNode)).apply(this, arguments)); + var _this = _possibleConstructorReturn(this, (ConsoleOutputDisableExpressionNode.__proto__ || Object.getPrototypeOf(ConsoleOutputDisableExpressionNode)).call(this, options)); _this.appendState = AppendState_1.AppendState.BeforeObfuscation; + _this.stackTraceData = stackTraceData; + _this.callsControllerFunctionName = callsControllerFunctionName; + _this.randomStackTraceIndex = randomStackTraceIndex; return _this; } _createClass(ConsoleOutputDisableExpressionNode, [{ key: 'appendNode', - value: function appendNode(blockScopeNode, stackTraceData) { - CustomNodeAppender_1.CustomNodeAppender.appendNode(stackTraceData, blockScopeNode, this.getNode(), CustomNodeAppender_1.CustomNodeAppender.getRandomStackTraceIndex(stackTraceData.length)); + value: function appendNode(blockScopeNode) { + NodeAppender_1.NodeAppender.appendNodeToOptimalBlockScope(this.stackTraceData, blockScopeNode, this.getNode(), this.randomStackTraceIndex); } }, { key: 'getNodeStructure', @@ -1844,7 +1925,7 @@ var ConsoleOutputDisableExpressionNode = function (_AbstractCustomNode_) { exports.ConsoleOutputDisableExpressionNode = ConsoleOutputDisableExpressionNode; /***/ }, -/* 33 */ +/* 34 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1859,9 +1940,10 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } __webpack_require__(8); -var AppendState_1 = __webpack_require__(4); -var DebufProtectionFunctionCallTemplate_1 = __webpack_require__(65); +var AppendState_1 = __webpack_require__(5); +var DebufProtectionFunctionCallTemplate_1 = __webpack_require__(67); var AbstractCustomNode_1 = __webpack_require__(6); +var NodeAppender_1 = __webpack_require__(3); var NodeUtils_1 = __webpack_require__(1); var DebugProtectionFunctionCallNode = function (_AbstractCustomNode_) { @@ -1880,7 +1962,7 @@ var DebugProtectionFunctionCallNode = function (_AbstractCustomNode_) { _createClass(DebugProtectionFunctionCallNode, [{ key: 'appendNode', value: function appendNode(blockScopeNode) { - NodeUtils_1.NodeUtils.appendNode(blockScopeNode, this.getNode()); + NodeAppender_1.NodeAppender.appendNode(blockScopeNode, this.getNode()); } }, { key: 'getNodeStructure', @@ -1897,7 +1979,7 @@ var DebugProtectionFunctionCallNode = function (_AbstractCustomNode_) { exports.DebugProtectionFunctionCallNode = DebugProtectionFunctionCallNode; /***/ }, -/* 34 */ +/* 35 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1912,9 +1994,10 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } __webpack_require__(8); -var AppendState_1 = __webpack_require__(4); -var DebugProtectionFunctionIntervalTemplate_1 = __webpack_require__(66); +var AppendState_1 = __webpack_require__(5); +var DebugProtectionFunctionIntervalTemplate_1 = __webpack_require__(68); var AbstractCustomNode_1 = __webpack_require__(6); +var NodeAppender_1 = __webpack_require__(3); var NodeUtils_1 = __webpack_require__(1); var DebugProtectionFunctionIntervalNode = function (_AbstractCustomNode_) { @@ -1933,7 +2016,7 @@ var DebugProtectionFunctionIntervalNode = function (_AbstractCustomNode_) { _createClass(DebugProtectionFunctionIntervalNode, [{ key: 'appendNode', value: function appendNode(blockScopeNode) { - NodeUtils_1.NodeUtils.appendNode(blockScopeNode, this.getNode()); + NodeAppender_1.NodeAppender.appendNode(blockScopeNode, this.getNode()); } }, { key: 'getNodeStructure', @@ -1950,7 +2033,7 @@ var DebugProtectionFunctionIntervalNode = function (_AbstractCustomNode_) { exports.DebugProtectionFunctionIntervalNode = DebugProtectionFunctionIntervalNode; /***/ }, -/* 35 */ +/* 36 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -1965,9 +2048,10 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } __webpack_require__(8); -var AppendState_1 = __webpack_require__(4); -var DebugProtectionFunctionTemplate_1 = __webpack_require__(67); +var AppendState_1 = __webpack_require__(5); +var DebugProtectionFunctionTemplate_1 = __webpack_require__(69); var AbstractCustomNode_1 = __webpack_require__(6); +var NodeAppender_1 = __webpack_require__(3); var NodeUtils_1 = __webpack_require__(1); var Utils_1 = __webpack_require__(0); @@ -1992,7 +2076,7 @@ var DebugProtectionFunctionNode = function (_AbstractCustomNode_) { min: 0, max: programBodyLength }); - NodeUtils_1.NodeUtils.insertNodeAtIndex(blockScopeNode, this.getNode(), randomIndex); + NodeAppender_1.NodeAppender.insertNodeAtIndex(blockScopeNode, this.getNode(), randomIndex); } }, { key: 'getNodeIdentifier', @@ -2014,7 +2098,7 @@ var DebugProtectionFunctionNode = function (_AbstractCustomNode_) { exports.DebugProtectionFunctionNode = DebugProtectionFunctionNode; /***/ }, -/* 36 */ +/* 37 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2031,29 +2115,32 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } __webpack_require__(8); -var AppendState_1 = __webpack_require__(4); -var DomainLockNodeTemplate_1 = __webpack_require__(68); +var AppendState_1 = __webpack_require__(5); +var DomainLockNodeTemplate_1 = __webpack_require__(70); var AbstractCustomNode_1 = __webpack_require__(6); -var CustomNodeAppender_1 = __webpack_require__(15); +var NodeAppender_1 = __webpack_require__(3); var NodeUtils_1 = __webpack_require__(1); var Utils_1 = __webpack_require__(0); var DomainLockNode = function (_AbstractCustomNode_) { _inherits(DomainLockNode, _AbstractCustomNode_); - function DomainLockNode() { + function DomainLockNode(stackTraceData, callsControllerFunctionName, randomStackTraceIndex, options) { _classCallCheck(this, DomainLockNode); - var _this = _possibleConstructorReturn(this, (DomainLockNode.__proto__ || Object.getPrototypeOf(DomainLockNode)).apply(this, arguments)); + var _this = _possibleConstructorReturn(this, (DomainLockNode.__proto__ || Object.getPrototypeOf(DomainLockNode)).call(this, options)); _this.appendState = AppendState_1.AppendState.BeforeObfuscation; + _this.stackTraceData = stackTraceData; + _this.callsControllerFunctionName = callsControllerFunctionName; + _this.randomStackTraceIndex = randomStackTraceIndex; return _this; } _createClass(DomainLockNode, [{ key: 'appendNode', - value: function appendNode(blockScopeNode, stackTraceData) { - CustomNodeAppender_1.CustomNodeAppender.appendNode(stackTraceData, blockScopeNode, this.getNode(), CustomNodeAppender_1.CustomNodeAppender.getRandomStackTraceIndex(stackTraceData.length)); + value: function appendNode(blockScopeNode) { + NodeAppender_1.NodeAppender.appendNodeToOptimalBlockScope(this.stackTraceData, blockScopeNode, this.getNode(), this.randomStackTraceIndex); } }, { key: 'getNodeStructure', @@ -2069,7 +2156,8 @@ var DomainLockNode = function (_AbstractCustomNode_) { return NodeUtils_1.NodeUtils.convertCodeToStructure(DomainLockNodeTemplate_1.DomainLockNodeTemplate().formatUnicorn({ domainLockFunctionName: Utils_1.Utils.getRandomVariableName(), diff: diff, - domains: hiddenDomainsString + domains: hiddenDomainsString, + singleNodeCallControllerFunctionName: this.callsControllerFunctionName })); } }]); @@ -2080,7 +2168,7 @@ var DomainLockNode = function (_AbstractCustomNode_) { exports.DomainLockNode = DomainLockNode; /***/ }, -/* 37 */ +/* 38 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2094,31 +2182,34 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var AppendState_1 = __webpack_require__(4); -var NoCustomNodesPreset_1 = __webpack_require__(18); -var SelfDefendingTemplate_1 = __webpack_require__(69); +var AppendState_1 = __webpack_require__(5); +var NoCustomNodesPreset_1 = __webpack_require__(19); +var SelfDefendingTemplate_1 = __webpack_require__(71); var AbstractCustomNode_1 = __webpack_require__(6); -var CustomNodeAppender_1 = __webpack_require__(15); -var JavaScriptObfuscator_1 = __webpack_require__(9); +var NodeAppender_1 = __webpack_require__(3); +var JavaScriptObfuscator_1 = __webpack_require__(10); var NodeUtils_1 = __webpack_require__(1); var Utils_1 = __webpack_require__(0); var SelfDefendingUnicodeNode = function (_AbstractCustomNode_) { _inherits(SelfDefendingUnicodeNode, _AbstractCustomNode_); - function SelfDefendingUnicodeNode() { + function SelfDefendingUnicodeNode(stackTraceData, callsControllerFunctionName, randomStackTraceIndex, options) { _classCallCheck(this, SelfDefendingUnicodeNode); - var _this = _possibleConstructorReturn(this, (SelfDefendingUnicodeNode.__proto__ || Object.getPrototypeOf(SelfDefendingUnicodeNode)).apply(this, arguments)); + var _this = _possibleConstructorReturn(this, (SelfDefendingUnicodeNode.__proto__ || Object.getPrototypeOf(SelfDefendingUnicodeNode)).call(this, options)); _this.appendState = AppendState_1.AppendState.AfterObfuscation; + _this.stackTraceData = stackTraceData; + _this.callsControllerFunctionName = callsControllerFunctionName; + _this.randomStackTraceIndex = randomStackTraceIndex; return _this; } _createClass(SelfDefendingUnicodeNode, [{ key: 'appendNode', - value: function appendNode(blockScopeNode, stackTraceData) { - CustomNodeAppender_1.CustomNodeAppender.appendNode(stackTraceData, blockScopeNode, this.getNode(), CustomNodeAppender_1.CustomNodeAppender.getRandomStackTraceIndex(stackTraceData.length)); + value: function appendNode(blockScopeNode) { + NodeAppender_1.NodeAppender.appendNodeToOptimalBlockScope(this.stackTraceData, blockScopeNode, this.getNode(), this.randomStackTraceIndex); } }, { key: 'getNodeStructure', @@ -2135,7 +2226,7 @@ var SelfDefendingUnicodeNode = function (_AbstractCustomNode_) { exports.SelfDefendingUnicodeNode = SelfDefendingUnicodeNode; /***/ }, -/* 38 */ +/* 39 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2152,17 +2243,18 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } __webpack_require__(8); -var AppendState_1 = __webpack_require__(4); -var UnicodeArrayEncoding_1 = __webpack_require__(16); -var NoCustomNodesPreset_1 = __webpack_require__(18); -var AtobTemplate_1 = __webpack_require__(62); -var Rc4Template_1 = __webpack_require__(63); -var SelfDefendingTemplate_1 = __webpack_require__(70); -var UnicodeArrayBase64DecodeNodeTemplate_1 = __webpack_require__(71); -var UnicodeArrayCallsWrapperTemplate_1 = __webpack_require__(72); -var UnicodeArrayRC4DecodeNodeTemplate_1 = __webpack_require__(73); +var AppendState_1 = __webpack_require__(5); +var UnicodeArrayEncoding_1 = __webpack_require__(17); +var NoCustomNodesPreset_1 = __webpack_require__(19); +var AtobTemplate_1 = __webpack_require__(63); +var Rc4Template_1 = __webpack_require__(64); +var SelfDefendingTemplate_1 = __webpack_require__(72); +var UnicodeArrayBase64DecodeNodeTemplate_1 = __webpack_require__(73); +var UnicodeArrayCallsWrapperTemplate_1 = __webpack_require__(74); +var UnicodeArrayRC4DecodeNodeTemplate_1 = __webpack_require__(75); var AbstractCustomNode_1 = __webpack_require__(6); -var JavaScriptObfuscator_1 = __webpack_require__(9); +var JavaScriptObfuscator_1 = __webpack_require__(10); +var NodeAppender_1 = __webpack_require__(3); var NodeUtils_1 = __webpack_require__(1); var UnicodeArrayCallsWrapper = function (_AbstractCustomNode_) { @@ -2186,7 +2278,7 @@ var UnicodeArrayCallsWrapper = function (_AbstractCustomNode_) { if (!this.unicodeArray.getLength()) { return; } - NodeUtils_1.NodeUtils.insertNodeAtIndex(blockScopeNode, this.getNode(), 1); + NodeAppender_1.NodeAppender.insertNodeAtIndex(blockScopeNode, this.getNode(), 1); } }, { key: 'getNodeIdentifier', @@ -2246,7 +2338,7 @@ var UnicodeArrayCallsWrapper = function (_AbstractCustomNode_) { exports.UnicodeArrayCallsWrapper = UnicodeArrayCallsWrapper; /***/ }, -/* 39 */ +/* 40 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2263,9 +2355,10 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } __webpack_require__(8); -var AppendState_1 = __webpack_require__(4); -var UnicodeArrayTemplate_1 = __webpack_require__(74); +var AppendState_1 = __webpack_require__(5); +var UnicodeArrayTemplate_1 = __webpack_require__(76); var AbstractCustomNode_1 = __webpack_require__(6); +var NodeAppender_1 = __webpack_require__(3); var NodeUtils_1 = __webpack_require__(1); var UnicodeArrayNode = function (_AbstractCustomNode_) { @@ -2292,7 +2385,7 @@ var UnicodeArrayNode = function (_AbstractCustomNode_) { if (!this.unicodeArray.getLength()) { return; } - NodeUtils_1.NodeUtils.prependNode(blockScopeNode, this.getNode()); + NodeAppender_1.NodeAppender.prependNode(blockScopeNode, this.getNode()); } }, { key: 'getNodeIdentifier', @@ -2332,7 +2425,7 @@ UnicodeArrayNode.UNICODE_ARRAY_RANDOM_LENGTH = 4; exports.UnicodeArrayNode = UnicodeArrayNode; /***/ }, -/* 40 */ +/* 41 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2349,12 +2442,13 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } __webpack_require__(8); -var AppendState_1 = __webpack_require__(4); -var NoCustomNodesPreset_1 = __webpack_require__(18); -var SelfDefendingTemplate_1 = __webpack_require__(75); -var UnicodeArrayRotateFunctionTemplate_1 = __webpack_require__(76); +var AppendState_1 = __webpack_require__(5); +var NoCustomNodesPreset_1 = __webpack_require__(19); +var SelfDefendingTemplate_1 = __webpack_require__(77); +var UnicodeArrayRotateFunctionTemplate_1 = __webpack_require__(78); var AbstractCustomNode_1 = __webpack_require__(6); -var JavaScriptObfuscator_1 = __webpack_require__(9); +var JavaScriptObfuscator_1 = __webpack_require__(10); +var NodeAppender_1 = __webpack_require__(3); var NodeUtils_1 = __webpack_require__(1); var Utils_1 = __webpack_require__(0); @@ -2379,7 +2473,7 @@ var UnicodeArrayRotateFunctionNode = function (_AbstractCustomNode_) { if (!this.unicodeArray.getLength()) { return; } - NodeUtils_1.NodeUtils.insertNodeAtIndex(blockScopeNode, this.getNode(), 1); + NodeAppender_1.NodeAppender.insertNodeAtIndex(blockScopeNode, this.getNode(), 1); } }, { key: 'getNode', @@ -2415,42 +2509,6 @@ var UnicodeArrayRotateFunctionNode = function (_AbstractCustomNode_) { exports.UnicodeArrayRotateFunctionNode = UnicodeArrayRotateFunctionNode; -/***/ }, -/* 41 */ -/***/ function(module, exports, __webpack_require__) { - -"use strict"; -"use strict"; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var AbstractNodesGroup_1 = __webpack_require__(10); -var ConsoleOutputDisableExpressionNode_1 = __webpack_require__(32); - -var ConsoleOutputNodesGroup = function (_AbstractNodesGroup_) { - _inherits(ConsoleOutputNodesGroup, _AbstractNodesGroup_); - - function ConsoleOutputNodesGroup(options) { - _classCallCheck(this, ConsoleOutputNodesGroup); - - var _this = _possibleConstructorReturn(this, (ConsoleOutputNodesGroup.__proto__ || Object.getPrototypeOf(ConsoleOutputNodesGroup)).call(this, options)); - - if (!_this.options.disableConsoleOutput) { - return _possibleConstructorReturn(_this); - } - _this.nodes.set('consoleOutputDisableExpressionNode', new ConsoleOutputDisableExpressionNode_1.ConsoleOutputDisableExpressionNode(_this.options)); - return _this; - } - - return ConsoleOutputNodesGroup; -}(AbstractNodesGroup_1.AbstractNodesGroup); - -exports.ConsoleOutputNodesGroup = ConsoleOutputNodesGroup; - /***/ }, /* 42 */ /***/ function(module, exports, __webpack_require__) { @@ -2464,19 +2522,60 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var DebugProtectionFunctionCallNode_1 = __webpack_require__(33); -var DebugProtectionFunctionIntervalNode_1 = __webpack_require__(34); -var DebugProtectionFunctionNode_1 = __webpack_require__(35); -var AbstractNodesGroup_1 = __webpack_require__(10); +var AbstractNodesGroup_1 = __webpack_require__(11); +var ConsoleOutputDisableExpressionNode_1 = __webpack_require__(33); +var NodeAppender_1 = __webpack_require__(3); +var NodeCallsControllerFunctionNode_1 = __webpack_require__(16); + +var ConsoleOutputNodesGroup = function (_AbstractNodesGroup_) { + _inherits(ConsoleOutputNodesGroup, _AbstractNodesGroup_); + + function ConsoleOutputNodesGroup(stackTraceData, options) { + _classCallCheck(this, ConsoleOutputNodesGroup); + + var _this = _possibleConstructorReturn(this, (ConsoleOutputNodesGroup.__proto__ || Object.getPrototypeOf(ConsoleOutputNodesGroup)).call(this, stackTraceData, options)); + + if (!_this.options.disableConsoleOutput) { + return _possibleConstructorReturn(_this); + } + var callsControllerFunctionName = 'domainLockCallsControllerFunction'; + var randomStackTraceIndex = NodeAppender_1.NodeAppender.getRandomStackTraceIndex(_this.stackTraceData.length); + _this.nodes.set('consoleOutputDisableExpressionNode', new ConsoleOutputDisableExpressionNode_1.ConsoleOutputDisableExpressionNode(_this.stackTraceData, callsControllerFunctionName, randomStackTraceIndex, _this.options)); + _this.nodes.set('ConsoleOutputNodeCallsControllerFunctionNode', new NodeCallsControllerFunctionNode_1.NodeCallsControllerFunctionNode(_this.stackTraceData, callsControllerFunctionName, randomStackTraceIndex, _this.options)); + return _this; + } + + return ConsoleOutputNodesGroup; +}(AbstractNodesGroup_1.AbstractNodesGroup); + +exports.ConsoleOutputNodesGroup = ConsoleOutputNodesGroup; + +/***/ }, +/* 43 */ +/***/ function(module, exports, __webpack_require__) { + +"use strict"; +"use strict"; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var DebugProtectionFunctionCallNode_1 = __webpack_require__(34); +var DebugProtectionFunctionIntervalNode_1 = __webpack_require__(35); +var DebugProtectionFunctionNode_1 = __webpack_require__(36); +var AbstractNodesGroup_1 = __webpack_require__(11); var Utils_1 = __webpack_require__(0); var DebugProtectionNodesGroup = function (_AbstractNodesGroup_) { _inherits(DebugProtectionNodesGroup, _AbstractNodesGroup_); - function DebugProtectionNodesGroup(options) { + function DebugProtectionNodesGroup(stackTraceData, options) { _classCallCheck(this, DebugProtectionNodesGroup); - var _this = _possibleConstructorReturn(this, (DebugProtectionNodesGroup.__proto__ || Object.getPrototypeOf(DebugProtectionNodesGroup)).call(this, options)); + var _this = _possibleConstructorReturn(this, (DebugProtectionNodesGroup.__proto__ || Object.getPrototypeOf(DebugProtectionNodesGroup)).call(this, stackTraceData, options)); _this.debugProtectionFunctionIdentifier = Utils_1.Utils.getRandomVariableName(); if (!_this.options.debugProtection) { @@ -2495,42 +2594,6 @@ var DebugProtectionNodesGroup = function (_AbstractNodesGroup_) { exports.DebugProtectionNodesGroup = DebugProtectionNodesGroup; -/***/ }, -/* 43 */ -/***/ function(module, exports, __webpack_require__) { - -"use strict"; -"use strict"; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var AbstractNodesGroup_1 = __webpack_require__(10); -var DomainLockNode_1 = __webpack_require__(36); - -var DomainLockNodesGroup = function (_AbstractNodesGroup_) { - _inherits(DomainLockNodesGroup, _AbstractNodesGroup_); - - function DomainLockNodesGroup(options) { - _classCallCheck(this, DomainLockNodesGroup); - - var _this = _possibleConstructorReturn(this, (DomainLockNodesGroup.__proto__ || Object.getPrototypeOf(DomainLockNodesGroup)).call(this, options)); - - if (!_this.options.domainLock.length) { - return _possibleConstructorReturn(_this); - } - _this.nodes.set('DomainLockNode', new DomainLockNode_1.DomainLockNode(_this.options)); - return _this; - } - - return DomainLockNodesGroup; -}(AbstractNodesGroup_1.AbstractNodesGroup); - -exports.DomainLockNodesGroup = DomainLockNodesGroup; - /***/ }, /* 44 */ /***/ function(module, exports, __webpack_require__) { @@ -2544,28 +2607,33 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var AbstractNodesGroup_1 = __webpack_require__(10); -var SelfDefendingUnicodeNode_1 = __webpack_require__(37); +var AbstractNodesGroup_1 = __webpack_require__(11); +var NodeAppender_1 = __webpack_require__(3); +var DomainLockNode_1 = __webpack_require__(37); +var NodeCallsControllerFunctionNode_1 = __webpack_require__(16); -var SelfDefendingNodesGroup = function (_AbstractNodesGroup_) { - _inherits(SelfDefendingNodesGroup, _AbstractNodesGroup_); +var DomainLockNodesGroup = function (_AbstractNodesGroup_) { + _inherits(DomainLockNodesGroup, _AbstractNodesGroup_); - function SelfDefendingNodesGroup(options) { - _classCallCheck(this, SelfDefendingNodesGroup); + function DomainLockNodesGroup(stackTraceData, options) { + _classCallCheck(this, DomainLockNodesGroup); - var _this = _possibleConstructorReturn(this, (SelfDefendingNodesGroup.__proto__ || Object.getPrototypeOf(SelfDefendingNodesGroup)).call(this, options)); + var _this = _possibleConstructorReturn(this, (DomainLockNodesGroup.__proto__ || Object.getPrototypeOf(DomainLockNodesGroup)).call(this, stackTraceData, options)); - if (!_this.options.selfDefending) { + if (!_this.options.domainLock.length) { return _possibleConstructorReturn(_this); } - _this.nodes.set('selfDefendingUnicodeNode', new SelfDefendingUnicodeNode_1.SelfDefendingUnicodeNode(_this.options)); + var callsControllerFunctionName = 'domainLockCallsControllerFunction'; + var randomStackTraceIndex = NodeAppender_1.NodeAppender.getRandomStackTraceIndex(_this.stackTraceData.length); + _this.nodes.set('DomainLockNode', new DomainLockNode_1.DomainLockNode(_this.stackTraceData, callsControllerFunctionName, randomStackTraceIndex, _this.options)); + _this.nodes.set('DomainLockNodeCallsControllerFunctionNode', new NodeCallsControllerFunctionNode_1.NodeCallsControllerFunctionNode(_this.stackTraceData, callsControllerFunctionName, randomStackTraceIndex, _this.options)); return _this; } - return SelfDefendingNodesGroup; + return DomainLockNodesGroup; }(AbstractNodesGroup_1.AbstractNodesGroup); -exports.SelfDefendingNodesGroup = SelfDefendingNodesGroup; +exports.DomainLockNodesGroup = DomainLockNodesGroup; /***/ }, /* 45 */ @@ -2580,20 +2648,61 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var AbstractNodesGroup_1 = __webpack_require__(10); -var UnicodeArray_1 = __webpack_require__(29); -var UnicodeArrayCallsWrapper_1 = __webpack_require__(38); -var UnicodeArrayNode_1 = __webpack_require__(39); -var UnicodeArrayRotateFunctionNode_1 = __webpack_require__(40); +var AbstractNodesGroup_1 = __webpack_require__(11); +var NodeAppender_1 = __webpack_require__(3); +var NodeCallsControllerFunctionNode_1 = __webpack_require__(16); +var SelfDefendingUnicodeNode_1 = __webpack_require__(38); + +var SelfDefendingNodesGroup = function (_AbstractNodesGroup_) { + _inherits(SelfDefendingNodesGroup, _AbstractNodesGroup_); + + function SelfDefendingNodesGroup(stackTraceData, options) { + _classCallCheck(this, SelfDefendingNodesGroup); + + var _this = _possibleConstructorReturn(this, (SelfDefendingNodesGroup.__proto__ || Object.getPrototypeOf(SelfDefendingNodesGroup)).call(this, stackTraceData, options)); + + if (!_this.options.selfDefending) { + return _possibleConstructorReturn(_this); + } + var callsControllerFunctionName = 'domainLockCallsControllerFunction'; + var randomStackTraceIndex = NodeAppender_1.NodeAppender.getRandomStackTraceIndex(_this.stackTraceData.length); + _this.nodes.set('selfDefendingUnicodeNode', new SelfDefendingUnicodeNode_1.SelfDefendingUnicodeNode(_this.stackTraceData, callsControllerFunctionName, randomStackTraceIndex, _this.options)); + _this.nodes.set('SelfDefendingNodeCallsControllerFunctionNode', new NodeCallsControllerFunctionNode_1.NodeCallsControllerFunctionNode(_this.stackTraceData, callsControllerFunctionName, randomStackTraceIndex, _this.options)); + return _this; + } + + return SelfDefendingNodesGroup; +}(AbstractNodesGroup_1.AbstractNodesGroup); + +exports.SelfDefendingNodesGroup = SelfDefendingNodesGroup; + +/***/ }, +/* 46 */ +/***/ function(module, exports, __webpack_require__) { + +"use strict"; +"use strict"; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var AbstractNodesGroup_1 = __webpack_require__(11); +var UnicodeArray_1 = __webpack_require__(30); +var UnicodeArrayCallsWrapper_1 = __webpack_require__(39); +var UnicodeArrayNode_1 = __webpack_require__(40); +var UnicodeArrayRotateFunctionNode_1 = __webpack_require__(41); var Utils_1 = __webpack_require__(0); var UnicodeArrayNodesGroup = function (_AbstractNodesGroup_) { _inherits(UnicodeArrayNodesGroup, _AbstractNodesGroup_); - function UnicodeArrayNodesGroup(options) { + function UnicodeArrayNodesGroup(stackTraceData, options) { _classCallCheck(this, UnicodeArrayNodesGroup); - var _this = _possibleConstructorReturn(this, (UnicodeArrayNodesGroup.__proto__ || Object.getPrototypeOf(UnicodeArrayNodesGroup)).call(this, options)); + var _this = _possibleConstructorReturn(this, (UnicodeArrayNodesGroup.__proto__ || Object.getPrototypeOf(UnicodeArrayNodesGroup)).call(this, stackTraceData, options)); _this.unicodeArrayName = Utils_1.Utils.getRandomVariableName(UnicodeArrayNode_1.UnicodeArrayNode.UNICODE_ARRAY_RANDOM_LENGTH); _this.unicodeArrayTranslatorName = Utils_1.Utils.getRandomVariableName(UnicodeArrayNode_1.UnicodeArrayNode.UNICODE_ARRAY_RANDOM_LENGTH); @@ -2624,7 +2733,7 @@ var UnicodeArrayNodesGroup = function (_AbstractNodesGroup_) { exports.UnicodeArrayNodesGroup = UnicodeArrayNodesGroup; /***/ }, -/* 46 */ +/* 47 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2638,10 +2747,10 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var estraverse = __webpack_require__(3); -var NodeType_1 = __webpack_require__(5); -var AbstractNodeObfuscator_1 = __webpack_require__(7); -var IdentifierReplacer_1 = __webpack_require__(14); +var estraverse = __webpack_require__(4); +var NodeType_1 = __webpack_require__(7); +var AbstractNodeObfuscator_1 = __webpack_require__(9); +var IdentifierReplacer_1 = __webpack_require__(15); var Nodes_1 = __webpack_require__(2); var NodeUtils_1 = __webpack_require__(1); @@ -2695,7 +2804,7 @@ var CatchClauseObfuscator = function (_AbstractNodeObfuscat) { exports.CatchClauseObfuscator = CatchClauseObfuscator; /***/ }, -/* 47 */ +/* 48 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2709,10 +2818,10 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var estraverse = __webpack_require__(3); -var NodeType_1 = __webpack_require__(5); -var AbstractNodeObfuscator_1 = __webpack_require__(7); -var IdentifierReplacer_1 = __webpack_require__(14); +var estraverse = __webpack_require__(4); +var NodeType_1 = __webpack_require__(7); +var AbstractNodeObfuscator_1 = __webpack_require__(9); +var IdentifierReplacer_1 = __webpack_require__(15); var Nodes_1 = __webpack_require__(2); var NodeUtils_1 = __webpack_require__(1); @@ -2770,7 +2879,7 @@ var FunctionDeclarationObfuscator = function (_AbstractNodeObfuscat) { exports.FunctionDeclarationObfuscator = FunctionDeclarationObfuscator; /***/ }, -/* 48 */ +/* 49 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2784,10 +2893,10 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var estraverse = __webpack_require__(3); -var NodeType_1 = __webpack_require__(5); -var AbstractNodeObfuscator_1 = __webpack_require__(7); -var IdentifierReplacer_1 = __webpack_require__(14); +var estraverse = __webpack_require__(4); +var NodeType_1 = __webpack_require__(7); +var AbstractNodeObfuscator_1 = __webpack_require__(9); +var IdentifierReplacer_1 = __webpack_require__(15); var Nodes_1 = __webpack_require__(2); var NodeUtils_1 = __webpack_require__(1); @@ -2851,7 +2960,7 @@ var FunctionObfuscator = function (_AbstractNodeObfuscat) { exports.FunctionObfuscator = FunctionObfuscator; /***/ }, -/* 49 */ +/* 50 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2867,12 +2976,12 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var escodegen = __webpack_require__(11); -var AbstractNodeObfuscator_1 = __webpack_require__(7); -var BooleanLiteralReplacer_1 = __webpack_require__(54); +var escodegen = __webpack_require__(12); +var AbstractNodeObfuscator_1 = __webpack_require__(9); +var BooleanLiteralReplacer_1 = __webpack_require__(55); var Nodes_1 = __webpack_require__(2); -var NumberLiteralReplacer_1 = __webpack_require__(21); -var StringLiteralReplacer_1 = __webpack_require__(17); +var NumberLiteralReplacer_1 = __webpack_require__(22); +var StringLiteralReplacer_1 = __webpack_require__(18); var LiteralObfuscator = function (_AbstractNodeObfuscat) { _inherits(LiteralObfuscator, _AbstractNodeObfuscat); @@ -2916,7 +3025,7 @@ var LiteralObfuscator = function (_AbstractNodeObfuscat) { exports.LiteralObfuscator = LiteralObfuscator; /***/ }, -/* 50 */ +/* 51 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -2930,12 +3039,12 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var escodegen = __webpack_require__(11); -var estraverse = __webpack_require__(3); -var NodeType_1 = __webpack_require__(5); -var AbstractNodeObfuscator_1 = __webpack_require__(7); +var escodegen = __webpack_require__(12); +var estraverse = __webpack_require__(4); +var NodeType_1 = __webpack_require__(7); +var AbstractNodeObfuscator_1 = __webpack_require__(9); var Nodes_1 = __webpack_require__(2); -var StringLiteralReplacer_1 = __webpack_require__(17); +var StringLiteralReplacer_1 = __webpack_require__(18); var MemberExpressionObfuscator = function (_AbstractNodeObfuscat) { _inherits(MemberExpressionObfuscator, _AbstractNodeObfuscat); @@ -3001,7 +3110,7 @@ var MemberExpressionObfuscator = function (_AbstractNodeObfuscat) { exports.MemberExpressionObfuscator = MemberExpressionObfuscator; /***/ }, -/* 51 */ +/* 52 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3015,11 +3124,11 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var estraverse = __webpack_require__(3); -var AbstractNodeObfuscator_1 = __webpack_require__(7); +var estraverse = __webpack_require__(4); +var AbstractNodeObfuscator_1 = __webpack_require__(9); var Nodes_1 = __webpack_require__(2); var Utils_1 = __webpack_require__(0); -var StringLiteralReplacer_1 = __webpack_require__(17); +var StringLiteralReplacer_1 = __webpack_require__(18); var MethodDefinitionObfuscator = function (_AbstractNodeObfuscat) { _inherits(MethodDefinitionObfuscator, _AbstractNodeObfuscat); @@ -3062,7 +3171,7 @@ var MethodDefinitionObfuscator = function (_AbstractNodeObfuscat) { exports.MethodDefinitionObfuscator = MethodDefinitionObfuscator; /***/ }, -/* 52 */ +/* 53 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3076,10 +3185,10 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var escodegen = __webpack_require__(11); -var estraverse = __webpack_require__(3); -var NodeType_1 = __webpack_require__(5); -var AbstractNodeObfuscator_1 = __webpack_require__(7); +var escodegen = __webpack_require__(12); +var estraverse = __webpack_require__(4); +var NodeType_1 = __webpack_require__(7); +var AbstractNodeObfuscator_1 = __webpack_require__(9); var Nodes_1 = __webpack_require__(2); var Utils_1 = __webpack_require__(0); @@ -3148,7 +3257,7 @@ var ObjectExpressionObfuscator = function (_AbstractNodeObfuscat) { exports.ObjectExpressionObfuscator = ObjectExpressionObfuscator; /***/ }, -/* 53 */ +/* 54 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3162,10 +3271,10 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var estraverse = __webpack_require__(3); -var NodeType_1 = __webpack_require__(5); -var AbstractNodeObfuscator_1 = __webpack_require__(7); -var IdentifierReplacer_1 = __webpack_require__(14); +var estraverse = __webpack_require__(4); +var NodeType_1 = __webpack_require__(7); +var AbstractNodeObfuscator_1 = __webpack_require__(9); +var IdentifierReplacer_1 = __webpack_require__(15); var Nodes_1 = __webpack_require__(2); var NodeUtils_1 = __webpack_require__(1); @@ -3225,7 +3334,7 @@ var VariableDeclarationObfuscator = function (_AbstractNodeObfuscat) { exports.VariableDeclarationObfuscator = VariableDeclarationObfuscator; /***/ }, -/* 54 */ +/* 55 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3239,8 +3348,8 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var JSFuck_1 = __webpack_require__(20); -var AbstractReplacer_1 = __webpack_require__(13); +var JSFuck_1 = __webpack_require__(21); +var AbstractReplacer_1 = __webpack_require__(14); var BooleanLiteralReplacer = function (_AbstractReplacer_1$A) { _inherits(BooleanLiteralReplacer, _AbstractReplacer_1$A); @@ -3264,7 +3373,7 @@ var BooleanLiteralReplacer = function (_AbstractReplacer_1$A) { exports.BooleanLiteralReplacer = BooleanLiteralReplacer; /***/ }, -/* 55 */ +/* 56 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3285,12 +3394,12 @@ var __decorate = undefined && undefined.__decorate || function (decorators, targ var __metadata = undefined && undefined.__metadata || function (k, v) { if ((typeof Reflect === "undefined" ? "undefined" : _typeof(Reflect)) === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; -var class_validator_1 = __webpack_require__(80); -var TSourceMapMode_1 = __webpack_require__(77); -var TUnicodeArrayEncoding_1 = __webpack_require__(78); -var DefaultPreset_1 = __webpack_require__(22); -var OptionsNormalizer_1 = __webpack_require__(56); -var ValidationErrorsFormatter_1 = __webpack_require__(57); +var class_validator_1 = __webpack_require__(82); +var TSourceMapMode_1 = __webpack_require__(79); +var TUnicodeArrayEncoding_1 = __webpack_require__(80); +var DefaultPreset_1 = __webpack_require__(23); +var OptionsNormalizer_1 = __webpack_require__(57); +var ValidationErrorsFormatter_1 = __webpack_require__(58); var Options = function Options(obfuscatorOptions) { _classCallCheck(this, Options); @@ -3336,7 +3445,7 @@ exports.Options = Options; var _a, _b; /***/ }, -/* 56 */ +/* 57 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3503,7 +3612,7 @@ OptionsNormalizer.normalizerRules = [OptionsNormalizer.domainLockRule, OptionsNo exports.OptionsNormalizer = OptionsNormalizer; /***/ }, -/* 57 */ +/* 58 */ /***/ function(module, exports) { "use strict"; @@ -3570,7 +3679,7 @@ var ValidationErrorsFormatter = function () { exports.ValidationErrorsFormatter = ValidationErrorsFormatter; /***/ }, -/* 58 */ +/* 59 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3580,11 +3689,11 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var estraverse = __webpack_require__(3); -var NodeType_1 = __webpack_require__(5); -var FunctionDeclarationCalleeDataExtractor_1 = __webpack_require__(59); -var FunctionExpressionCalleeDataExtractor_1 = __webpack_require__(60); -var ObjectExpressionCalleeDataExtractor_1 = __webpack_require__(61); +var estraverse = __webpack_require__(4); +var NodeType_1 = __webpack_require__(7); +var FunctionDeclarationCalleeDataExtractor_1 = __webpack_require__(60); +var FunctionExpressionCalleeDataExtractor_1 = __webpack_require__(61); +var ObjectExpressionCalleeDataExtractor_1 = __webpack_require__(62); var Nodes_1 = __webpack_require__(2); var NodeUtils_1 = __webpack_require__(1); @@ -3663,7 +3772,7 @@ StackTraceAnalyzer.limitThreshold = 0.002; exports.StackTraceAnalyzer = StackTraceAnalyzer; /***/ }, -/* 59 */ +/* 60 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3673,7 +3782,7 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var estraverse = __webpack_require__(3); +var estraverse = __webpack_require__(4); var Nodes_1 = __webpack_require__(2); var NodeUtils_1 = __webpack_require__(1); @@ -3722,7 +3831,7 @@ var FunctionDeclarationCalleeDataExtractor = function () { exports.FunctionDeclarationCalleeDataExtractor = FunctionDeclarationCalleeDataExtractor; /***/ }, -/* 60 */ +/* 61 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3732,7 +3841,7 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var estraverse = __webpack_require__(3); +var estraverse = __webpack_require__(4); var Nodes_1 = __webpack_require__(2); var NodeUtils_1 = __webpack_require__(1); @@ -3784,7 +3893,7 @@ var FunctionExpressionCalleeDataExtractor = function () { exports.FunctionExpressionCalleeDataExtractor = FunctionExpressionCalleeDataExtractor; /***/ }, -/* 61 */ +/* 62 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3794,7 +3903,7 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var estraverse = __webpack_require__(3); +var estraverse = __webpack_require__(4); var Nodes_1 = __webpack_require__(2); var NodeUtils_1 = __webpack_require__(1); @@ -3915,7 +4024,7 @@ var ObjectExpressionCalleeDataExtractor = function () { exports.ObjectExpressionCalleeDataExtractor = ObjectExpressionCalleeDataExtractor; /***/ }, -/* 62 */ +/* 63 */ /***/ function(module, exports) { "use strict"; @@ -3927,7 +4036,7 @@ function AtobTemplate() { exports.AtobTemplate = AtobTemplate; /***/ }, -/* 63 */ +/* 64 */ /***/ function(module, exports) { "use strict"; @@ -3939,7 +4048,19 @@ function Rc4Template() { exports.Rc4Template = Rc4Template; /***/ }, -/* 64 */ +/* 65 */ +/***/ function(module, exports) { + +"use strict"; +"use strict"; + +function SingleNodeCallControllerTemplate() { + return "\n var {singleNodeCallControllerFunctionName} = (function(){\n var firstCall = true;\n \n return function (context, fn){\t\n var rfn = firstCall ? function(){\n if(fn){\n var res = fn.apply(context, arguments);\n fn = null;\n return res;\n }\n } : function(){}\n \n firstCall = false;\n \n return rfn;\n }\n })();\n "; +} +exports.SingleNodeCallControllerTemplate = SingleNodeCallControllerTemplate; + +/***/ }, +/* 66 */ /***/ function(module, exports) { "use strict"; @@ -3951,7 +4072,7 @@ function ConsoleOutputDisableExpressionTemplate() { exports.ConsoleOutputDisableExpressionTemplate = ConsoleOutputDisableExpressionTemplate; /***/ }, -/* 65 */ +/* 67 */ /***/ function(module, exports) { "use strict"; @@ -3963,7 +4084,7 @@ function DebugProtectionFunctionCallTemplate() { exports.DebugProtectionFunctionCallTemplate = DebugProtectionFunctionCallTemplate; /***/ }, -/* 66 */ +/* 68 */ /***/ function(module, exports) { "use strict"; @@ -3975,7 +4096,7 @@ function DebugProtectionFunctionIntervalTemplate() { exports.DebugProtectionFunctionIntervalTemplate = DebugProtectionFunctionIntervalTemplate; /***/ }, -/* 67 */ +/* 69 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -3988,19 +4109,19 @@ function DebugProtectionFunctionTemplate() { exports.DebugProtectionFunctionTemplate = DebugProtectionFunctionTemplate; /***/ }, -/* 68 */ +/* 70 */ /***/ function(module, exports) { "use strict"; "use strict"; function DomainLockNodeTemplate() { - return "\n var {domainLockFunctionName} = function () {\n var getGlobal = function () {\n if (typeof self !== 'undefined') { return self; }\n if (typeof window !== 'undefined') { return window; }\n if (typeof global !== 'undefined') { return global; }\n };\n \n var func = function () { \n return {\n key: 'item',\n value: 'attribute',\n getAttribute: function () {\n getGlobal()['eval']('while(true){}')();\n }()\n };\n };\n \n if (\n !getGlobal().promisePolyfillActivationFlag ||\n !getGlobal().promisePolyfillActivationFlag.isActive\n ) { \n getGlobal().promisePolyfillActivationFlag = {\n isActive: true\n };\n \n var regExp = new RegExp(\"[{diff}]\", \"g\");\n var domains = \"{domains}\".replace(regExp, \"\").split(\";\");\n var eval = [][\"forEach\"][\"constructor\"];\n var window = eval(\"return this\")();\n \n for (var d in window) {\n if (d.length == 8 && d.charCodeAt(7) == 116 && d.charCodeAt(5) == 101 && d.charCodeAt(3) == 117 && d.charCodeAt(0) == 100) {\n break;\n }\n }\n \n for (var d1 in window[d]) {\n if (d1.length == 6 && d1.charCodeAt(5) == 110 && d1.charCodeAt(0) == 100) {\n break;\n }\n }\n \n var currentDomain = window[d][d1];\n \n if (!currentDomain) {\n return;\n }\n \n var ok = false;\n \n for (var i = 0; i < domains.length; i++) {\n var domain = domains[i];\n var position = currentDomain.length - domain.length;\n var lastIndex = currentDomain.indexOf(domain, position);\n var endsWith = lastIndex !== -1 && lastIndex === position;\n \n if (endsWith) {\n if (currentDomain.length == domain.length || domain.indexOf(\".\") === 0) {\n ok = true;\n }\n \n break;\n }\n }\n \n if (!ok) {\n data;\n } else {\n return;\n }\n \n func();\n }\n };\n \n {domainLockFunctionName}();\n "; + return "\n var {domainLockFunctionName} = {singleNodeCallControllerFunctionName}(this, function () {\n var getGlobal = function () {\n if (typeof self !== 'undefined') { return self; }\n if (typeof window !== 'undefined') { return window; }\n if (typeof global !== 'undefined') { return global; }\n };\n \n var func = function () { \n return {\n key: 'item',\n value: 'attribute',\n getAttribute: function () {\n getGlobal()['eval']('while(true){}')();\n }()\n };\n };\n \n var regExp = new RegExp(\"[{diff}]\", \"g\");\n var domains = \"{domains}\".replace(regExp, \"\").split(\";\");\n var eval = [][\"forEach\"][\"constructor\"];\n var windowObject = eval(\"return this\")();\n var document;\n var domain;\n \n for (var d in windowObject) {\n if (d.length == 8 && d.charCodeAt(7) == 116 && d.charCodeAt(5) == 101 && d.charCodeAt(3) == 117 && d.charCodeAt(0) == 100) {\n document = d;\n \n break;\n }\n }\n\n for (var d1 in windowObject[document]) {\n if (d1.length == 6 && d1.charCodeAt(5) == 110 && d1.charCodeAt(0) == 100) {\n domain = d1;\n \n break;\n }\n }\n \n if ((!document && !domain) || (!windowObject[document] && !windowObject[document][domain])) {\n return;\n }\n \n var currentDomain = windowObject[document][domain];\n\n var ok = false;\n \n for (var i = 0; i < domains.length; i++) {\n var domain = domains[i];\n var position = currentDomain.length - domain.length;\n var lastIndex = currentDomain.indexOf(domain, position);\n var endsWith = lastIndex !== -1 && lastIndex === position;\n \n if (endsWith) {\n if (currentDomain.length == domain.length || domain.indexOf(\".\") === 0) {\n ok = true;\n }\n \n break;\n }\n }\n \n if (!ok) {\n data;\n } else {\n return;\n }\n \n func();\n });\n\n {domainLockFunctionName}();\n "; } exports.DomainLockNodeTemplate = DomainLockNodeTemplate; /***/ }, -/* 69 */ +/* 71 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -4013,7 +4134,7 @@ function SelfDefendingTemplate() { exports.SelfDefendingTemplate = SelfDefendingTemplate; /***/ }, -/* 70 */ +/* 72 */ /***/ function(module, exports) { "use strict"; @@ -4025,7 +4146,7 @@ function SelfDefendingTemplate() { exports.SelfDefendingTemplate = SelfDefendingTemplate; /***/ }, -/* 71 */ +/* 73 */ /***/ function(module, exports) { "use strict"; @@ -4037,7 +4158,7 @@ function UnicodeArrayBase64DecodeNodeTemplate() { exports.UnicodeArrayBase64DecodeNodeTemplate = UnicodeArrayBase64DecodeNodeTemplate; /***/ }, -/* 72 */ +/* 74 */ /***/ function(module, exports) { "use strict"; @@ -4049,7 +4170,7 @@ function UnicodeArrayCallsWrapperTemplate() { exports.UnicodeArrayCallsWrapperTemplate = UnicodeArrayCallsWrapperTemplate; /***/ }, -/* 73 */ +/* 75 */ /***/ function(module, exports) { "use strict"; @@ -4061,7 +4182,7 @@ function UnicodeArrayRc4DecodeNodeTemplate() { exports.UnicodeArrayRc4DecodeNodeTemplate = UnicodeArrayRc4DecodeNodeTemplate; /***/ }, -/* 74 */ +/* 76 */ /***/ function(module, exports) { "use strict"; @@ -4073,7 +4194,7 @@ function UnicodeArrayTemplate() { exports.UnicodeArrayTemplate = UnicodeArrayTemplate; /***/ }, -/* 75 */ +/* 77 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -4086,7 +4207,7 @@ function SelfDefendingTemplate() { exports.SelfDefendingTemplate = SelfDefendingTemplate; /***/ }, -/* 76 */ +/* 78 */ /***/ function(module, exports) { "use strict"; @@ -4097,61 +4218,61 @@ function UnicodeArrayRotateFunctionTemplate() { } exports.UnicodeArrayRotateFunctionTemplate = UnicodeArrayRotateFunctionTemplate; -/***/ }, -/* 77 */ -/***/ function(module, exports) { - -"use strict"; -"use strict"; - -/***/ }, -/* 78 */ -/***/ function(module, exports) { - -"use strict"; -"use strict"; - /***/ }, /* 79 */ /***/ function(module, exports) { -module.exports = require("chance"); +"use strict"; +"use strict"; /***/ }, /* 80 */ /***/ function(module, exports) { -module.exports = require("class-validator"); +"use strict"; +"use strict"; /***/ }, /* 81 */ /***/ function(module, exports) { -module.exports = require("commander"); +module.exports = require("chance"); /***/ }, /* 82 */ /***/ function(module, exports) { -module.exports = require("fs"); +module.exports = require("class-validator"); /***/ }, /* 83 */ /***/ function(module, exports) { +module.exports = require("commander"); + +/***/ }, +/* 84 */ +/***/ function(module, exports) { + +module.exports = require("fs"); + +/***/ }, +/* 85 */ +/***/ function(module, exports) { + module.exports = require("mkdirp"); /***/ }, -/* 84 */, -/* 85 */ +/* 86 */, +/* 87 */ /***/ function(module, exports, __webpack_require__) { "use strict"; "use strict"; -var JavaScriptObfuscator_1 = __webpack_require__(9); +var JavaScriptObfuscator_1 = __webpack_require__(10); if (!global._babelPolyfill) { - __webpack_require__(25); + __webpack_require__(26); } module.exports = JavaScriptObfuscator_1.JavaScriptObfuscator; diff --git a/src/NodeAppender.ts b/src/NodeAppender.ts new file mode 100644 index 00000000..e07a6831 --- /dev/null +++ b/src/NodeAppender.ts @@ -0,0 +1,177 @@ +import * as ESTree from 'estree'; + +import { TNodeWithBlockStatement } from './types/TNodeWithBlockStatement'; +import { TStatement } from './types/TStatement'; + +import { IStackTraceData } from './interfaces/stack-trace-analyzer/IStackTraceData'; + +import { Utils } from './Utils'; + +/** + * This class appends node into a first deepest BlockStatement in order of function calls + * + * For example: + * + * function Foo () { + * var baz = function () { + * + * } + * + * baz(); + * } + * + * foo(); + * + * Appends node into block statement of `baz` function expression. + */ +export class NodeAppender { + /** + * @param blockScopeNode + * @param nodeBodyStatements + */ + public static appendNode ( + blockScopeNode: TNodeWithBlockStatement, + nodeBodyStatements: TStatement[] + ): void { + if (!NodeAppender.validateBodyStatements(nodeBodyStatements)) { + nodeBodyStatements = []; + } + + nodeBodyStatements = NodeAppender.parentizeBodyStatementsBeforeAppend(blockScopeNode, nodeBodyStatements); + + blockScopeNode.body = [ + ...blockScopeNode.body, + ...nodeBodyStatements + ]; + } + + /** + * @param blockScopeStackTraceData + * @param blockScopeNode + * @param nodeBodyStatements + * @param index + */ + public static appendNodeToOptimalBlockScope ( + blockScopeStackTraceData: IStackTraceData[], + blockScopeNode: TNodeWithBlockStatement, + nodeBodyStatements: TStatement[], + index: number = 0 + ): void { + let targetBlockScope: TNodeWithBlockStatement; + + if (!blockScopeStackTraceData.length) { + targetBlockScope = blockScopeNode; + } else { + targetBlockScope = NodeAppender.getOptimalBlockScope( + blockScopeStackTraceData, + index + ); + } + + NodeAppender.prependNode(targetBlockScope, nodeBodyStatements); + } + + /** + * Returns deepest block scope node at given deep. + * + * @param blockScopeTraceData + * @param index + * @param deep + * @returns {ESTree.BlockStatement} + */ + public static getOptimalBlockScope ( + blockScopeTraceData: IStackTraceData[], + index: number, + deep: number = Infinity + ): ESTree.BlockStatement { + const firstCall: IStackTraceData = blockScopeTraceData[index]; + + if (deep <= 0) { + throw new Error(`Invalid \`deep\` argument value. Value should be bigger then 0.`); + } + + if (deep > 1 && firstCall.stackTrace.length) { + return NodeAppender.getOptimalBlockScope(firstCall.stackTrace, 0, --deep); + } else { + return firstCall.callee; + } + } + + /** + * @param stackTraceRootLength + */ + public static getRandomStackTraceIndex (stackTraceRootLength: number): number { + return Utils.getRandomGenerator().integer({ + min: 0, + max: Math.max(0, Math.round(stackTraceRootLength - 1)) + }); + } + + /** + * @param blockScopeNode + * @param nodeBodyStatements + * @param index + */ + public static insertNodeAtIndex ( + blockScopeNode: TNodeWithBlockStatement, + nodeBodyStatements: TStatement[], + index: number + ): void { + if (!NodeAppender.validateBodyStatements(nodeBodyStatements)) { + nodeBodyStatements = []; + } + + nodeBodyStatements = NodeAppender.parentizeBodyStatementsBeforeAppend(blockScopeNode, nodeBodyStatements); + + blockScopeNode.body = [ + ...blockScopeNode.body.slice(0, index), + ...nodeBodyStatements, + ...blockScopeNode.body.slice(index) + ]; + } + + /** + * @param blockScopeNode + * @param nodeBodyStatements + */ + public static prependNode ( + blockScopeNode: TNodeWithBlockStatement, + nodeBodyStatements: TStatement[] + ): void { + if (!NodeAppender.validateBodyStatements(nodeBodyStatements)) { + nodeBodyStatements = []; + } + + nodeBodyStatements = NodeAppender.parentizeBodyStatementsBeforeAppend(blockScopeNode, nodeBodyStatements); + + blockScopeNode.body = [ + ...nodeBodyStatements, + ...blockScopeNode.body, + ]; + } + + /** + * @param blockScopeNode + * @param nodeBodyStatements + */ + private static parentizeBodyStatementsBeforeAppend ( + blockScopeNode: TNodeWithBlockStatement, + nodeBodyStatements: TStatement[] + ): TStatement[] { + for (let statement of nodeBodyStatements) { + statement.parentNode = blockScopeNode; + } + + return nodeBodyStatements; + } + + /** + * @param nodeBodyStatements + * @returns {boolean} + */ + private static validateBodyStatements (nodeBodyStatements: TStatement[]): boolean { + return nodeBodyStatements.every(statementNode => { + return !!statementNode && statementNode.hasOwnProperty('type'); + }); + } +} diff --git a/src/NodeUtils.ts b/src/NodeUtils.ts index d7073d39..597bdc3d 100644 --- a/src/NodeUtils.ts +++ b/src/NodeUtils.ts @@ -37,26 +37,6 @@ export class NodeUtils { }); } - /** - * @param blockScopeNode - * @param nodeBodyStatements - */ - public static appendNode ( - blockScopeNode: TNodeWithBlockStatement, - nodeBodyStatements: TStatement[] - ): void { - if (!NodeUtils.validateBodyStatements(nodeBodyStatements)) { - nodeBodyStatements = []; - } - - nodeBodyStatements = NodeUtils.parentizeBodyStatementsBeforeAppend(blockScopeNode, nodeBodyStatements); - - blockScopeNode.body = [ - ...blockScopeNode.body, - ...nodeBodyStatements - ]; - } - /** * @param code * @returns {TStatement[]} @@ -120,29 +100,6 @@ export class NodeUtils { return NodeUtils.getBlockScopeOfNode(parentNode); } - /** - * @param blockScopeNode - * @param nodeBodyStatements - * @param index - */ - public static insertNodeAtIndex ( - blockScopeNode: TNodeWithBlockStatement, - nodeBodyStatements: TStatement[], - index: number - ): void { - if (!NodeUtils.validateBodyStatements(nodeBodyStatements)) { - nodeBodyStatements = []; - } - - nodeBodyStatements = NodeUtils.parentizeBodyStatementsBeforeAppend(blockScopeNode, nodeBodyStatements); - - blockScopeNode.body = [ - ...blockScopeNode.body.slice(0, index), - ...nodeBodyStatements, - ...blockScopeNode.body.slice(index) - ]; - } - /** * @param node */ @@ -172,26 +129,6 @@ export class NodeUtils { }); } - /** - * @param blockScopeNode - * @param nodeBodyStatements - */ - public static prependNode ( - blockScopeNode: TNodeWithBlockStatement, - nodeBodyStatements: TStatement[] - ): void { - if (!NodeUtils.validateBodyStatements(nodeBodyStatements)) { - nodeBodyStatements = []; - } - - nodeBodyStatements = NodeUtils.parentizeBodyStatementsBeforeAppend(blockScopeNode, nodeBodyStatements); - - blockScopeNode.body = [ - ...nodeBodyStatements, - ...blockScopeNode.body, - ]; - } - /** * @param node * @param nodeType @@ -230,29 +167,4 @@ export class NodeUtils { } }); } - - /** - * @param blockScopeNode - * @param nodeBodyStatements - */ - private static parentizeBodyStatementsBeforeAppend ( - blockScopeNode: TNodeWithBlockStatement, - nodeBodyStatements: TStatement[] - ): TStatement[] { - for (let statement of nodeBodyStatements) { - statement.parentNode = blockScopeNode; - } - - return nodeBodyStatements; - } - - /** - * @param nodeBodyStatements - * @returns {boolean} - */ - private static validateBodyStatements (nodeBodyStatements: TStatement[]): boolean { - return nodeBodyStatements.every(statementNode => { - return !!statementNode && statementNode.hasOwnProperty('type'); - }); - } } diff --git a/src/Obfuscator.ts b/src/Obfuscator.ts index 7899b689..b8d95bff 100644 --- a/src/Obfuscator.ts +++ b/src/Obfuscator.ts @@ -3,6 +3,7 @@ import * as ESTree from 'estree'; import { ICustomNode } from './interfaces/custom-nodes/ICustomNode'; import { IObfuscator } from './interfaces/IObfuscator'; +import { INodesGroup } from './interfaces/INodesGroup'; import { IOptions } from './interfaces/IOptions'; import { IStackTraceData } from './interfaces/stack-trace-analyzer/IStackTraceData'; @@ -30,14 +31,20 @@ import { StackTraceAnalyzer } from './stack-trace-analyzer/StackTraceAnalyzer'; export class Obfuscator implements IObfuscator { /** - * @type {Map} + * @type {(new (stackTraceData: IStackTraceData[], options: IOptions) => INodesGroup)[]} */ - private nodes: Map ; + private static nodeGroups: (new (stackTraceData: IStackTraceData[], options: IOptions) => INodesGroup)[] = [ + DomainLockNodesGroup, + SelfDefendingNodesGroup, + ConsoleOutputNodesGroup, + DebugProtectionNodesGroup, + UnicodeArrayNodesGroup + ]; /** * @type {Map} */ - private nodeObfuscators: Map = new Map ([ + private static nodeObfuscators: Map = new Map ([ [NodeType.ArrowFunctionExpression, [FunctionObfuscator]], [NodeType.ClassDeclaration, [FunctionDeclarationObfuscator]], [NodeType.CatchClause, [CatchClauseObfuscator]], @@ -53,6 +60,11 @@ export class Obfuscator implements IObfuscator { [NodeType.Literal, [LiteralObfuscator]] ]); + /** + * @type {Map} + */ + private customNodes: Map = new Map (); + /** * @type {IOptions} */ @@ -63,14 +75,6 @@ export class Obfuscator implements IObfuscator { */ constructor (options: IOptions) { this.options = options; - - this.nodes = new Map ([ - ...new DomainLockNodesGroup(this.options).getNodes(), - ...new SelfDefendingNodesGroup(this.options).getNodes(), - ...new ConsoleOutputNodesGroup(this.options).getNodes(), - ...new DebugProtectionNodesGroup(this.options).getNodes(), - ...new UnicodeArrayNodesGroup(this.options).getNodes() - ]); } /** @@ -86,51 +90,63 @@ export class Obfuscator implements IObfuscator { const stackTraceData: IStackTraceData[] = new StackTraceAnalyzer(node.body).analyze(); - this.beforeObfuscation(node, stackTraceData); + this.initializeCustomNodes(stackTraceData); + + this.beforeObfuscation(node); this.obfuscate(node); - this.afterObfuscation(node, stackTraceData); + this.afterObfuscation(node); return node; } /** * @param astTree - * @param stackTraceData */ - private afterObfuscation (astTree: ESTree.Node, stackTraceData: IStackTraceData[]): void { - this.nodes.forEach((node: ICustomNode) => { + private afterObfuscation (astTree: ESTree.Node): void { + this.customNodes.forEach((node: ICustomNode) => { if (node.getAppendState() === AppendState.AfterObfuscation) { - node.appendNode(astTree, stackTraceData); + node.appendNode(astTree); } }); } /** * @param astTree - * @param stackTraceData */ - private beforeObfuscation (astTree: ESTree.Node, stackTraceData: IStackTraceData[]): void { - this.nodes.forEach((node: ICustomNode) => { + private beforeObfuscation (astTree: ESTree.Node): void { + this.customNodes.forEach((node: ICustomNode) => { if (node.getAppendState() === AppendState.BeforeObfuscation) { - node.appendNode(astTree, stackTraceData); + node.appendNode(astTree); } }); }; + /** + * @param stackTraceData + */ + private initializeCustomNodes (stackTraceData: IStackTraceData[]): void { + Obfuscator.nodeGroups.map((nodeGroupConstructor) => { + this.customNodes = new Map ([ + ...this.customNodes, + ...new nodeGroupConstructor(stackTraceData, this.options).getNodes() + ]); + }); + } + /** * @param node * @param parentNode */ private initializeNodeObfuscators (node: ESTree.Node, parentNode: ESTree.Node): void { - let nodeObfuscators: TNodeObfuscator[] | undefined = this.nodeObfuscators.get(node.type); + let nodeObfuscators: TNodeObfuscator[] | undefined = Obfuscator.nodeObfuscators.get(node.type); if (!nodeObfuscators) { return; } nodeObfuscators.forEach((obfuscator: TNodeObfuscator) => { - new obfuscator(this.nodes, this.options).obfuscateNode(node, parentNode); + new obfuscator(this.customNodes, this.options).obfuscateNode(node, parentNode); }); } diff --git a/src/custom-nodes/AbstractCustomNode.ts b/src/custom-nodes/AbstractCustomNode.ts index 2af9fd0e..39c49c76 100644 --- a/src/custom-nodes/AbstractCustomNode.ts +++ b/src/custom-nodes/AbstractCustomNode.ts @@ -1,10 +1,8 @@ import * as ESTree from 'estree'; -import { TStatement } from '../types/TStatement'; - import { ICustomNode } from '../interfaces/custom-nodes/ICustomNode'; import { IOptions } from '../interfaces/IOptions'; -import { IStackTraceData } from '../interfaces/stack-trace-analyzer/IStackTraceData'; +import { TStatement } from '../types/TStatement'; import { AppendState } from '../enums/AppendState'; @@ -28,9 +26,8 @@ export abstract class AbstractCustomNode implements ICustomNode { /** * @param astTree - * @param stackTraceData */ - public abstract appendNode (astTree: ESTree.Node, stackTraceData?: IStackTraceData[]): void; + public abstract appendNode (astTree: ESTree.Node): void; /** * @returns {AppendState} diff --git a/src/custom-nodes/CustomNodeAppender.ts b/src/custom-nodes/CustomNodeAppender.ts deleted file mode 100644 index 0a228d5e..00000000 --- a/src/custom-nodes/CustomNodeAppender.ts +++ /dev/null @@ -1,82 +0,0 @@ -import * as ESTree from 'estree'; - -import { TNodeWithBlockStatement } from '../types/TNodeWithBlockStatement'; -import { TStatement } from '../types/TStatement'; - -import { IStackTraceData } from '../interfaces/stack-trace-analyzer/IStackTraceData'; - -import { NodeUtils } from '../NodeUtils'; -import { Utils } from '../Utils'; - -/** - * This class appends node into a first deepest BlockStatement in order of function calls - * - * For example: - * - * function Foo () { - * var baz = function () { - * - * } - * - * baz(); - * } - * - * foo(); - * - * Appends node into block statement of `baz` function expression. - */ -export class CustomNodeAppender { - /** - * @param blockScopeStackTraceData - * @param blockScopeNode - * @param nodeBodyStatements - * @param index - */ - public static appendNode ( - blockScopeStackTraceData: IStackTraceData[], - blockScopeNode: TNodeWithBlockStatement, - nodeBodyStatements: TStatement[], - index: number = 0 - ): void { - let targetBlockScope: TNodeWithBlockStatement; - - if (!blockScopeStackTraceData.length) { - targetBlockScope = blockScopeNode; - } else { - targetBlockScope = CustomNodeAppender.getOptimalBlockScope( - blockScopeStackTraceData, - index - ); - } - - NodeUtils.prependNode(targetBlockScope, nodeBodyStatements); - } - - /** - * @param stackTraceRootLength - */ - public static getRandomStackTraceIndex (stackTraceRootLength: number): number { - return Utils.getRandomGenerator().integer({ - min: 0, - max: Math.max(0, Math.round(stackTraceRootLength - 1)) - }); - } - - /** - * @param blockScopeTraceData - * @param index - * @returns {ESTree.BlockStatement} - */ - private static getOptimalBlockScope ( - blockScopeTraceData: IStackTraceData[], - index: number - ): ESTree.BlockStatement { - const firstCall: IStackTraceData = blockScopeTraceData[index]; - - if (firstCall.stackTrace.length) { - return CustomNodeAppender.getOptimalBlockScope(firstCall.stackTrace, 0); - } else { - return firstCall.callee; - } - } -} diff --git a/src/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.ts b/src/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.ts index d648822a..7f8ce481 100644 --- a/src/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.ts +++ b/src/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.ts @@ -1,9 +1,9 @@ import 'format-unicorn'; import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement'; - import { TStatement } from '../../types/TStatement'; +import { IOptions } from '../../interfaces/IOptions'; import { IStackTraceData } from '../../interfaces/stack-trace-analyzer/IStackTraceData'; import { AppendState } from '../../enums/AppendState'; @@ -11,7 +11,7 @@ import { AppendState } from '../../enums/AppendState'; import { ConsoleOutputDisableExpressionTemplate } from '../../templates/custom-nodes/console-output-nodes/console-output-disable-expression-node/ConsoleOutputDisableExpressionTemplate'; import { AbstractCustomNode } from '../AbstractCustomNode'; -import { CustomNodeAppender } from '../CustomNodeAppender'; +import { NodeAppender } from '../../NodeAppender'; import { NodeUtils } from '../../NodeUtils'; import { Utils } from '../../Utils'; @@ -22,15 +22,48 @@ export class ConsoleOutputDisableExpressionNode extends AbstractCustomNode { protected appendState: AppendState = AppendState.BeforeObfuscation; /** - * @param blockScopeNode - * @param stackTraceData + * @type {string} */ - public appendNode (blockScopeNode: TNodeWithBlockStatement, stackTraceData: IStackTraceData[]): void { - CustomNodeAppender.appendNode( - stackTraceData, + protected callsControllerFunctionName: string; + + /** + * @type {number} + */ + protected randomStackTraceIndex: number; + + /** + * @type {IStackTraceData[]} + */ + protected stackTraceData: IStackTraceData[]; + + /** + * @param stackTraceData + * @param callsControllerFunctionName + * @param randomStackTraceIndex + * @param options + */ + constructor ( + stackTraceData: IStackTraceData[], + callsControllerFunctionName: string, + randomStackTraceIndex: number, + options: IOptions + ) { + super(options); + + this.stackTraceData = stackTraceData; + this.callsControllerFunctionName = callsControllerFunctionName; + this.randomStackTraceIndex = randomStackTraceIndex; + } + + /** + * @param blockScopeNode + */ + public appendNode (blockScopeNode: TNodeWithBlockStatement): void { + NodeAppender.appendNodeToOptimalBlockScope( + this.stackTraceData, blockScopeNode, this.getNode(), - CustomNodeAppender.getRandomStackTraceIndex(stackTraceData.length) + this.randomStackTraceIndex ); } diff --git a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionCallNode.ts b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionCallNode.ts index 5bb2323f..b4d4a233 100644 --- a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionCallNode.ts +++ b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionCallNode.ts @@ -10,6 +10,7 @@ import { AppendState } from '../../enums/AppendState'; import { DebugProtectionFunctionCallTemplate } from '../../templates/custom-nodes/debug-protection-nodes/debug-protection-function-call-node/DebufProtectionFunctionCallTemplate'; import { AbstractCustomNode } from '../AbstractCustomNode'; +import { NodeAppender } from '../../NodeAppender'; import { NodeUtils } from '../../NodeUtils'; export class DebugProtectionFunctionCallNode extends AbstractCustomNode { @@ -37,7 +38,7 @@ export class DebugProtectionFunctionCallNode extends AbstractCustomNode { * @param blockScopeNode */ public appendNode (blockScopeNode: TNodeWithBlockStatement): void { - NodeUtils.appendNode(blockScopeNode, this.getNode()); + NodeAppender.appendNode(blockScopeNode, this.getNode()); } /** diff --git a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionIntervalNode.ts b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionIntervalNode.ts index f7c36a9e..93c7ae14 100644 --- a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionIntervalNode.ts +++ b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionIntervalNode.ts @@ -10,6 +10,7 @@ import { AppendState } from '../../enums/AppendState'; import { DebugProtectionFunctionIntervalTemplate } from '../../templates/custom-nodes/debug-protection-nodes/debug-protection-function-interval-node/DebugProtectionFunctionIntervalTemplate'; import { AbstractCustomNode } from '../AbstractCustomNode'; +import { NodeAppender } from '../../NodeAppender'; import { NodeUtils } from '../../NodeUtils'; export class DebugProtectionFunctionIntervalNode extends AbstractCustomNode { @@ -37,7 +38,7 @@ export class DebugProtectionFunctionIntervalNode extends AbstractCustomNode { * @param blockScopeNode */ public appendNode (blockScopeNode: TNodeWithBlockStatement): void { - NodeUtils.appendNode(blockScopeNode, this.getNode()); + NodeAppender.appendNode(blockScopeNode, this.getNode()); } /** diff --git a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts index bd565aae..6d0668ac 100644 --- a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts +++ b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts @@ -10,6 +10,7 @@ import { AppendState } from '../../enums/AppendState'; import { DebugProtectionFunctionTemplate } from '../../templates/custom-nodes/debug-protection-nodes/debug-protection-function-node/DebugProtectionFunctionTemplate'; import { AbstractCustomNode } from '../AbstractCustomNode'; +import { NodeAppender } from '../../NodeAppender'; import { NodeUtils } from '../../NodeUtils'; import { Utils } from '../../Utils'; @@ -44,7 +45,7 @@ export class DebugProtectionFunctionNode extends AbstractCustomNode { max: programBodyLength }); - NodeUtils.insertNodeAtIndex(blockScopeNode, this.getNode(), randomIndex); + NodeAppender.insertNodeAtIndex(blockScopeNode, this.getNode(), randomIndex); } /** diff --git a/src/custom-nodes/domain-lock-nodes/DomainLockNode.ts b/src/custom-nodes/domain-lock-nodes/DomainLockNode.ts index e9066163..02e73d60 100644 --- a/src/custom-nodes/domain-lock-nodes/DomainLockNode.ts +++ b/src/custom-nodes/domain-lock-nodes/DomainLockNode.ts @@ -3,6 +3,7 @@ import 'format-unicorn'; import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement'; import { TStatement } from '../../types/TStatement'; +import { IOptions } from '../../interfaces/IOptions'; import { IStackTraceData } from '../../interfaces/stack-trace-analyzer/IStackTraceData'; import { AppendState } from '../../enums/AppendState'; @@ -10,7 +11,7 @@ import { AppendState } from '../../enums/AppendState'; import { DomainLockNodeTemplate } from '../../templates/custom-nodes/domain-lock-nodes/domain-lock-node/DomainLockNodeTemplate'; import { AbstractCustomNode } from '../AbstractCustomNode'; -import { CustomNodeAppender } from '../CustomNodeAppender'; +import { NodeAppender } from '../../NodeAppender'; import { NodeUtils } from '../../NodeUtils'; import { Utils } from '../../Utils'; @@ -21,15 +22,48 @@ export class DomainLockNode extends AbstractCustomNode { protected appendState: AppendState = AppendState.BeforeObfuscation; /** - * @param blockScopeNode - * @param stackTraceData + * @type {string} */ - public appendNode (blockScopeNode: TNodeWithBlockStatement, stackTraceData: IStackTraceData[]): void { - CustomNodeAppender.appendNode( - stackTraceData, + protected callsControllerFunctionName: string; + + /** + * @type {number} + */ + protected randomStackTraceIndex: number; + + /** + * @type {IStackTraceData[]} + */ + protected stackTraceData: IStackTraceData[]; + + /** + * @param stackTraceData + * @param callsControllerFunctionName + * @param randomStackTraceIndex + * @param options + */ + constructor ( + stackTraceData: IStackTraceData[], + callsControllerFunctionName: string, + randomStackTraceIndex: number, + options: IOptions + ) { + super(options); + + this.stackTraceData = stackTraceData; + this.callsControllerFunctionName = callsControllerFunctionName; + this.randomStackTraceIndex = randomStackTraceIndex; + } + + /** + * @param blockScopeNode + */ + public appendNode (blockScopeNode: TNodeWithBlockStatement): void { + NodeAppender.appendNodeToOptimalBlockScope( + this.stackTraceData, blockScopeNode, this.getNode(), - CustomNodeAppender.getRandomStackTraceIndex(stackTraceData.length) + this.randomStackTraceIndex ); } @@ -44,7 +78,8 @@ export class DomainLockNode extends AbstractCustomNode { DomainLockNodeTemplate().formatUnicorn({ domainLockFunctionName: Utils.getRandomVariableName(), diff: diff, - domains: hiddenDomainsString + domains: hiddenDomainsString, + singleNodeCallControllerFunctionName: this.callsControllerFunctionName }) ); } diff --git a/src/custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode.ts b/src/custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode.ts new file mode 100644 index 00000000..e136f3f1 --- /dev/null +++ b/src/custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode.ts @@ -0,0 +1,83 @@ +import 'format-unicorn'; + +import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement'; +import { TStatement } from '../../types/TStatement'; + +import { IOptions } from '../../interfaces/IOptions'; +import { IStackTraceData } from '../../interfaces/stack-trace-analyzer/IStackTraceData'; + +import { AppendState } from '../../enums/AppendState'; + +import { SingleNodeCallControllerTemplate } from '../../templates/custom-nodes/SingleNodeCallControllerTemplate'; + +import { AbstractCustomNode } from '../AbstractCustomNode'; +import { NodeAppender } from '../../NodeAppender'; +import { NodeUtils } from '../../NodeUtils'; + +export class NodeCallsControllerFunctionNode extends AbstractCustomNode { + /** + * @type {AppendState} + */ + protected appendState: AppendState = AppendState.BeforeObfuscation; + + /** + * @type {string} + */ + protected callsControllerFunctionName: string; + + /** + * @type {number} + */ + protected randomStackTraceIndex: number; + + /** + * @type {IStackTraceData[]} + */ + protected stackTraceData: IStackTraceData[]; + + /** + * @param stackTraceData + * @param callsControllerFunctionName + * @param randomStackTraceIndex + * @param options + */ + constructor ( + stackTraceData: IStackTraceData[], + callsControllerFunctionName: string, + randomStackTraceIndex: number, + options: IOptions + ) { + super(options); + + this.stackTraceData = stackTraceData; + this.callsControllerFunctionName = callsControllerFunctionName; + this.randomStackTraceIndex = randomStackTraceIndex; + } + + /** + * @param blockScopeNode + */ + public appendNode (blockScopeNode: TNodeWithBlockStatement): void { + let targetBlockScope: TNodeWithBlockStatement; + + if (this.stackTraceData.length) { + targetBlockScope = NodeAppender + .getOptimalBlockScope(this.stackTraceData, this.randomStackTraceIndex, 1); + } else { + targetBlockScope = blockScopeNode; + } + + NodeAppender.prependNode(targetBlockScope, this.getNode()); + } + + /** + * @returns {TStatement[]} + */ + protected getNodeStructure (): TStatement[] { + return NodeUtils.convertCodeToStructure( + SingleNodeCallControllerTemplate().formatUnicorn({ + singleNodeCallControllerFunctionName: this.callsControllerFunctionName + }) + ); + } +} diff --git a/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts b/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts index 7e524668..5e552720 100644 --- a/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts +++ b/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts @@ -1,6 +1,7 @@ import { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement'; import { TStatement } from '../../types/TStatement'; +import { IOptions } from '../../interfaces/IOptions'; import { IStackTraceData } from '../../interfaces/stack-trace-analyzer/IStackTraceData'; import { AppendState } from '../../enums/AppendState'; @@ -10,7 +11,7 @@ import { NO_CUSTOM_NODES_PRESET } from '../../preset-options/NoCustomNodesPreset import { SelfDefendingTemplate } from '../../templates/custom-nodes/self-defending-nodes/self-defending-unicode-node/SelfDefendingTemplate'; import { AbstractCustomNode } from '../AbstractCustomNode'; -import { CustomNodeAppender } from '../CustomNodeAppender'; +import { NodeAppender } from '../../NodeAppender'; import { JavaScriptObfuscator } from '../../JavaScriptObfuscator'; import { NodeUtils } from '../../NodeUtils'; import { Utils } from '../../Utils'; @@ -22,15 +23,48 @@ export class SelfDefendingUnicodeNode extends AbstractCustomNode { protected appendState: AppendState = AppendState.AfterObfuscation; /** - * @param blockScopeNode - * @param stackTraceData + * @type {string} */ - public appendNode (blockScopeNode: TNodeWithBlockStatement, stackTraceData: IStackTraceData[]): void { - CustomNodeAppender.appendNode( - stackTraceData, + protected callsControllerFunctionName: string; + + /** + * @type {number} + */ + protected randomStackTraceIndex: number; + + /** + * @type {IStackTraceData[]} + */ + protected stackTraceData: IStackTraceData[]; + + /** + * @param stackTraceData + * @param callsControllerFunctionName + * @param randomStackTraceIndex + * @param options + */ + constructor ( + stackTraceData: IStackTraceData[], + callsControllerFunctionName: string, + randomStackTraceIndex: number, + options: IOptions + ) { + super(options); + + this.stackTraceData = stackTraceData; + this.callsControllerFunctionName = callsControllerFunctionName; + this.randomStackTraceIndex = randomStackTraceIndex; + } + + /** + * @param blockScopeNode + */ + public appendNode (blockScopeNode: TNodeWithBlockStatement): void { + NodeAppender.appendNodeToOptimalBlockScope( + this.stackTraceData, blockScopeNode, this.getNode(), - CustomNodeAppender.getRandomStackTraceIndex(stackTraceData.length) + this.randomStackTraceIndex ); } diff --git a/src/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.ts b/src/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.ts index 58457740..31409cd0 100644 --- a/src/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.ts +++ b/src/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.ts @@ -19,6 +19,7 @@ import { UnicodeArrayRc4DecodeNodeTemplate } from '../../templates/custom-nodes/ import { AbstractCustomNode } from '../AbstractCustomNode'; import { JavaScriptObfuscator } from '../../JavaScriptObfuscator'; +import { NodeAppender } from '../../NodeAppender'; import { NodeUtils } from '../../NodeUtils'; import { UnicodeArray } from '../../UnicodeArray'; @@ -70,7 +71,7 @@ export class UnicodeArrayCallsWrapper extends AbstractCustomNode { return; } - NodeUtils.insertNodeAtIndex(blockScopeNode, this.getNode(), 1); + NodeAppender.insertNodeAtIndex(blockScopeNode, this.getNode(), 1); } /** diff --git a/src/custom-nodes/unicode-array-nodes/UnicodeArrayNode.ts b/src/custom-nodes/unicode-array-nodes/UnicodeArrayNode.ts index 8f3064b4..d080930c 100644 --- a/src/custom-nodes/unicode-array-nodes/UnicodeArrayNode.ts +++ b/src/custom-nodes/unicode-array-nodes/UnicodeArrayNode.ts @@ -12,6 +12,7 @@ import { UnicodeArray } from '../../UnicodeArray'; import { UnicodeArrayTemplate } from '../../templates/custom-nodes/unicode-array-nodes/unicode-array-node/UnicodeArrayTemplate'; import { AbstractCustomNode } from '../AbstractCustomNode'; +import { NodeAppender } from '../../NodeAppender'; import { NodeUtils } from '../../NodeUtils'; export class UnicodeArrayNode extends AbstractCustomNode { @@ -67,7 +68,7 @@ export class UnicodeArrayNode extends AbstractCustomNode { return; } - NodeUtils.prependNode(blockScopeNode, this.getNode()); + NodeAppender.prependNode(blockScopeNode, this.getNode()); } /** diff --git a/src/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.ts b/src/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.ts index ed0fc2ff..b470014f 100644 --- a/src/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.ts +++ b/src/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.ts @@ -14,6 +14,7 @@ import { UnicodeArrayRotateFunctionTemplate } from '../../templates/custom-nodes import { AbstractCustomNode } from '../AbstractCustomNode'; import { JavaScriptObfuscator } from '../../JavaScriptObfuscator'; +import { NodeAppender } from '../../NodeAppender'; import { NodeUtils } from '../../NodeUtils'; import { UnicodeArray } from '../../UnicodeArray'; import { Utils } from '../../Utils'; @@ -66,7 +67,7 @@ export class UnicodeArrayRotateFunctionNode extends AbstractCustomNode { return; } - NodeUtils.insertNodeAtIndex(blockScopeNode, this.getNode(), 1); + NodeAppender.insertNodeAtIndex(blockScopeNode, this.getNode(), 1); } /** diff --git a/src/interfaces/custom-nodes/ICustomNode.d.ts b/src/interfaces/custom-nodes/ICustomNode.d.ts index 3ac4fd53..29398e62 100644 --- a/src/interfaces/custom-nodes/ICustomNode.d.ts +++ b/src/interfaces/custom-nodes/ICustomNode.d.ts @@ -2,16 +2,13 @@ import * as ESTree from 'estree'; import { TStatement } from '../../types/TStatement'; -import { IStackTraceData } from '../stack-trace-analyzer/IStackTraceData'; - import { AppendState } from '../../enums/AppendState'; export interface ICustomNode { /** * @param astTree - * @param stackTraceData */ - appendNode (astTree: ESTree.Node, stackTraceData?: IStackTraceData[]): void; + appendNode (astTree: ESTree.Node): void; /** * @returns {AppendState} diff --git a/src/node-groups/AbstractNodesGroup.ts b/src/node-groups/AbstractNodesGroup.ts index c5c1cfa4..bc31d48e 100644 --- a/src/node-groups/AbstractNodesGroup.ts +++ b/src/node-groups/AbstractNodesGroup.ts @@ -2,6 +2,7 @@ import { ICustomNode } from '../interfaces/custom-nodes/ICustomNode'; import { INodesGroup } from '../interfaces/INodesGroup'; import { IOptions } from '../interfaces/IOptions'; +import { IStackTraceData } from '../interfaces/stack-trace-analyzer/IStackTraceData'; export abstract class AbstractNodesGroup implements INodesGroup { /** @@ -9,17 +10,27 @@ export abstract class AbstractNodesGroup implements INodesGroup { */ protected nodes: Map = new Map (); + /** + * @type {IStackTraceData[]} + */ + protected stackTraceData: IStackTraceData[]; + /** * @type {IOptions} */ protected options: IOptions; - constructor (options: IOptions) { + /** + * @param stackTraceData + * @param options + */ + constructor (stackTraceData: IStackTraceData[], options: IOptions) { + this.stackTraceData = stackTraceData; this.options = options; } /** - * @returns {Map} + * @returns {Map} */ public getNodes (): Map { return this.nodes; diff --git a/src/node-groups/ConsoleOutputNodesGroup.ts b/src/node-groups/ConsoleOutputNodesGroup.ts index 13fcf4dc..62833e35 100644 --- a/src/node-groups/ConsoleOutputNodesGroup.ts +++ b/src/node-groups/ConsoleOutputNodesGroup.ts @@ -1,22 +1,43 @@ import { IOptions } from '../interfaces/IOptions'; +import { IStackTraceData } from '../interfaces/stack-trace-analyzer/IStackTraceData'; import { AbstractNodesGroup } from './AbstractNodesGroup'; import { ConsoleOutputDisableExpressionNode } from '../custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode'; +import { NodeAppender } from '../NodeAppender'; +import { NodeCallsControllerFunctionNode } from '../custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode'; export class ConsoleOutputNodesGroup extends AbstractNodesGroup { /** + * @param stackTraceData * @param options */ - constructor (options: IOptions) { - super(options); + constructor (stackTraceData: IStackTraceData[], options: IOptions) { + super(stackTraceData, options); if (!this.options.disableConsoleOutput) { return; } + const callsControllerFunctionName: string = 'domainLockCallsControllerFunction'; + const randomStackTraceIndex: number = NodeAppender.getRandomStackTraceIndex(this.stackTraceData.length); + this.nodes.set( 'consoleOutputDisableExpressionNode', - new ConsoleOutputDisableExpressionNode(this.options) + new ConsoleOutputDisableExpressionNode( + this.stackTraceData, + callsControllerFunctionName, + randomStackTraceIndex, + this.options + ) + ); + this.nodes.set( + 'ConsoleOutputNodeCallsControllerFunctionNode', + new NodeCallsControllerFunctionNode( + this.stackTraceData, + callsControllerFunctionName, + randomStackTraceIndex, + this.options + ) ); } } diff --git a/src/node-groups/DebugProtectionNodesGroup.ts b/src/node-groups/DebugProtectionNodesGroup.ts index 311ba49f..0ee4c20b 100644 --- a/src/node-groups/DebugProtectionNodesGroup.ts +++ b/src/node-groups/DebugProtectionNodesGroup.ts @@ -1,4 +1,5 @@ import { IOptions } from '../interfaces/IOptions'; +import { IStackTraceData } from '../interfaces/stack-trace-analyzer/IStackTraceData'; import { DebugProtectionFunctionCallNode } from '../custom-nodes/debug-protection-nodes/DebugProtectionFunctionCallNode'; import { DebugProtectionFunctionIntervalNode } from '../custom-nodes/debug-protection-nodes/DebugProtectionFunctionIntervalNode'; @@ -14,10 +15,11 @@ export class DebugProtectionNodesGroup extends AbstractNodesGroup { private debugProtectionFunctionIdentifier: string = Utils.getRandomVariableName(); /** + * @param stackTraceData * @param options */ - constructor (options: IOptions) { - super(options); + constructor (stackTraceData: IStackTraceData[], options: IOptions) { + super(stackTraceData, options); if (!this.options.debugProtection) { return; diff --git a/src/node-groups/DomainLockNodesGroup.ts b/src/node-groups/DomainLockNodesGroup.ts index bed745aa..ee61f83e 100644 --- a/src/node-groups/DomainLockNodesGroup.ts +++ b/src/node-groups/DomainLockNodesGroup.ts @@ -1,22 +1,43 @@ import { IOptions } from '../interfaces/IOptions'; +import { IStackTraceData } from '../interfaces/stack-trace-analyzer/IStackTraceData'; import { AbstractNodesGroup } from './AbstractNodesGroup'; +import { NodeAppender } from '../NodeAppender'; import { DomainLockNode } from '../custom-nodes/domain-lock-nodes/DomainLockNode'; +import { NodeCallsControllerFunctionNode } from '../custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode'; export class DomainLockNodesGroup extends AbstractNodesGroup { /** + * @param stackTraceData * @param options */ - constructor (options: IOptions) { - super(options); + constructor (stackTraceData: IStackTraceData[], options: IOptions) { + super(stackTraceData, options); if (!this.options.domainLock.length) { return; } + const callsControllerFunctionName: string = 'domainLockCallsControllerFunction'; + const randomStackTraceIndex: number = NodeAppender.getRandomStackTraceIndex(this.stackTraceData.length); + this.nodes.set( 'DomainLockNode', - new DomainLockNode(this.options) + new DomainLockNode( + this.stackTraceData, + callsControllerFunctionName, + randomStackTraceIndex, + this.options + ) + ); + this.nodes.set( + 'DomainLockNodeCallsControllerFunctionNode', + new NodeCallsControllerFunctionNode( + this.stackTraceData, + callsControllerFunctionName, + randomStackTraceIndex, + this.options + ) ); } } diff --git a/src/node-groups/SelfDefendingNodesGroup.ts b/src/node-groups/SelfDefendingNodesGroup.ts index 213cd55d..f9f786cf 100644 --- a/src/node-groups/SelfDefendingNodesGroup.ts +++ b/src/node-groups/SelfDefendingNodesGroup.ts @@ -1,22 +1,43 @@ import { IOptions } from '../interfaces/IOptions'; +import { IStackTraceData } from '../interfaces/stack-trace-analyzer/IStackTraceData'; import { AbstractNodesGroup } from './AbstractNodesGroup'; +import { NodeAppender } from '../NodeAppender'; +import { NodeCallsControllerFunctionNode } from '../custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode'; import { SelfDefendingUnicodeNode } from '../custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode'; export class SelfDefendingNodesGroup extends AbstractNodesGroup { /** + * @param stackTraceData * @param options */ - constructor (options: IOptions) { - super(options); + constructor (stackTraceData: IStackTraceData[], options: IOptions) { + super(stackTraceData, options); if (!this.options.selfDefending) { return; } + const callsControllerFunctionName: string = 'domainLockCallsControllerFunction'; + const randomStackTraceIndex: number = NodeAppender.getRandomStackTraceIndex(this.stackTraceData.length); + this.nodes.set( 'selfDefendingUnicodeNode', - new SelfDefendingUnicodeNode(this.options) + new SelfDefendingUnicodeNode( + this.stackTraceData, + callsControllerFunctionName, + randomStackTraceIndex, + this.options + ) + ); + this.nodes.set( + 'SelfDefendingNodeCallsControllerFunctionNode', + new NodeCallsControllerFunctionNode( + this.stackTraceData, + callsControllerFunctionName, + randomStackTraceIndex, + this.options + ) ); } } diff --git a/src/node-groups/UnicodeArrayNodesGroup.ts b/src/node-groups/UnicodeArrayNodesGroup.ts index 72f97a39..342d3440 100644 --- a/src/node-groups/UnicodeArrayNodesGroup.ts +++ b/src/node-groups/UnicodeArrayNodesGroup.ts @@ -1,4 +1,5 @@ import { IOptions } from '../interfaces/IOptions'; +import { IStackTraceData } from '../interfaces/stack-trace-analyzer/IStackTraceData'; import { AbstractNodesGroup } from './AbstractNodesGroup'; import { UnicodeArray } from '../UnicodeArray'; @@ -24,10 +25,11 @@ export class UnicodeArrayNodesGroup extends AbstractNodesGroup { private unicodeArrayTranslatorName: string = Utils.getRandomVariableName(UnicodeArrayNode.UNICODE_ARRAY_RANDOM_LENGTH); /** + * @param stackTraceData * @param options */ - constructor (options: IOptions) { - super(options); + constructor (stackTraceData: IStackTraceData[], options: IOptions) { + super(stackTraceData, options); if (!this.options.unicodeArray) { return; diff --git a/src/templates/custom-nodes/SingleNodeCallControllerTemplate.ts b/src/templates/custom-nodes/SingleNodeCallControllerTemplate.ts new file mode 100644 index 00000000..ec6ff362 --- /dev/null +++ b/src/templates/custom-nodes/SingleNodeCallControllerTemplate.ts @@ -0,0 +1,24 @@ +/** + * @returns {string} + */ +export function SingleNodeCallControllerTemplate (): string { + return ` + var {singleNodeCallControllerFunctionName} = (function(){ + var firstCall = true; + + return function (context, fn){ + var rfn = firstCall ? function(){ + if(fn){ + var res = fn.apply(context, arguments); + fn = null; + return res; + } + } : function(){} + + firstCall = false; + + return rfn; + } + })(); + `; +} diff --git a/src/templates/custom-nodes/domain-lock-nodes/domain-lock-node/DomainLockNodeTemplate.ts b/src/templates/custom-nodes/domain-lock-nodes/domain-lock-node/DomainLockNodeTemplate.ts index f7d04a76..a47d2fa3 100644 --- a/src/templates/custom-nodes/domain-lock-nodes/domain-lock-node/DomainLockNodeTemplate.ts +++ b/src/templates/custom-nodes/domain-lock-nodes/domain-lock-node/DomainLockNodeTemplate.ts @@ -3,7 +3,7 @@ */ export function DomainLockNodeTemplate (): string { return ` - var {domainLockFunctionName} = function () { + var {domainLockFunctionName} = {singleNodeCallControllerFunctionName}(this, function () { var getGlobal = function () { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } @@ -19,65 +19,62 @@ export function DomainLockNodeTemplate (): string { }() }; }; - - if ( - !getGlobal().promisePolyfillActivationFlag || - !getGlobal().promisePolyfillActivationFlag.isActive - ) { - getGlobal().promisePolyfillActivationFlag = { - isActive: true - }; - - var regExp = new RegExp("[{diff}]", "g"); - var domains = "{domains}".replace(regExp, "").split(";"); - var eval = []["forEach"]["constructor"]; - var window = eval("return this")(); - - for (var d in window) { - if (d.length == 8 && d.charCodeAt(7) == 116 && d.charCodeAt(5) == 101 && d.charCodeAt(3) == 117 && d.charCodeAt(0) == 100) { - break; - } - } - - for (var d1 in window[d]) { - if (d1.length == 6 && d1.charCodeAt(5) == 110 && d1.charCodeAt(0) == 100) { - break; - } - } - - var currentDomain = window[d][d1]; - - if (!currentDomain) { - return; - } - - var ok = false; - - for (var i = 0; i < domains.length; i++) { - var domain = domains[i]; - var position = currentDomain.length - domain.length; - var lastIndex = currentDomain.indexOf(domain, position); - var endsWith = lastIndex !== -1 && lastIndex === position; - - if (endsWith) { - if (currentDomain.length == domain.length || domain.indexOf(".") === 0) { - ok = true; - } - break; - } - } - - if (!ok) { - data; - } else { - return; - } + var regExp = new RegExp("[{diff}]", "g"); + var domains = "{domains}".replace(regExp, "").split(";"); + var eval = []["forEach"]["constructor"]; + var windowObject = eval("return this")(); + var document; + var domain; + + for (var d in windowObject) { + if (d.length == 8 && d.charCodeAt(7) == 116 && d.charCodeAt(5) == 101 && d.charCodeAt(3) == 117 && d.charCodeAt(0) == 100) { + document = d; - func(); + break; + } } - }; - + + for (var d1 in windowObject[document]) { + if (d1.length == 6 && d1.charCodeAt(5) == 110 && d1.charCodeAt(0) == 100) { + domain = d1; + + break; + } + } + + if ((!document && !domain) || (!windowObject[document] && !windowObject[document][domain])) { + return; + } + + var currentDomain = windowObject[document][domain]; + + var ok = false; + + for (var i = 0; i < domains.length; i++) { + var domain = domains[i]; + var position = currentDomain.length - domain.length; + var lastIndex = currentDomain.indexOf(domain, position); + var endsWith = lastIndex !== -1 && lastIndex === position; + + if (endsWith) { + if (currentDomain.length == domain.length || domain.indexOf(".") === 0) { + ok = true; + } + + break; + } + } + + if (!ok) { + data; + } else { + return; + } + + func(); + }); + {domainLockFunctionName}(); `; } diff --git a/test/dev/dev.ts b/test/dev/dev.ts index bc38c545..e51ad2c6 100644 --- a/test/dev/dev.ts +++ b/test/dev/dev.ts @@ -70,7 +70,8 @@ if (!(global)._babelPolyfill) { `, { disableConsoleOutput: false, - unicodeArrayEncoding: 'rc4' + unicodeArrayEncoding: 'rc4', + domainLock: ['google.ru'] } ).getObfuscatedCode(); diff --git a/test/functional-tests/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.spec.ts b/test/functional-tests/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.spec.ts index 3c318167..86a74ac8 100644 --- a/test/functional-tests/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.spec.ts +++ b/test/functional-tests/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.spec.ts @@ -7,7 +7,7 @@ import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscator'; const assert: Chai.AssertStatic = require('chai').assert; describe('ConsoleOutputDisableExpressionNode', () => { - it('should correctly appendNode `ConsoleOutputDisableExpressionNode` custom node into the obfuscated code if `disableConsoleOutput` option is set', () => { + it('should correctly appendNodeToOptimalBlockScope `ConsoleOutputDisableExpressionNode` custom node into the obfuscated code if `disableConsoleOutput` option is set', () => { let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( `var test = 'test';`, Object.assign({}, NO_CUSTOM_NODES_PRESET, { @@ -19,7 +19,7 @@ describe('ConsoleOutputDisableExpressionNode', () => { assert.match(obfuscationResult.getObfuscatedCode(), /for *\(_0x([a-z0-9]){4,6} in _0x([a-z0-9]){4,6} *= *'(\\x[a-f0-9]*)*'\)/); }); - it('should\'t appendNode `ConsoleOutputDisableExpressionNode` custom node into the obfuscated code if `disableConsoleOutput` option is not set', () => { + it('should\'t appendNodeToOptimalBlockScope `ConsoleOutputDisableExpressionNode` custom node into the obfuscated code if `disableConsoleOutput` option is not set', () => { let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( `var test = 'test';`, Object.assign({}, NO_CUSTOM_NODES_PRESET, { diff --git a/test/functional-tests/custom-nodes/domain-lock-nodes/DomainLockNode.spec.ts b/test/functional-tests/custom-nodes/domain-lock-nodes/DomainLockNode.spec.ts index 3775ea3e..25aa7645 100644 --- a/test/functional-tests/custom-nodes/domain-lock-nodes/DomainLockNode.spec.ts +++ b/test/functional-tests/custom-nodes/domain-lock-nodes/DomainLockNode.spec.ts @@ -7,7 +7,7 @@ import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscator'; const assert: Chai.AssertStatic = require('chai').assert; describe('DomainLockNode', () => { - it('should correctly appendNode `DomainLockNode` custom node into the obfuscated code if `domainLock` option is set', () => { + it('should correctly appendNodeToOptimalBlockScope `DomainLockNode` custom node into the obfuscated code if `domainLock` option is set', () => { let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( `var test = 'test';`, Object.assign({}, NO_CUSTOM_NODES_PRESET, { @@ -18,7 +18,7 @@ describe('DomainLockNode', () => { assert.match(obfuscationResult.getObfuscatedCode(), /var _0x([a-z0-9]){4,6} *= *new RegExp/); }); - it('should\'t appendNode `DomainLockNode` custom node into the obfuscated code if `domainLock` option is not set', () => { + it('should\'t appendNodeToOptimalBlockScope `DomainLockNode` custom node into the obfuscated code if `domainLock` option is not set', () => { let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( `var test = 'test';`, Object.assign({}, NO_CUSTOM_NODES_PRESET, { diff --git a/test/functional-tests/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.spec.ts b/test/functional-tests/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.spec.ts index d011bb07..0976757a 100644 --- a/test/functional-tests/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.spec.ts +++ b/test/functional-tests/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.spec.ts @@ -7,7 +7,7 @@ import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscator'; const assert: Chai.AssertStatic = require('chai').assert; describe('UnicodeArrayCallsWrapper', () => { - it('should correctly appendNode `UnicodeArrayCallsWrapper` custom node into the obfuscated code', () => { + it('should correctly appendNodeToOptimalBlockScope `UnicodeArrayCallsWrapper` custom node into the obfuscated code', () => { let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( `var test = 'test';`, Object.assign({}, NO_CUSTOM_NODES_PRESET, { diff --git a/test/functional-tests/custom-nodes/unicode-array-nodes/UnicodeArrayNode.spec.ts b/test/functional-tests/custom-nodes/unicode-array-nodes/UnicodeArrayNode.spec.ts index 903de05e..3cfa57f0 100644 --- a/test/functional-tests/custom-nodes/unicode-array-nodes/UnicodeArrayNode.spec.ts +++ b/test/functional-tests/custom-nodes/unicode-array-nodes/UnicodeArrayNode.spec.ts @@ -7,7 +7,7 @@ import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscator'; const assert: Chai.AssertStatic = require('chai').assert; describe('UnicodeArrayNode', () => { - it('should correctly appendNode `UnicodeArrayNode` custom node into the obfuscated code if `unicodeArray` option is set', () => { + it('should correctly appendNodeToOptimalBlockScope `UnicodeArrayNode` custom node into the obfuscated code if `unicodeArray` option is set', () => { let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( `var test = 'test';`, Object.assign({}, NO_CUSTOM_NODES_PRESET, { @@ -19,7 +19,7 @@ describe('UnicodeArrayNode', () => { assert.match(obfuscationResult.getObfuscatedCode(), /^var _0x([a-z0-9]){4} *= *\[/); }); - it('should\'t appendNode `UnicodeArrayNode` custom node into the obfuscated code if `unicodeArray` option is not set', () => { + it('should\'t appendNodeToOptimalBlockScope `UnicodeArrayNode` custom node into the obfuscated code if `unicodeArray` option is not set', () => { let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( `var test = 'test';`, Object.assign({}, NO_CUSTOM_NODES_PRESET, { diff --git a/test/functional-tests/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.spec.ts b/test/functional-tests/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.spec.ts index 8e08ab21..779b09fb 100644 --- a/test/functional-tests/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.spec.ts +++ b/test/functional-tests/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.spec.ts @@ -7,7 +7,7 @@ import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscator'; const assert: Chai.AssertStatic = require('chai').assert; describe('UnicodeArrayRotateFunctionNode', () => { - it('should correctly appendNode `UnicodeArrayRotateFunctionNode` custom node into the obfuscated code if `rotateUnicodeArray` option is set', () => { + it('should correctly appendNodeToOptimalBlockScope `UnicodeArrayRotateFunctionNode` custom node into the obfuscated code if `rotateUnicodeArray` option is set', () => { let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( `var test = 'test';`, Object.assign({}, NO_CUSTOM_NODES_PRESET, { @@ -20,7 +20,7 @@ describe('UnicodeArrayRotateFunctionNode', () => { assert.match(obfuscationResult.getObfuscatedCode(), /while *\(-- *_0x([a-z0-9]){4,6}\) *\{/); }); - it('should\'t appendNode `UnicodeArrayRotateFunctionNode` custom node into the obfuscated code if `rotateUnicodeArray` option is not set', () => { + it('should\'t appendNodeToOptimalBlockScope `UnicodeArrayRotateFunctionNode` custom node into the obfuscated code if `rotateUnicodeArray` option is not set', () => { let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( `var test = 'test';`, Object.assign({}, NO_CUSTOM_NODES_PRESET, { diff --git a/test/functional-tests/templates/custom-nodes/domain-lock-nodes/DomainLockNodeTemplate.spec.ts b/test/functional-tests/templates/custom-nodes/domain-lock-nodes/DomainLockNodeTemplate.spec.ts index 9d6e2351..b65c8ab2 100644 --- a/test/functional-tests/templates/custom-nodes/domain-lock-nodes/DomainLockNodeTemplate.spec.ts +++ b/test/functional-tests/templates/custom-nodes/domain-lock-nodes/DomainLockNodeTemplate.spec.ts @@ -9,17 +9,26 @@ const assert: Chai.AssertStatic = require('chai').assert; /** * @param templateData + * @param callsControllerFunctionName * @param currentDomain * @returns {Function} */ -function getFunctionFromTemplate (templateData: any, currentDomain: string) { +function getFunctionFromTemplate (templateData: any, callsControllerFunctionName: string, currentDomain: string) { let domainLockTemplate: string = DomainLockNodeTemplate().formatUnicorn(templateData); return Function(` document = { domain: '${currentDomain}' }; - + + var ${callsControllerFunctionName} = (function(){ + return function (context, fn){ + return function () { + return fn.apply(context, arguments); + }; + } + })(); + ${domainLockTemplate} `)(); } @@ -28,7 +37,8 @@ describe('DomainLockNodeTemplate (): string', () => { let domainsString: string, currentDomain: string, hiddenDomainsString: string, - diff: string; + diff: string, + singleNodeCallControllerFunctionName: string = 'callsController'; it('should correctly runs code inside template if current domain matches with `domainsString`', () => { domainsString = ['www.example.com'].join(';'); @@ -39,10 +49,11 @@ describe('DomainLockNodeTemplate (): string', () => { ] = Utils.hideString(domainsString, domainsString.length * 3); assert.doesNotThrow(() => getFunctionFromTemplate({ - domainLockFunctionName: 'func', + domainLockFunctionName: 'domainLockFunction', diff: diff, - domains: hiddenDomainsString - }, currentDomain)); + domains: hiddenDomainsString, + singleNodeCallControllerFunctionName + }, singleNodeCallControllerFunctionName, currentDomain)); }); it('should correctly runs code inside template if current domain matches with base domain of `domainsString` item', () => { @@ -54,10 +65,11 @@ describe('DomainLockNodeTemplate (): string', () => { ] = Utils.hideString(domainsString, domainsString.length * 3); assert.doesNotThrow(() => getFunctionFromTemplate({ - domainLockFunctionName: 'func', + domainLockFunctionName: 'domainLockFunction', diff: diff, - domains: hiddenDomainsString - }, currentDomain)); + domains: hiddenDomainsString, + singleNodeCallControllerFunctionName + }, singleNodeCallControllerFunctionName, currentDomain)); }); it('should throw an error if current domain doesn\'t match with `domainsString`', () => { @@ -69,10 +81,11 @@ describe('DomainLockNodeTemplate (): string', () => { ] = Utils.hideString(domainsString, domainsString.length * 3); assert.throws(() => getFunctionFromTemplate({ - domainLockFunctionName: 'func', + domainLockFunctionName: 'domainLockFunction', diff: diff, - domains: hiddenDomainsString - }, currentDomain)); + domains: hiddenDomainsString, + singleNodeCallControllerFunctionName + }, singleNodeCallControllerFunctionName, currentDomain)); }); afterEach(() => { diff --git a/test/index.spec.ts b/test/index.spec.ts index 739714b2..a6a7496e 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -13,7 +13,7 @@ import './unit-tests/OptionsNormalizer.spec'; import './unit-tests/SourceMapCorrector.spec'; import './unit-tests/Utils.spec'; import './unit-tests/cli/CLIUtils.spec'; -import './unit-tests/custom-nodes/CustomNodeAppender.spec'; +import './unit-tests/custom-nodes/NodeAppender.spec'; import './unit-tests/node-obfuscators/CatchClauseObfuscator.spec'; import './unit-tests/node-obfuscators/FunctionDeclarationObfuscator.spec'; import './unit-tests/node-obfuscators/FunctionObfuscator.spec'; diff --git a/test/unit-tests/NodeUtils.spec.ts b/test/unit-tests/NodeUtils.spec.ts index f66b8e8a..ba5838b9 100644 --- a/test/unit-tests/NodeUtils.spec.ts +++ b/test/unit-tests/NodeUtils.spec.ts @@ -1,8 +1,6 @@ import * as chai from 'chai'; import * as ESTree from 'estree'; -import { TStatement } from '../../src/types/TStatement'; - import { NodeMocks } from '../mocks/NodeMocks'; import { NodeUtils } from '../../src/NodeUtils'; @@ -27,43 +25,6 @@ describe('NodeUtils', () => { }); }); - describe('appendNode (blockScopeNode: TNodeWithBlockStatement[], nodeBodyStatements: TStatement[]): void', () => { - let blockStatementNode: ESTree.BlockStatement, - expectedBlockStatementNode: ESTree.BlockStatement, - expectedExpressionStatementNode: ESTree.ExpressionStatement, - expressionStatementNode: ESTree.ExpressionStatement; - - beforeEach(() => { - expressionStatementNode = NodeMocks.getExpressionStatementNode(); - expectedExpressionStatementNode = NodeMocks.getExpressionStatementNode(); - - blockStatementNode = NodeMocks.getBlockStatementNode(); - - expectedExpressionStatementNode['parentNode'] = blockStatementNode; - - expectedBlockStatementNode = NodeMocks.getBlockStatementNode([ - expectedExpressionStatementNode - ]); - - NodeUtils.appendNode( - blockStatementNode, - [expressionStatementNode] - ); - NodeUtils.appendNode( - blockStatementNode, - [{}] - ); - }); - - it('should appendNode given node to a `BlockStatement` node body', () => { - assert.deepEqual(blockStatementNode, expectedBlockStatementNode); - }); - - it('should does not change `BlockStatement` node body if given node is not a valid Node', () => { - assert.deepEqual(blockStatementNode, expectedBlockStatementNode); - }); - }); - describe('convertCodeToStructure (code: string): ESTree.Node[]', () => { let code: string, identifierNode: ESTree.Identifier, @@ -198,56 +159,6 @@ describe('NodeUtils', () => { }); }); - describe('insertNodeAtIndex (blockScopeNode: TNodeWithBlockStatement[], nodeBodyStatements: TStatement[], index: number): void', () => { - let blockStatementNode: ESTree.BlockStatement, - expectedBlockStatementNode: ESTree.BlockStatement, - expressionStatementNode1: ESTree.ExpressionStatement, - expressionStatementNode2: ESTree.ExpressionStatement, - expressionStatementNode3: ESTree.ExpressionStatement, - expressionStatementNode4: ESTree.ExpressionStatement; - - beforeEach(() => { - expressionStatementNode1 = NodeMocks.getExpressionStatementNode(NodeMocks.getLiteralNode(1)); - expressionStatementNode2 = NodeMocks.getExpressionStatementNode(NodeMocks.getLiteralNode(2)); - expressionStatementNode3 = NodeMocks.getExpressionStatementNode(NodeMocks.getLiteralNode(3)); - expressionStatementNode4 = NodeMocks.getExpressionStatementNode(NodeMocks.getLiteralNode(2)); - - blockStatementNode = NodeMocks.getBlockStatementNode([ - expressionStatementNode1, - expressionStatementNode3 - ]); - - expressionStatementNode1['parentNode'] = blockStatementNode; - expressionStatementNode2['parentNode'] = blockStatementNode; - expressionStatementNode3['parentNode'] = blockStatementNode; - - expectedBlockStatementNode = NodeMocks.getBlockStatementNode([ - expressionStatementNode1, - expressionStatementNode2, - expressionStatementNode3 - ]); - - NodeUtils.insertNodeAtIndex( - blockStatementNode, - [expressionStatementNode4], - 1 - ); - NodeUtils.insertNodeAtIndex( - blockStatementNode, - [{}], - 1 - ); - }); - - it('should insert given node in `BlockStatement` node body at index', () => { - assert.deepEqual(blockStatementNode, expectedBlockStatementNode); - }); - - it('should does not change `BlockStatement` node body if given node is not a valid Node', () => { - assert.deepEqual(blockStatementNode, expectedBlockStatementNode); - }); - }); - describe('parentize (node: ESTree.Node): void', () => { let ifStatementNode: ESTree.IfStatement, ifStatementBlockStatementNode: ESTree.BlockStatement, @@ -295,47 +206,4 @@ describe('NodeUtils', () => { assert.deepEqual(expressionStatementNode2['parentNode'], ifStatementBlockStatementNode); }); }); - - describe('prependNode (blockScopeNode: TNodeWithBlockStatement[], nodeBodyStatements: TStatement[]): void', () => { - let blockStatementNode: ESTree.BlockStatement, - expectedBlockStatementNode: ESTree.BlockStatement, - expressionStatementNode1: ESTree.ExpressionStatement, - expressionStatementNode2: ESTree.ExpressionStatement, - expressionStatementNode3: ESTree.ExpressionStatement; - - beforeEach(() => { - expressionStatementNode1 = NodeMocks.getExpressionStatementNode(NodeMocks.getLiteralNode(1)); - expressionStatementNode2 = NodeMocks.getExpressionStatementNode(NodeMocks.getLiteralNode(2)); - expressionStatementNode3 = NodeMocks.getExpressionStatementNode(NodeMocks.getLiteralNode(2)); - - blockStatementNode = NodeMocks.getBlockStatementNode([ - expressionStatementNode1 - ]); - - expressionStatementNode1['parentNode'] = blockStatementNode; - expressionStatementNode2['parentNode'] = blockStatementNode; - - expectedBlockStatementNode = NodeMocks.getBlockStatementNode([ - expressionStatementNode2, - expressionStatementNode1 - ]); - - NodeUtils.prependNode( - blockStatementNode, - [Object.assign({}, expressionStatementNode3)] - ); - NodeUtils.prependNode( - blockStatementNode, - [{}] - ) - }); - - it('should prepend given node to a `BlockStatement` node body', () => { - assert.deepEqual(blockStatementNode, expectedBlockStatementNode); - }); - - it('should does not change `BlockStatement` node body if given node is not a valid Node', () => { - assert.deepEqual(blockStatementNode, expectedBlockStatementNode); - }); - }); }); diff --git a/test/unit-tests/custom-nodes/CustomNodeAppender.spec.ts b/test/unit-tests/custom-nodes/NodeAppender.spec.ts similarity index 65% rename from test/unit-tests/custom-nodes/CustomNodeAppender.spec.ts rename to test/unit-tests/custom-nodes/NodeAppender.spec.ts index 38d65f5e..98f0c01c 100644 --- a/test/unit-tests/custom-nodes/CustomNodeAppender.spec.ts +++ b/test/unit-tests/custom-nodes/NodeAppender.spec.ts @@ -5,15 +5,52 @@ import { TStatement } from '../../../src/types/TStatement'; import { IStackTraceData } from '../../../src/interfaces/stack-trace-analyzer/IStackTraceData'; -import { CustomNodeAppender } from '../../../src/custom-nodes/CustomNodeAppender'; +import { NodeAppender } from '../../../src/NodeAppender'; import { NodeMocks } from '../../mocks/NodeMocks'; import { NodeUtils } from '../../../src/NodeUtils'; import { StackTraceAnalyzer } from '../../../src/stack-trace-analyzer/StackTraceAnalyzer'; const assert: any = chai.assert; -describe('CustomNodeAppender', () => { - describe('appendNode (blockScopeStackTraceData: IStackTraceData[], blockScopeNode: TNodeWithBlockStatement, nodeBodyStatements: TStatement[], index: number = 0): void', () => { +describe('NodeAppender', () => { + describe('appendNode (blockScopeNode: TNodeWithBlockStatement[], nodeBodyStatements: TStatement[]): void', () => { + let blockStatementNode: ESTree.BlockStatement, + expectedBlockStatementNode: ESTree.BlockStatement, + expectedExpressionStatementNode: ESTree.ExpressionStatement, + expressionStatementNode: ESTree.ExpressionStatement; + + beforeEach(() => { + expressionStatementNode = NodeMocks.getExpressionStatementNode(); + expectedExpressionStatementNode = NodeMocks.getExpressionStatementNode(); + + blockStatementNode = NodeMocks.getBlockStatementNode(); + + expectedExpressionStatementNode['parentNode'] = blockStatementNode; + + expectedBlockStatementNode = NodeMocks.getBlockStatementNode([ + expectedExpressionStatementNode + ]); + + NodeAppender.appendNode( + blockStatementNode, + [expressionStatementNode] + ); + NodeAppender.appendNode( + blockStatementNode, + [{}] + ); + }); + + it('should append given node to a `BlockStatement` node body', () => { + assert.deepEqual(blockStatementNode, expectedBlockStatementNode); + }); + + it('should does not change `BlockStatement` node body if given node is not a valid Node', () => { + assert.deepEqual(blockStatementNode, expectedBlockStatementNode); + }); + }); + + describe('appendNodeToOptimalBlockScope (blockScopeStackTraceData: IStackTraceData[], blockScopeNode: TNodeWithBlockStatement, nodeBodyStatements: TStatement[], index: number = 0): void', () => { let astTree: ESTree.Program, expectedAstTree: ESTree.Program, node: TStatement[], @@ -92,7 +129,7 @@ describe('CustomNodeAppender', () => { ); stackTraceData = new StackTraceAnalyzer(astTree.body).analyze(); - CustomNodeAppender.appendNode(stackTraceData, astTree, node); + NodeAppender.appendNodeToOptimalBlockScope(stackTraceData, astTree, node); assert.deepEqual(astTree, expectedAstTree); }); @@ -165,7 +202,7 @@ describe('CustomNodeAppender', () => { ); stackTraceData = new StackTraceAnalyzer(astTree.body).analyze(); - CustomNodeAppender.appendNode(stackTraceData, astTree, node); + NodeAppender.appendNodeToOptimalBlockScope(stackTraceData, astTree, node); assert.deepEqual(astTree, expectedAstTree); }); @@ -243,7 +280,7 @@ describe('CustomNodeAppender', () => { ); stackTraceData = new StackTraceAnalyzer(astTree.body).analyze(); - CustomNodeAppender.appendNode(stackTraceData, astTree, node, 2); + NodeAppender.appendNodeToOptimalBlockScope(stackTraceData, astTree, node, 2); assert.deepEqual(astTree, expectedAstTree); }); @@ -283,7 +320,7 @@ describe('CustomNodeAppender', () => { ); stackTraceData = new StackTraceAnalyzer(astTree.body).analyze(); - CustomNodeAppender.appendNode(stackTraceData, astTree, node, 1); + NodeAppender.appendNodeToOptimalBlockScope(stackTraceData, astTree, node, 1); assert.deepEqual(astTree, expectedAstTree); }); @@ -353,11 +390,11 @@ describe('CustomNodeAppender', () => { ); stackTraceData = new StackTraceAnalyzer(astTree.body).analyze(); - CustomNodeAppender.appendNode( + NodeAppender.appendNodeToOptimalBlockScope( stackTraceData, astTree, node, - CustomNodeAppender.getRandomStackTraceIndex(stackTraceData.length) + NodeAppender.getRandomStackTraceIndex(stackTraceData.length) ); assert.deepEqual(astTree, expectedAstTree); @@ -370,11 +407,104 @@ describe('CustomNodeAppender', () => { let index: number; for (let i: number = 0; i < 100; i++) { - index = CustomNodeAppender.getRandomStackTraceIndex(100); + index = NodeAppender.getRandomStackTraceIndex(100); assert.isAtLeast(index, 0); assert.isAtMost(index, 100); } }); }); + + describe('insertNodeAtIndex (blockScopeNode: TNodeWithBlockStatement[], nodeBodyStatements: TStatement[], index: number): void', () => { + let blockStatementNode: ESTree.BlockStatement, + expectedBlockStatementNode: ESTree.BlockStatement, + expressionStatementNode1: ESTree.ExpressionStatement, + expressionStatementNode2: ESTree.ExpressionStatement, + expressionStatementNode3: ESTree.ExpressionStatement, + expressionStatementNode4: ESTree.ExpressionStatement; + + beforeEach(() => { + expressionStatementNode1 = NodeMocks.getExpressionStatementNode(NodeMocks.getLiteralNode(1)); + expressionStatementNode2 = NodeMocks.getExpressionStatementNode(NodeMocks.getLiteralNode(2)); + expressionStatementNode3 = NodeMocks.getExpressionStatementNode(NodeMocks.getLiteralNode(3)); + expressionStatementNode4 = NodeMocks.getExpressionStatementNode(NodeMocks.getLiteralNode(2)); + + blockStatementNode = NodeMocks.getBlockStatementNode([ + expressionStatementNode1, + expressionStatementNode3 + ]); + + expressionStatementNode1['parentNode'] = blockStatementNode; + expressionStatementNode2['parentNode'] = blockStatementNode; + expressionStatementNode3['parentNode'] = blockStatementNode; + + expectedBlockStatementNode = NodeMocks.getBlockStatementNode([ + expressionStatementNode1, + expressionStatementNode2, + expressionStatementNode3 + ]); + + NodeAppender.insertNodeAtIndex( + blockStatementNode, + [expressionStatementNode4], + 1 + ); + NodeAppender.insertNodeAtIndex( + blockStatementNode, + [{}], + 1 + ); + }); + + it('should insert given node in `BlockStatement` node body at index', () => { + assert.deepEqual(blockStatementNode, expectedBlockStatementNode); + }); + + it('should does not change `BlockStatement` node body if given node is not a valid Node', () => { + assert.deepEqual(blockStatementNode, expectedBlockStatementNode); + }); + }); + + describe('prependNode (blockScopeNode: TNodeWithBlockStatement[], nodeBodyStatements: TStatement[]): void', () => { + let blockStatementNode: ESTree.BlockStatement, + expectedBlockStatementNode: ESTree.BlockStatement, + expressionStatementNode1: ESTree.ExpressionStatement, + expressionStatementNode2: ESTree.ExpressionStatement, + expressionStatementNode3: ESTree.ExpressionStatement; + + beforeEach(() => { + expressionStatementNode1 = NodeMocks.getExpressionStatementNode(NodeMocks.getLiteralNode(1)); + expressionStatementNode2 = NodeMocks.getExpressionStatementNode(NodeMocks.getLiteralNode(2)); + expressionStatementNode3 = NodeMocks.getExpressionStatementNode(NodeMocks.getLiteralNode(2)); + + blockStatementNode = NodeMocks.getBlockStatementNode([ + expressionStatementNode1 + ]); + + expressionStatementNode1['parentNode'] = blockStatementNode; + expressionStatementNode2['parentNode'] = blockStatementNode; + + expectedBlockStatementNode = NodeMocks.getBlockStatementNode([ + expressionStatementNode2, + expressionStatementNode1 + ]); + + NodeAppender.prependNode( + blockStatementNode, + [Object.assign({}, expressionStatementNode3)] + ); + NodeAppender.prependNode( + blockStatementNode, + [{}] + ) + }); + + it('should prepend given node to a `BlockStatement` node body', () => { + assert.deepEqual(blockStatementNode, expectedBlockStatementNode); + }); + + it('should does not change `BlockStatement` node body if given node is not a valid Node', () => { + assert.deepEqual(blockStatementNode, expectedBlockStatementNode); + }); + }); });