Bläddra i källkod

obfuscators refactoring

sanex3339 9 år sedan
förälder
incheckning
a99ee3da0f

+ 95 - 111
dist/index.js

@@ -213,9 +213,9 @@ module.exports =
 	
 	function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 	
-	var estraverse = __webpack_require__(5);
-	var NodeType_1 = __webpack_require__(3);
-	var Nodes_1 = __webpack_require__(2);
+	var estraverse = __webpack_require__(3);
+	var NodeType_1 = __webpack_require__(2);
+	var Nodes_1 = __webpack_require__(4);
 	var Utils_1 = __webpack_require__(0);
 	
 	var NodeUtils = function () {
@@ -329,11 +329,55 @@ module.exports =
 	"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'
+	});
+
+/***/ },
+/* 3 */
+/***/ function(module, exports) {
+
+	module.exports = require("estraverse");
+
+/***/ },
+/* 4 */
+/***/ 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__(3);
+	var NodeType_1 = __webpack_require__(2);
 	
 	var Nodes = function () {
 	    function Nodes() {
@@ -396,45 +440,7 @@ module.exports =
 	exports.Nodes = Nodes;
 
 /***/ },
-/* 3 */
-/***/ 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'
-	});
-
-/***/ },
-/* 4 */
+/* 5 */
 /***/ function(module, exports, __webpack_require__) {
 
 	"use strict";
@@ -483,12 +489,6 @@ module.exports =
 	
 	exports.Node = Node;
 
-/***/ },
-/* 5 */
-/***/ function(module, exports) {
-
-	module.exports = require("estraverse");
-
 /***/ },
 /* 6 */
 /***/ function(module, exports, __webpack_require__) {
@@ -500,8 +500,9 @@ module.exports =
 	
 	function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 	
+	var estraverse = __webpack_require__(3);
 	var JSFuck_1 = __webpack_require__(9);
-	var Nodes_1 = __webpack_require__(2);
+	var Nodes_1 = __webpack_require__(4);
 	var Utils_1 = __webpack_require__(0);
 	
 	var NodeObfuscator = function () {
@@ -519,6 +520,16 @@ module.exports =
 	                return new RegExp(reservedName, 'g').test(name);
 	            });
 	        }
+	    }, {
+	        key: "replaceAndStoreIdentifiersNames",
+	        value: function replaceAndStoreIdentifiersNames(node, namesMap) {
+	            if (Nodes_1.Nodes.isIdentifierNode(node) && !this.isReservedName(node.name)) {
+	                namesMap.set(node.name, Utils_1.Utils.getRandomVariableName());
+	                node.name = namesMap.get(node.name);
+	                return;
+	            }
+	            return estraverse.VisitorOption.Skip;
+	        }
 	    }, {
 	        key: "replaceNodeIdentifierByNewValue",
 	        value: function replaceNodeIdentifierByNewValue(node, parentNode, namesMap) {
@@ -807,9 +818,9 @@ module.exports =
 	
 	function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 	
-	var estraverse = __webpack_require__(5);
+	var estraverse = __webpack_require__(3);
 	var AppendState_1 = __webpack_require__(7);
-	var NodeType_1 = __webpack_require__(3);
+	var NodeType_1 = __webpack_require__(2);
 	var CatchClauseObfuscator_1 = __webpack_require__(31);
 	var ConsoleOutputDisableExpressionNode_1 = __webpack_require__(19);
 	var DebugProtectionNodesGroup_1 = __webpack_require__(28);
@@ -1038,7 +1049,7 @@ module.exports =
 	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 esprima = __webpack_require__(8);
-	var Node_1 = __webpack_require__(4);
+	var Node_1 = __webpack_require__(5);
 	var NodeUtils_1 = __webpack_require__(1);
 	
 	var ConsoleOutputDisableExpressionNode = function (_Node_1$Node) {
@@ -1085,8 +1096,8 @@ module.exports =
 	
 	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 NodeType_1 = __webpack_require__(3);
-	var Node_1 = __webpack_require__(4);
+	var NodeType_1 = __webpack_require__(2);
+	var Node_1 = __webpack_require__(5);
 	var NodeUtils_1 = __webpack_require__(1);
 	
 	var DebugProtectionFunctionCallNode = function (_Node_1$Node) {
@@ -1144,8 +1155,8 @@ module.exports =
 	
 	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 NodeType_1 = __webpack_require__(3);
-	var Node_1 = __webpack_require__(4);
+	var NodeType_1 = __webpack_require__(2);
+	var Node_1 = __webpack_require__(5);
 	var NodeUtils_1 = __webpack_require__(1);
 	
 	var DebugProtectionFunctionIntervalNode = function (_Node_1$Node) {
@@ -1229,7 +1240,7 @@ module.exports =
 	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 esprima = __webpack_require__(8);
-	var Node_1 = __webpack_require__(4);
+	var Node_1 = __webpack_require__(5);
 	var NodeUtils_1 = __webpack_require__(1);
 	var Utils_1 = __webpack_require__(0);
 	
@@ -1293,7 +1304,7 @@ module.exports =
 	var JSFuck_1 = __webpack_require__(9);
 	var NoCustomNodesPreset_1 = __webpack_require__(13);
 	var JavaScriptObfuscator_1 = __webpack_require__(11);
-	var Node_1 = __webpack_require__(4);
+	var Node_1 = __webpack_require__(5);
 	var NodeUtils_1 = __webpack_require__(1);
 	var Utils_1 = __webpack_require__(0);
 	
@@ -1356,7 +1367,7 @@ module.exports =
 	
 	var esprima = __webpack_require__(8);
 	var AppendState_1 = __webpack_require__(7);
-	var Node_1 = __webpack_require__(4);
+	var Node_1 = __webpack_require__(5);
 	var NodeUtils_1 = __webpack_require__(1);
 	var Utils_1 = __webpack_require__(0);
 	
@@ -1433,7 +1444,7 @@ module.exports =
 	var AppendState_1 = __webpack_require__(7);
 	var JSFuck_1 = __webpack_require__(9);
 	var NoCustomNodesPreset_1 = __webpack_require__(13);
-	var Node_1 = __webpack_require__(4);
+	var Node_1 = __webpack_require__(5);
 	var NodeUtils_1 = __webpack_require__(1);
 	var Utils_1 = __webpack_require__(0);
 	
@@ -1510,8 +1521,8 @@ module.exports =
 	
 	var escodegen = __webpack_require__(10);
 	var AppendState_1 = __webpack_require__(7);
-	var NodeType_1 = __webpack_require__(3);
-	var Node_1 = __webpack_require__(4);
+	var NodeType_1 = __webpack_require__(2);
+	var Node_1 = __webpack_require__(5);
 	var NodeUtils_1 = __webpack_require__(1);
 	var Utils_1 = __webpack_require__(0);
 	
@@ -1623,7 +1634,7 @@ module.exports =
 	var JSFuck_1 = __webpack_require__(9);
 	var NoCustomNodesPreset_1 = __webpack_require__(13);
 	var JavaScriptObfuscator_1 = __webpack_require__(11);
-	var Node_1 = __webpack_require__(4);
+	var Node_1 = __webpack_require__(5);
 	var NodeUtils_1 = __webpack_require__(1);
 	var Utils_1 = __webpack_require__(0);
 	
@@ -1828,10 +1839,8 @@ module.exports =
 	
 	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__(5);
+	var estraverse = __webpack_require__(3);
 	var NodeObfuscator_1 = __webpack_require__(6);
-	var Nodes_1 = __webpack_require__(2);
-	var Utils_1 = __webpack_require__(0);
 	
 	var CatchClauseObfuscator = function (_NodeObfuscator_1$Nod) {
 	    _inherits(CatchClauseObfuscator, _NodeObfuscator_1$Nod);
@@ -1863,13 +1872,8 @@ module.exports =
 	            var _this2 = this;
 	
 	            estraverse.replace(catchClauseNode.param, {
-	                leave: function leave(node, parentNode) {
-	                    if (Nodes_1.Nodes.isIdentifierNode(node) && !_this2.isReservedName(node.name)) {
-	                        _this2.catchClauseParam.set(node.name, Utils_1.Utils.getRandomVariableName());
-	                        node.name = _this2.catchClauseParam.get(node.name);
-	                        return;
-	                    }
-	                    return estraverse.VisitorOption.Skip;
+	                leave: function leave(node) {
+	                    return _this2.replaceAndStoreIdentifiersNames(node, _this2.catchClauseParam);
 	                }
 	            });
 	        }
@@ -1906,12 +1910,10 @@ module.exports =
 	
 	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__(5);
-	var NodeType_1 = __webpack_require__(3);
+	var estraverse = __webpack_require__(3);
+	var NodeType_1 = __webpack_require__(2);
 	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 FunctionDeclarationObfuscator = function (_NodeObfuscator_1$Nod) {
 	    _inherits(FunctionDeclarationObfuscator, _NodeObfuscator_1$Nod);
@@ -1947,12 +1949,7 @@ module.exports =
 	
 	            estraverse.replace(functionDeclarationNode.id, {
 	                leave: function leave(node) {
-	                    if (Nodes_1.Nodes.isIdentifierNode(node) && !_this2.isReservedName(node.name)) {
-	                        _this2.functionName.set(node.name, Utils_1.Utils.getRandomVariableName());
-	                        node.name = _this2.functionName.get(node.name);
-	                        return;
-	                    }
-	                    return estraverse.VisitorOption.Skip;
+	                    return _this2.replaceAndStoreIdentifiersNames(node, _this2.functionName);
 	                }
 	            });
 	        }
@@ -1990,10 +1987,8 @@ module.exports =
 	
 	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__(5);
+	var estraverse = __webpack_require__(3);
 	var NodeObfuscator_1 = __webpack_require__(6);
-	var Nodes_1 = __webpack_require__(2);
-	var Utils_1 = __webpack_require__(0);
 	
 	var FunctionObfuscator = function (_NodeObfuscator_1$Nod) {
 	    _inherits(FunctionObfuscator, _NodeObfuscator_1$Nod);
@@ -2027,12 +2022,7 @@ module.exports =
 	            functionNode.params.forEach(function (paramsNode) {
 	                estraverse.replace(paramsNode, {
 	                    leave: function leave(node) {
-	                        if (Nodes_1.Nodes.isIdentifierNode(node) && !_this2.isReservedName(node.name)) {
-	                            _this2.functionParams.set(node.name, Utils_1.Utils.getRandomVariableName());
-	                            node.name = _this2.functionParams.get(node.name);
-	                            return;
-	                        }
-	                        return estraverse.VisitorOption.Skip;
+	                        return _this2.replaceAndStoreIdentifiersNames(node, _this2.functionParams);
 	                    }
 	                });
 	            });
@@ -2074,7 +2064,7 @@ module.exports =
 	
 	var escodegen = __webpack_require__(10);
 	var NodeObfuscator_1 = __webpack_require__(6);
-	var Nodes_1 = __webpack_require__(2);
+	var Nodes_1 = __webpack_require__(4);
 	
 	var LiteralObfuscator = function (_NodeObfuscator_1$Nod) {
 	    _inherits(LiteralObfuscator, _NodeObfuscator_1$Nod);
@@ -2138,10 +2128,10 @@ module.exports =
 	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__(5);
-	var NodeType_1 = __webpack_require__(3);
+	var estraverse = __webpack_require__(3);
+	var NodeType_1 = __webpack_require__(2);
 	var NodeObfuscator_1 = __webpack_require__(6);
-	var Nodes_1 = __webpack_require__(2);
+	var Nodes_1 = __webpack_require__(4);
 	
 	var MemberExpressionObfuscator = function (_NodeObfuscator_1$Nod) {
 	    _inherits(MemberExpressionObfuscator, _NodeObfuscator_1$Nod);
@@ -2228,9 +2218,9 @@ module.exports =
 	
 	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__(5);
+	var estraverse = __webpack_require__(3);
 	var NodeObfuscator_1 = __webpack_require__(6);
-	var Nodes_1 = __webpack_require__(2);
+	var Nodes_1 = __webpack_require__(4);
 	var Utils_1 = __webpack_require__(0);
 	
 	var MethodDefinitionObfuscator = function (_NodeObfuscator_1$Nod) {
@@ -2297,10 +2287,10 @@ module.exports =
 	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__(5);
-	var NodeType_1 = __webpack_require__(3);
+	var estraverse = __webpack_require__(3);
+	var NodeType_1 = __webpack_require__(2);
 	var NodeObfuscator_1 = __webpack_require__(6);
-	var Nodes_1 = __webpack_require__(2);
+	var Nodes_1 = __webpack_require__(4);
 	var Utils_1 = __webpack_require__(0);
 	
 	var ObjectExpressionObfuscator = function (_NodeObfuscator_1$Nod) {
@@ -2386,10 +2376,9 @@ module.exports =
 	
 	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__(5);
-	var NodeType_1 = __webpack_require__(3);
+	var estraverse = __webpack_require__(3);
+	var NodeType_1 = __webpack_require__(2);
 	var NodeObfuscator_1 = __webpack_require__(6);
-	var Nodes_1 = __webpack_require__(2);
 	var NodeUtils_1 = __webpack_require__(1);
 	var Utils_1 = __webpack_require__(0);
 	
@@ -2428,12 +2417,7 @@ module.exports =
 	            variableDeclarationNode.declarations.forEach(function (declarationNode) {
 	                estraverse.replace(declarationNode.id, {
 	                    enter: function enter(node) {
-	                        if (Nodes_1.Nodes.isIdentifierNode(node) && !_this2.isReservedName(node.name)) {
-	                            _this2.variableNames.set(node.name, Utils_1.Utils.getRandomVariableName());
-	                            node.name = _this2.variableNames.get(node.name);
-	                            return;
-	                        }
-	                        return estraverse.VisitorOption.Skip;
+	                        return _this2.replaceAndStoreIdentifiersNames(node, _this2.variableNames);
 	                    }
 	                });
 	            });

+ 1 - 10
src/node-obfuscators/CatchClauseObfuscator.ts

@@ -35,16 +35,7 @@ export class CatchClauseObfuscator extends NodeObfuscator {
      */
     private replaceCatchClauseParam (catchClauseNode: ICatchClauseNode): void {
         estraverse.replace(catchClauseNode.param, {
-            leave: (node: INode, parentNode: INode): any => {
-                if (Nodes.isIdentifierNode(node) && !this.isReservedName(node.name)) {
-                    this.catchClauseParam.set(node.name, Utils.getRandomVariableName());
-                    node.name = this.catchClauseParam.get(node.name);
-
-                    return;
-                }
-
-                return estraverse.VisitorOption.Skip;
-            }
+            leave: (node: INode): any => this.replaceAndStoreIdentifiersNames(node, this.catchClauseParam)
         });
     }
 

+ 1 - 12
src/node-obfuscators/FunctionDeclarationObfuscator.ts

@@ -6,9 +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";
-import { Utils } from '../Utils';
 
 /**
  * replaces:
@@ -43,16 +41,7 @@ export class FunctionDeclarationObfuscator extends NodeObfuscator {
      */
     private replaceFunctionName (functionDeclarationNode: IFunctionDeclarationNode): void {
         estraverse.replace(functionDeclarationNode.id, {
-            leave: (node: INode): any => {
-                if (Nodes.isIdentifierNode(node) && !this.isReservedName(node.name)) {
-                    this.functionName.set(node.name, Utils.getRandomVariableName());
-                    node.name = this.functionName.get(node.name);
-
-                    return;
-                }
-
-                return estraverse.VisitorOption.Skip;
-            }
+            leave: (node: INode): any => this.replaceAndStoreIdentifiersNames(node, this.functionName)
         });
     }
 

+ 1 - 10
src/node-obfuscators/FunctionObfuscator.ts

@@ -36,16 +36,7 @@ export class FunctionObfuscator extends NodeObfuscator {
     private replaceFunctionParams (functionNode: IFunctionNode): void {
         functionNode.params.forEach((paramsNode: INode) => {
             estraverse.replace(paramsNode, {
-                leave: (node: INode): any => {
-                    if (Nodes.isIdentifierNode(node) && !this.isReservedName(node.name)) {
-                        this.functionParams.set(node.name, Utils.getRandomVariableName());
-                        node.name = this.functionParams.get(node.name);
-
-                        return;
-                    }
-
-                    return estraverse.VisitorOption.Skip;
-                }
+                leave: (node: INode): any => this.replaceAndStoreIdentifiersNames(node, this.functionParams)
             });
         });
     }

+ 21 - 0
src/node-obfuscators/NodeObfuscator.ts

@@ -1,3 +1,5 @@
+import * as estraverse from 'estraverse';
+
 import { ICustomNode } from '../interfaces/ICustomNode';
 import { INodeObfuscator } from '../interfaces/INodeObfuscator';
 import { INode } from "../interfaces/nodes/INode";
@@ -46,6 +48,25 @@ export abstract class NodeObfuscator implements INodeObfuscator {
             });
     }
 
+    /**
+     * Replaces all identifiers names in specified node with new random names and stores that names in given `namesMap`.
+     * Reserved names will be ignored.
+     *
+     * @param node
+     * @param namesMap
+     * @returns {estraverse.VisitorOption}
+     */
+    protected replaceAndStoreIdentifiersNames (node: INode, namesMap: Map <string, string>): estraverse.VisitorOption {
+        if (Nodes.isIdentifierNode(node) && !this.isReservedName(node.name)) {
+            namesMap.set(node.name, Utils.getRandomVariableName());
+            node.name = namesMap.get(node.name);
+
+            return;
+        }
+
+        return estraverse.VisitorOption.Skip;
+    }
+
     /**
      * @param node
      * @param parentNode

+ 1 - 10
src/node-obfuscators/VariableDeclarationObfuscator.ts

@@ -46,16 +46,7 @@ export class VariableDeclarationObfuscator extends NodeObfuscator {
     private replaceVariableName (variableDeclarationNode: IVariableDeclarationNode): void {
         variableDeclarationNode.declarations.forEach((declarationNode: IVariableDeclaratorNode) => {
             estraverse.replace(declarationNode.id, {
-                enter: (node: INode): any => {
-                    if (Nodes.isIdentifierNode(node) && !this.isReservedName(node.name)) {
-                        this.variableNames.set(node.name, Utils.getRandomVariableName());
-                        node.name = this.variableNames.get(node.name);
-
-                        return;
-                    }
-
-                    return estraverse.VisitorOption.Skip;
-                }
+                enter: (node: INode): any => this.replaceAndStoreIdentifiersNames(node, this.variableNames)
             });
         });
     }