From ee1836cd30f37ccc33275fea9082cea10c2564a8 Mon Sep 17 00:00:00 2001 From: sanex3339 Date: Tue, 30 Aug 2016 16:52:33 +0300 Subject: [PATCH] Identifier replacer refactoring --- dist/index.js | 312 ++++++++++-------- src/Nodes.ts | 37 +++ src/node-obfuscators/CatchClauseObfuscator.ts | 7 +- .../FunctionDeclarationObfuscator.ts | 7 +- src/node-obfuscators/FunctionObfuscator.ts | 7 +- src/node-obfuscators/NodeObfuscator.ts | 29 +- .../VariableDeclarationObfuscator.ts | 28 +- tsconfig.json | 6 +- 8 files changed, 243 insertions(+), 190 deletions(-) diff --git a/dist/index.js b/dist/index.js index d637c6e2..9f70c022 100644 --- a/dist/index.js +++ b/dist/index.js @@ -219,9 +219,9 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var escodegen = __webpack_require__(10); var esprima = __webpack_require__(18); -var estraverse = __webpack_require__(4); +var estraverse = __webpack_require__(5); var NodeType_1 = __webpack_require__(7); -var Nodes_1 = __webpack_require__(6); +var Nodes_1 = __webpack_require__(2); var Utils_1 = __webpack_require__(0); var NodeUtils = function () { @@ -350,6 +350,100 @@ exports.NodeUtils = NodeUtils; /***/ }, /* 2 */ +/***/ 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 NodeType_1 = __webpack_require__(7); + +var Nodes = function () { + function Nodes() { + _classCallCheck(this, Nodes); + } + + _createClass(Nodes, null, [{ + key: "getProgramNode", + value: function getProgramNode(bodyNode) { + return { + 'type': NodeType_1.NodeType.Program, + 'body': bodyNode, + 'sourceType': 'script' + }; + } + }, { + key: "isArrowFunctionExpressionNode", + value: function isArrowFunctionExpressionNode(node) { + return node.type === NodeType_1.NodeType.ArrowFunctionExpression; + } + }, { + key: "isBlockStatementNode", + value: function isBlockStatementNode(node) { + return node.type === NodeType_1.NodeType.BlockStatement; + } + }, { + key: "isFunctionDeclarationNode", + value: function isFunctionDeclarationNode(node) { + return node.type === NodeType_1.NodeType.FunctionDeclaration; + } + }, { + key: "isFunctionExpressionNode", + value: function isFunctionExpressionNode(node) { + return node.type === NodeType_1.NodeType.FunctionExpression; + } + }, { + key: "isIdentifierNode", + value: function isIdentifierNode(node) { + return node.type === NodeType_1.NodeType.Identifier; + } + }, { + key: "isLiteralNode", + value: function isLiteralNode(node) { + return node.type === NodeType_1.NodeType.Literal; + } + }, { + key: "isMemberExpressionNode", + value: function isMemberExpressionNode(node) { + return node.type === NodeType_1.NodeType.MemberExpression; + } + }, { + key: "isProgramNode", + value: function isProgramNode(node) { + return node.type === NodeType_1.NodeType.Program; + } + }, { + key: "isPropertyNode", + value: function isPropertyNode(node) { + return node.type === NodeType_1.NodeType.Property; + } + }, { + key: "isVariableDeclarationNode", + value: function isVariableDeclarationNode(node) { + return node.type === NodeType_1.NodeType.VariableDeclaration; + } + }, { + key: "isVariableDeclaratorNode", + value: function isVariableDeclaratorNode(node) { + return node.type === NodeType_1.NodeType.VariableDeclarator; + } + }, { + key: "isNodeHasBlockStatement", + value: function isNodeHasBlockStatement(node) { + return node.hasOwnProperty('body') && Array.isArray(node.body); + } + }]); + + return Nodes; +}(); + +exports.Nodes = Nodes; + +/***/ }, +/* 3 */ /***/ function(module, exports) { "use strict"; @@ -362,7 +456,7 @@ exports.NodeUtils = NodeUtils; var AppendState = exports.AppendState; /***/ }, -/* 3 */ +/* 4 */ /***/ function(module, exports) { "use strict"; @@ -397,13 +491,13 @@ var Node = function () { exports.Node = Node; /***/ }, -/* 4 */ +/* 5 */ /***/ function(module, exports) { module.exports = require("estraverse"); /***/ }, -/* 5 */ +/* 6 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -414,7 +508,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 JSFuck_1 = __webpack_require__(16); -var Nodes_1 = __webpack_require__(6); +var Nodes_1 = __webpack_require__(2); var Utils_1 = __webpack_require__(0); var NodeObfuscator = function () { @@ -441,15 +535,11 @@ var NodeObfuscator = function () { } }, { key: "replaceIdentifiersWithRandomNames", - value: function replaceIdentifiersWithRandomNames(node, parentNode, namesMap) { - if (Nodes_1.Nodes.isIdentifierNode(node) && namesMap.has(node.name)) { - var parentNodeIsPropertyNode = Nodes_1.Nodes.isPropertyNode(parentNode) && parentNode.key === node, - parentNodeIsMemberExpressionNode = Nodes_1.Nodes.isMemberExpressionNode(parentNode) && parentNode.computed === false && parentNode.property === node; - if (parentNodeIsPropertyNode || parentNodeIsMemberExpressionNode) { - return; - } - node.name = namesMap.get(node.name); + value: function replaceIdentifiersWithRandomNames(node, namesMap) { + if (namesMap.has(node.name)) { + return namesMap.get(node.name); } + return node.name; } }, { key: "replaceLiteralBooleanWithJSFuck", @@ -512,80 +602,6 @@ var NodeObfuscator = function () { exports.NodeObfuscator = NodeObfuscator; -/***/ }, -/* 6 */ -/***/ 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 NodeType_1 = __webpack_require__(7); - -var Nodes = function () { - function Nodes() { - _classCallCheck(this, Nodes); - } - - _createClass(Nodes, null, [{ - key: "getProgramNode", - value: function getProgramNode(bodyNode) { - return { - 'type': NodeType_1.NodeType.Program, - 'body': bodyNode, - 'sourceType': 'script' - }; - } - }, { - key: "isBlockStatementNode", - value: function isBlockStatementNode(node) { - return node.type === NodeType_1.NodeType.BlockStatement; - } - }, { - key: "isIdentifierNode", - value: function isIdentifierNode(node) { - return node.type === NodeType_1.NodeType.Identifier; - } - }, { - key: "isLiteralNode", - value: function isLiteralNode(node) { - return node.type === NodeType_1.NodeType.Literal; - } - }, { - key: "isMemberExpressionNode", - value: function isMemberExpressionNode(node) { - return node.type === NodeType_1.NodeType.MemberExpression; - } - }, { - key: "isProgramNode", - value: function isProgramNode(node) { - return node.type === NodeType_1.NodeType.Program; - } - }, { - key: "isPropertyNode", - value: function isPropertyNode(node) { - return node.type === NodeType_1.NodeType.Property; - } - }, { - key: "isVariableDeclaratorNode", - value: function isVariableDeclaratorNode(node) { - return node.type === NodeType_1.NodeType.VariableDeclarator; - } - }, { - key: "isNodeHasBlockStatement", - value: function isNodeHasBlockStatement(node) { - return node.hasOwnProperty('body') && Array.isArray(node.body); - } - }]); - - return Nodes; -}(); - -exports.Nodes = Nodes; - /***/ }, /* 7 */ /***/ function(module, exports, __webpack_require__) { @@ -979,8 +995,8 @@ 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__(4); -var AppendState_1 = __webpack_require__(2); +var estraverse = __webpack_require__(5); +var AppendState_1 = __webpack_require__(3); var NodeType_1 = __webpack_require__(7); var CatchClauseObfuscator_1 = __webpack_require__(39); var ConsoleOutputNodesGroup_1 = __webpack_require__(35); @@ -990,7 +1006,7 @@ var FunctionObfuscator_1 = __webpack_require__(41); var LiteralObfuscator_1 = __webpack_require__(42); var MemberExpressionObfuscator_1 = __webpack_require__(43); var MethodDefinitionObfuscator_1 = __webpack_require__(44); -var Nodes_1 = __webpack_require__(6); +var Nodes_1 = __webpack_require__(2); var NodeUtils_1 = __webpack_require__(1); var ObjectExpressionObfuscator_1 = __webpack_require__(45); var SelfDefendingNodesGroup_1 = __webpack_require__(37); @@ -1426,9 +1442,9 @@ 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__(2); +var AppendState_1 = __webpack_require__(3); var ConsoleOutputDisableExpressionTemplate_1 = __webpack_require__(51); -var Node_1 = __webpack_require__(3); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(1); var ConsoleOutputDisableExpressionNode = function (_Node_1$Node) { @@ -1482,9 +1498,9 @@ 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__(2); +var AppendState_1 = __webpack_require__(3); var DebufProtectionFunctionCallTemplate_1 = __webpack_require__(52); -var Node_1 = __webpack_require__(3); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(1); var DebugProtectionFunctionCallNode = function (_Node_1$Node) { @@ -1535,9 +1551,9 @@ 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__(2); +var AppendState_1 = __webpack_require__(3); var DebugProtectionFunctionIntervalTemplate_1 = __webpack_require__(53); -var Node_1 = __webpack_require__(3); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(1); var DebugProtectionFunctionIntervalNode = function (_Node_1$Node) { @@ -1588,9 +1604,9 @@ 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__(2); +var AppendState_1 = __webpack_require__(3); var DebugProtectionFunctionTemplate_1 = __webpack_require__(54); -var Node_1 = __webpack_require__(3); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(1); var Utils_1 = __webpack_require__(0); @@ -1651,11 +1667,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 AppendState_1 = __webpack_require__(2); +var AppendState_1 = __webpack_require__(3); var NoCustomNodesPreset_1 = __webpack_require__(13); var SelfDefendingTemplate_1 = __webpack_require__(55); var JavaScriptObfuscator_1 = __webpack_require__(9); -var Node_1 = __webpack_require__(3); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(1); var Utils_1 = __webpack_require__(0); @@ -1720,9 +1736,9 @@ 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__(2); +var AppendState_1 = __webpack_require__(3); var UnicodeArrayCallsWrapperTemplate_1 = __webpack_require__(56); -var Node_1 = __webpack_require__(3); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(1); var Utils_1 = __webpack_require__(0); @@ -1794,13 +1810,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__(2); +var AppendState_1 = __webpack_require__(3); var NoCustomNodesPreset_1 = __webpack_require__(13); var AtobTemplate_1 = __webpack_require__(50); var SelfDefendingTemplate_1 = __webpack_require__(57); var UnicodeArrayDecodeTemplate_1 = __webpack_require__(58); var JavaScriptObfuscator_1 = __webpack_require__(9); -var Node_1 = __webpack_require__(3); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(1); var UnicodeArrayDecodeNode = function (_Node_1$Node) { @@ -1875,9 +1891,9 @@ 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__(2); +var AppendState_1 = __webpack_require__(3); var UnicodeArrayTemplate_1 = __webpack_require__(59); -var Node_1 = __webpack_require__(3); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(1); var UnicodeArrayNode = function (_Node_1$Node) { @@ -1961,12 +1977,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; } __webpack_require__(8); -var AppendState_1 = __webpack_require__(2); +var AppendState_1 = __webpack_require__(3); var NoCustomNodesPreset_1 = __webpack_require__(13); var SelfDefendingTemplate_1 = __webpack_require__(60); var UnicodeArrayRotateFunctionTemplate_1 = __webpack_require__(61); var JavaScriptObfuscator_1 = __webpack_require__(9); -var Node_1 = __webpack_require__(3); +var Node_1 = __webpack_require__(4); var NodeUtils_1 = __webpack_require__(1); var Utils_1 = __webpack_require__(0); @@ -2220,8 +2236,9 @@ 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__(4); -var NodeObfuscator_1 = __webpack_require__(5); +var estraverse = __webpack_require__(5); +var NodeObfuscator_1 = __webpack_require__(6); +var Nodes_1 = __webpack_require__(2); var CatchClauseObfuscator = function (_NodeObfuscator_1$Nod) { _inherits(CatchClauseObfuscator, _NodeObfuscator_1$Nod); @@ -2264,8 +2281,10 @@ var CatchClauseObfuscator = function (_NodeObfuscator_1$Nod) { var _this3 = this; estraverse.replace(catchClauseNode, { - leave: function leave(node, parentNode) { - _this3.replaceIdentifiersWithRandomNames(node, parentNode, _this3.catchClauseParam); + leave: function leave(node) { + if (Nodes_1.Nodes.isIdentifierNode(node)) { + node.name = _this3.replaceIdentifiersWithRandomNames(node, _this3.catchClauseParam); + } } }); } @@ -2291,9 +2310,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__(4); +var estraverse = __webpack_require__(5); var NodeType_1 = __webpack_require__(7); -var NodeObfuscator_1 = __webpack_require__(5); +var NodeObfuscator_1 = __webpack_require__(6); +var Nodes_1 = __webpack_require__(2); var NodeUtils_1 = __webpack_require__(1); var FunctionDeclarationObfuscator = function (_NodeObfuscator_1$Nod) { @@ -2341,8 +2361,10 @@ var FunctionDeclarationObfuscator = function (_NodeObfuscator_1$Nod) { var scopeNode = NodeUtils_1.NodeUtils.getBlockScopeOfNode(functionDeclarationNode); estraverse.replace(scopeNode, { - enter: function enter(node, parentNode) { - _this3.replaceIdentifiersWithRandomNames(node, parentNode, _this3.functionName); + enter: function enter(node) { + if (Nodes_1.Nodes.isIdentifierNode(node)) { + node.name = _this3.replaceIdentifiersWithRandomNames(node, _this3.functionName); + } } }); } @@ -2368,8 +2390,9 @@ 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__(4); -var NodeObfuscator_1 = __webpack_require__(5); +var estraverse = __webpack_require__(5); +var NodeObfuscator_1 = __webpack_require__(6); +var Nodes_1 = __webpack_require__(2); var FunctionObfuscator = function (_NodeObfuscator_1$Nod) { _inherits(FunctionObfuscator, _NodeObfuscator_1$Nod); @@ -2414,8 +2437,10 @@ var FunctionObfuscator = function (_NodeObfuscator_1$Nod) { var _this3 = this; var replaceVisitor = { - leave: function leave(node, parentNode) { - _this3.replaceIdentifiersWithRandomNames(node, parentNode, _this3.functionParams); + leave: function leave(node) { + if (Nodes_1.Nodes.isIdentifierNode(node)) { + node.name = _this3.replaceIdentifiersWithRandomNames(node, _this3.functionParams); + } } }; functionNode.params.forEach(function (paramsNode) { @@ -2448,8 +2473,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 escodegen = __webpack_require__(10); -var NodeObfuscator_1 = __webpack_require__(5); -var Nodes_1 = __webpack_require__(6); +var NodeObfuscator_1 = __webpack_require__(6); +var Nodes_1 = __webpack_require__(2); var LiteralObfuscator = function (_NodeObfuscator_1$Nod) { _inherits(LiteralObfuscator, _NodeObfuscator_1$Nod); @@ -2511,10 +2536,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__(10); -var estraverse = __webpack_require__(4); +var estraverse = __webpack_require__(5); var NodeType_1 = __webpack_require__(7); -var NodeObfuscator_1 = __webpack_require__(5); -var Nodes_1 = __webpack_require__(6); +var NodeObfuscator_1 = __webpack_require__(6); +var Nodes_1 = __webpack_require__(2); var MemberExpressionObfuscator = function (_NodeObfuscator_1$Nod) { _inherits(MemberExpressionObfuscator, _NodeObfuscator_1$Nod); @@ -2594,9 +2619,9 @@ 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__(4); -var NodeObfuscator_1 = __webpack_require__(5); -var Nodes_1 = __webpack_require__(6); +var estraverse = __webpack_require__(5); +var NodeObfuscator_1 = __webpack_require__(6); +var Nodes_1 = __webpack_require__(2); var Utils_1 = __webpack_require__(0); var MethodDefinitionObfuscator = function (_NodeObfuscator_1$Nod) { @@ -2661,10 +2686,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__(10); -var estraverse = __webpack_require__(4); +var estraverse = __webpack_require__(5); var NodeType_1 = __webpack_require__(7); -var NodeObfuscator_1 = __webpack_require__(5); -var Nodes_1 = __webpack_require__(6); +var NodeObfuscator_1 = __webpack_require__(6); +var Nodes_1 = __webpack_require__(2); var Utils_1 = __webpack_require__(0); var ObjectExpressionObfuscator = function (_NodeObfuscator_1$Nod) { @@ -2743,11 +2768,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__(4); +var estraverse = __webpack_require__(5); var NodeType_1 = __webpack_require__(7); -var NodeObfuscator_1 = __webpack_require__(5); +var NodeObfuscator_1 = __webpack_require__(6); +var Nodes_1 = __webpack_require__(2); var NodeUtils_1 = __webpack_require__(1); -var Utils_1 = __webpack_require__(0); var VariableDeclarationObfuscator = function (_NodeObfuscator_1$Nod) { _inherits(VariableDeclarationObfuscator, _NodeObfuscator_1$Nod); @@ -2797,20 +2822,21 @@ var VariableDeclarationObfuscator = function (_NodeObfuscator_1$Nod) { var scopeNode = variableDeclarationNode.kind === 'var' ? NodeUtils_1.NodeUtils.getBlockScopeOfNode(variableDeclarationNode) : variableParentNode, isNodeAfterVariableDeclaratorFlag = false; estraverse.replace(scopeNode, { - enter: function enter(node, parentNode) { - var functionNodes = [NodeType_1.NodeType.ArrowFunctionExpression, NodeType_1.NodeType.FunctionDeclaration, NodeType_1.NodeType.FunctionExpression]; - if (Utils_1.Utils.arrayContains(functionNodes, node.type)) { + enter: function enter(node) { + if (Nodes_1.Nodes.isArrowFunctionExpressionNode(node) || Nodes_1.Nodes.isFunctionDeclarationNode(node) || Nodes_1.Nodes.isFunctionExpressionNode(node)) { estraverse.replace(node, { - enter: function enter(node, parentNode) { - _this3.replaceIdentifiersWithRandomNames(node, parentNode, _this3.variableNames); + enter: function enter(node) { + if (Nodes_1.Nodes.isIdentifierNode(node)) { + node.name = _this3.replaceIdentifiersWithRandomNames(node, _this3.variableNames); + } } }); } - if (node === variableDeclarationNode) { + if (Nodes_1.Nodes.isVariableDeclarationNode(node) && node === variableDeclarationNode) { isNodeAfterVariableDeclaratorFlag = true; } - if (isNodeAfterVariableDeclaratorFlag) { - _this3.replaceIdentifiersWithRandomNames(node, parentNode, _this3.variableNames); + if (Nodes_1.Nodes.isIdentifierNode(node) && isNodeAfterVariableDeclaratorFlag) { + node.name = _this3.replaceIdentifiersWithRandomNames(node, _this3.variableNames); } } }); diff --git a/src/Nodes.ts b/src/Nodes.ts index 0dfba048..ed22f577 100644 --- a/src/Nodes.ts +++ b/src/Nodes.ts @@ -1,10 +1,14 @@ +import { IArrowFunctionExpressionNode } from "./interfaces/nodes/IArrowFunctionExpressionNode"; import { IBlockStatementNode } from "./interfaces/nodes/IBlockStatementNode"; import { IIdentifierNode } from "./interfaces/nodes/IIdentifierNode"; +import { IFunctionDeclarationNode } from "./interfaces/nodes/IFunctionDeclarationNode"; +import { IFunctionExpressionNode } from "./interfaces/nodes/IFunctionExpressionNode"; import { ILiteralNode } from "./interfaces/nodes/ILiteralNode"; import { IMemberExpressionNode } from "./interfaces/nodes/IMemberExpressionNode"; import { INode } from "./interfaces/nodes/INode"; import { IProgramNode } from "./interfaces/nodes/IProgramNode"; import { IPropertyNode } from "./interfaces/nodes/IPropertyNode"; +import { IVariableDeclarationNode } from "./interfaces/nodes/IVariableDeclarationNode"; import { IVariableDeclaratorNode } from "./interfaces/nodes/IVariableDeclaratorNode"; import { TStatement } from "./types/nodes/TStatement"; @@ -26,6 +30,14 @@ export class Nodes { }; } + /** + * @param node + * @returns {boolean} + */ + public static isArrowFunctionExpressionNode (node: INode): node is IArrowFunctionExpressionNode { + return node.type === NodeType.ArrowFunctionExpression; + } + /** * @param node * @returns {boolean} @@ -34,6 +46,22 @@ export class Nodes { return node.type === NodeType.BlockStatement; } + /** + * @param node + * @returns {boolean} + */ + public static isFunctionDeclarationNode (node: INode): node is IFunctionDeclarationNode { + return node.type === NodeType.FunctionDeclaration; + } + + /** + * @param node + * @returns {boolean} + */ + public static isFunctionExpressionNode (node: INode): node is IFunctionExpressionNode { + return node.type === NodeType.FunctionExpression; + } + /** * @param node * @returns {boolean} @@ -76,6 +104,15 @@ export class Nodes { return node.type === NodeType.Property; } + /** + * + * @param node + * @returns {boolean} + */ + public static isVariableDeclarationNode (node: INode): node is IVariableDeclarationNode { + return node.type === NodeType.VariableDeclaration; + } + /** * * @param node diff --git a/src/node-obfuscators/CatchClauseObfuscator.ts b/src/node-obfuscators/CatchClauseObfuscator.ts index 4061484c..d5f92ca1 100644 --- a/src/node-obfuscators/CatchClauseObfuscator.ts +++ b/src/node-obfuscators/CatchClauseObfuscator.ts @@ -4,6 +4,7 @@ import { ICatchClauseNode } from "../interfaces/nodes/ICatchClauseNode"; import { INode } from '../interfaces/nodes/INode'; import { NodeObfuscator } from './NodeObfuscator'; +import { Nodes } from "../Nodes"; /** * replaces: @@ -41,8 +42,10 @@ export class CatchClauseObfuscator extends NodeObfuscator { */ private replaceCatchClauseParam (catchClauseNode: ICatchClauseNode): void { estraverse.replace(catchClauseNode, { - leave: (node: INode, parentNode: INode): any => { - this.replaceIdentifiersWithRandomNames(node, parentNode, this.catchClauseParam); + leave: (node: INode): any => { + if (Nodes.isIdentifierNode(node)) { + node.name = this.replaceIdentifiersWithRandomNames(node, this.catchClauseParam); + } } }); } diff --git a/src/node-obfuscators/FunctionDeclarationObfuscator.ts b/src/node-obfuscators/FunctionDeclarationObfuscator.ts index 6cca873a..f52cf950 100644 --- a/src/node-obfuscators/FunctionDeclarationObfuscator.ts +++ b/src/node-obfuscators/FunctionDeclarationObfuscator.ts @@ -6,6 +6,7 @@ import { INode } from "../interfaces/nodes/INode"; import { NodeType } from "../enums/NodeType"; import { NodeObfuscator } from './NodeObfuscator'; +import { Nodes } from "../Nodes"; import { NodeUtils } from "../NodeUtils"; /** @@ -54,8 +55,10 @@ export class FunctionDeclarationObfuscator extends NodeObfuscator { ); estraverse.replace(scopeNode, { - enter: (node: INode, parentNode: INode): any => { - this.replaceIdentifiersWithRandomNames(node, parentNode, this.functionName); + enter: (node: INode): any => { + if (Nodes.isIdentifierNode(node)) { + node.name = this.replaceIdentifiersWithRandomNames(node, this.functionName); + } } }); } diff --git a/src/node-obfuscators/FunctionObfuscator.ts b/src/node-obfuscators/FunctionObfuscator.ts index 73117633..436edb5f 100644 --- a/src/node-obfuscators/FunctionObfuscator.ts +++ b/src/node-obfuscators/FunctionObfuscator.ts @@ -4,6 +4,7 @@ import { IFunctionNode } from "../interfaces/nodes/IFunctionNode"; import { INode } from "../interfaces/nodes/INode"; import { NodeObfuscator } from './NodeObfuscator'; +import { Nodes } from "../Nodes"; /** * replaces: @@ -44,8 +45,10 @@ export class FunctionObfuscator extends NodeObfuscator { */ private replaceFunctionParams (functionNode: IFunctionNode): void { let replaceVisitor: estraverse.Visitor = { - leave: (node: INode, parentNode: INode): any => { - this.replaceIdentifiersWithRandomNames(node, parentNode, this.functionParams); + leave: (node: INode): any => { + if (Nodes.isIdentifierNode(node)) { + node.name = this.replaceIdentifiersWithRandomNames(node, this.functionParams); + } } }; diff --git a/src/node-obfuscators/NodeObfuscator.ts b/src/node-obfuscators/NodeObfuscator.ts index 7bc87dd4..52c3e68c 100644 --- a/src/node-obfuscators/NodeObfuscator.ts +++ b/src/node-obfuscators/NodeObfuscator.ts @@ -1,4 +1,5 @@ import { ICustomNode } from '../interfaces/custom-nodes/ICustomNode'; +import { IIdentifierNode } from "../interfaces/nodes/IIdentifierNode"; import { INodeObfuscator } from '../interfaces/INodeObfuscator'; import { INode } from "../interfaces/nodes/INode"; import { IOptions } from "../interfaces/IOptions"; @@ -67,31 +68,15 @@ export abstract class NodeObfuscator implements INodeObfuscator { /** * @param node - * @param parentNode * @param namesMap + * @returns {string} */ - protected replaceIdentifiersWithRandomNames ( - node: INode, - parentNode: INode, - namesMap: Map - ): void { - if (Nodes.isIdentifierNode(node) && namesMap.has(node.name)) { - const parentNodeIsPropertyNode: boolean = ( - Nodes.isPropertyNode(parentNode) && - parentNode.key === node - ), - parentNodeIsMemberExpressionNode: boolean = ( - Nodes.isMemberExpressionNode(parentNode) && - parentNode.computed === false && - parentNode.property === node - ); - - if (parentNodeIsPropertyNode || parentNodeIsMemberExpressionNode) { - return; - } - - node.name = namesMap.get(node.name); + protected replaceIdentifiersWithRandomNames (node: IIdentifierNode, namesMap: Map ): string { + if (namesMap.has(node.name)) { + return namesMap.get(node.name); } + + return node.name; } /** diff --git a/src/node-obfuscators/VariableDeclarationObfuscator.ts b/src/node-obfuscators/VariableDeclarationObfuscator.ts index 97f479f5..49c5be6f 100644 --- a/src/node-obfuscators/VariableDeclarationObfuscator.ts +++ b/src/node-obfuscators/VariableDeclarationObfuscator.ts @@ -7,8 +7,8 @@ import { IVariableDeclaratorNode } from "../interfaces/nodes/IVariableDeclarator import { NodeType } from "../enums/NodeType"; import { NodeObfuscator } from './NodeObfuscator'; +import { Nodes } from "../Nodes"; import { NodeUtils } from "../NodeUtils"; -import { Utils } from '../Utils'; /** * replaces: @@ -62,27 +62,27 @@ export class VariableDeclarationObfuscator extends NodeObfuscator { isNodeAfterVariableDeclaratorFlag: boolean = false; estraverse.replace(scopeNode, { - enter: (node: INode, parentNode: INode): any => { - const functionNodes: string[] = [ - NodeType.ArrowFunctionExpression, - NodeType.FunctionDeclaration, - NodeType.FunctionExpression - ]; - - if (Utils.arrayContains(functionNodes, node.type)) { + enter: (node: INode): any => { + if ( + Nodes.isArrowFunctionExpressionNode(node) || + Nodes.isFunctionDeclarationNode(node) || + Nodes.isFunctionExpressionNode(node) + ) { estraverse.replace(node, { - enter: (node: INode, parentNode: INode): any => { - this.replaceIdentifiersWithRandomNames(node, parentNode, this.variableNames); + enter: (node: INode): any => { + if (Nodes.isIdentifierNode(node)) { + node.name = this.replaceIdentifiersWithRandomNames(node, this.variableNames); + } } }); } - if (node === variableDeclarationNode) { + if (Nodes.isVariableDeclarationNode(node) && node === variableDeclarationNode) { isNodeAfterVariableDeclaratorFlag = true; } - if (isNodeAfterVariableDeclaratorFlag) { - this.replaceIdentifiersWithRandomNames(node, parentNode, this.variableNames); + if (Nodes.isIdentifierNode(node) && isNodeAfterVariableDeclaratorFlag) { + node.name = this.replaceIdentifiersWithRandomNames(node, this.variableNames); } } }); diff --git a/tsconfig.json b/tsconfig.json index 18ed4fe5..3866be34 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,9 +22,5 @@ "node", "sinon" ] - }, - "exclude": [ - "node_modules", - "test" - ] + } } \ No newline at end of file