Kaynağa Gözat

refactoring

sanex3339 9 yıl önce
ebeveyn
işleme
861d7ecba0

+ 12 - 0
src/NodeUtils.js

@@ -2,6 +2,12 @@
 const NodeType_1 = require("./enums/NodeType");
 const Utils_1 = require("./Utils");
 class NodeUtils {
+    static getBlockScopeNodeByIndex(node, index = 0) {
+        if (NodeUtils.isNodeHasBlockScope(node) && node.body[index]) {
+            return node.body[index];
+        }
+        return node;
+    }
     static getScopeOfNode(node, depth = 0) {
         if (node.parentNode.type === NodeType_1.NodeType.Program) {
             return node.parentNode;
@@ -41,6 +47,12 @@ class NodeUtils {
     static isMemberExpressionNode(node) {
         return node.type === NodeType_1.NodeType.MemberExpression;
     }
+    static isNodeHasBlockScope(node) {
+        return (node.type === NodeType_1.NodeType.BlockStatement ||
+            node.type === NodeType_1.NodeType.CatchClause ||
+            node.type === NodeType_1.NodeType.FunctionExpression ||
+            node.type === NodeType_1.NodeType.Program) && node.hasOwnProperty('body');
+    }
     static isProgramNode(node) {
         return node.type === NodeType_1.NodeType.Program;
     }

+ 30 - 0
src/NodeUtils.ts

@@ -10,6 +10,8 @@ import { IVariableDeclaratorNode } from "./interfaces/nodes/IVariableDeclaratorN
 import { NodeType } from "./enums/NodeType";
 
 import { Utils } from "./Utils";
+import {ICatchClauseNode} from "./interfaces/nodes/ICatchClauseNode";
+import {IFunctionNode} from "./interfaces/nodes/IFunctionNode";
 
 export class NodeUtils {
     /**
@@ -22,6 +24,19 @@ export class NodeUtils {
         NodeType.MethodDefinition
     ];
 
+    /**
+     * @param node
+     * @param index
+     * @returns {ITreeNode}
+     */
+    public static getBlockScopeNodeByIndex (node: ITreeNode, index: number = 0): ITreeNode {
+        if (NodeUtils.isNodeHasBlockScope(node) && node.body[index]) {
+            return node.body[index];
+        }
+
+        return node;
+    }
+
     /**
      * @param node
      * @param depth
@@ -107,6 +122,21 @@ export class NodeUtils {
         return node.type === NodeType.MemberExpression;
     }
 
+    /**
+     * @param node
+     * @returns {boolean}
+     */
+    public static isNodeHasBlockScope (
+        node: ITreeNode
+    ): node is IBlockStatementNode|ICatchClauseNode|IFunctionNode|IProgramNode {
+        return (
+            node.type === NodeType.BlockStatement ||
+            node.type === NodeType.CatchClause ||
+            node.type === NodeType.FunctionExpression ||
+            node.type === NodeType.Program
+        ) && node.hasOwnProperty('body');
+    }
+
     /**
      *
      * @param node

+ 0 - 2
src/nodes/DebugProtectionFunctionCallNode.ts

@@ -1,5 +1,3 @@
-/* tslint:disable:max-line-length */
-
 import * as estraverse from 'estraverse';
 
 import { ITreeNode } from '../interfaces/nodes/ITreeNode';

+ 0 - 2
src/nodes/DebugProtectionFunctionIntervalNode.ts

@@ -1,5 +1,3 @@
-/* tslint:disable:max-line-length */
-
 import * as estraverse from 'estraverse';
 
 import { ITreeNode } from '../interfaces/nodes/ITreeNode';

+ 20 - 662
src/nodes/DebugProtectionFunctionNode.js

@@ -1,6 +1,6 @@
 "use strict";
+const esprima = require('esprima');
 const estraverse = require('estraverse');
-const NodeType_1 = require('../enums/NodeType');
 const Node_1 = require('./Node');
 const NodeUtils_1 = require('../NodeUtils');
 class DebugProtectionFunctionNode extends Node_1.Node {
@@ -22,669 +22,27 @@ class DebugProtectionFunctionNode extends Node_1.Node {
             }
         });
     }
+    getNodeIdentifier() {
+        return this.debugProtectionFunctionName;
+    }
     getNodeStructure() {
-        return {
-            'type': NodeType_1.NodeType.VariableDeclaration,
-            'declarations': [
-                {
-                    'type': NodeType_1.NodeType.VariableDeclarator,
-                    'id': {
-                        'type': NodeType_1.NodeType.Identifier,
-                        'name': this.debugProtectionFunctionName
-                    },
-                    'init': {
-                        'type': NodeType_1.NodeType.FunctionExpression,
-                        'id': null,
-                        'params': [],
-                        'defaults': [],
-                        'body': {
-                            'type': NodeType_1.NodeType.BlockStatement,
-                            'body': [
-                                {
-                                    'type': NodeType_1.NodeType.FunctionDeclaration,
-                                    'id': {
-                                        'type': NodeType_1.NodeType.Identifier,
-                                        'name': 'debuggerProtection'
-                                    },
-                                    'params': [
-                                        {
-                                            'type': NodeType_1.NodeType.Identifier,
-                                            'name': 'counter'
-                                        }
-                                    ],
-                                    'defaults': [],
-                                    'body': {
-                                        'type': NodeType_1.NodeType.BlockStatement,
-                                        'body': [
-                                            {
-                                                'type': NodeType_1.NodeType.IfStatement,
-                                                'test': {
-                                                    'type': NodeType_1.NodeType.LogicalExpression,
-                                                    'operator': '||',
-                                                    'left': {
-                                                        'type': NodeType_1.NodeType.BinaryExpression,
-                                                        'operator': '!==',
-                                                        'left': {
-                                                            'type': NodeType_1.NodeType.MemberExpression,
-                                                            'computed': true,
-                                                            'object': {
-                                                                'type': NodeType_1.NodeType.BinaryExpression,
-                                                                'operator': '+',
-                                                                'left': {
-                                                                    'type': NodeType_1.NodeType.Literal,
-                                                                    'value': '',
-                                                                    'raw': "''"
-                                                                },
-                                                                'right': {
-                                                                    'type': NodeType_1.NodeType.BinaryExpression,
-                                                                    'operator': '/',
-                                                                    'left': {
-                                                                        'type': NodeType_1.NodeType.Identifier,
-                                                                        'name': 'counter'
-                                                                    },
-                                                                    'right': {
-                                                                        'type': NodeType_1.NodeType.Identifier,
-                                                                        'name': 'counter'
-                                                                    }
-                                                                }
-                                                            },
-                                                            'property': {
-                                                                'type': NodeType_1.NodeType.Literal,
-                                                                'value': 'length',
-                                                                'raw': "'length'"
-                                                            }
-                                                        },
-                                                        'right': {
-                                                            'type': NodeType_1.NodeType.Literal,
-                                                            'value': 1,
-                                                            'raw': "1"
-                                                        }
-                                                    },
-                                                    'right': {
-                                                        'type': NodeType_1.NodeType.BinaryExpression,
-                                                        'operator': '===',
-                                                        'left': {
-                                                            'type': NodeType_1.NodeType.BinaryExpression,
-                                                            'operator': '%',
-                                                            'left': {
-                                                                'type': NodeType_1.NodeType.Identifier,
-                                                                'name': 'counter'
-                                                            },
-                                                            'right': {
-                                                                'type': NodeType_1.NodeType.Literal,
-                                                                'value': 20,
-                                                                'raw': "20"
-                                                            }
-                                                        },
-                                                        'right': {
-                                                            'type': NodeType_1.NodeType.Literal,
-                                                            'value': 0,
-                                                            'raw': "0"
-                                                        }
-                                                    }
-                                                },
-                                                'consequent': {
-                                                    'type': NodeType_1.NodeType.BlockStatement,
-                                                    'body': [
-                                                        {
-                                                            'type': NodeType_1.NodeType.ExpressionStatement,
-                                                            'expression': {
-                                                                'type': NodeType_1.NodeType.CallExpression,
-                                                                'callee': {
-                                                                    'type': NodeType_1.NodeType.CallExpression,
-                                                                    'callee': {
-                                                                        'type': NodeType_1.NodeType.MemberExpression,
-                                                                        'computed': false,
-                                                                        'object': {
-                                                                            'type': NodeType_1.NodeType.FunctionExpression,
-                                                                            'id': null,
-                                                                            'params': [],
-                                                                            'defaults': [],
-                                                                            'body': {
-                                                                                'type': NodeType_1.NodeType.BlockStatement,
-                                                                                'body': []
-                                                                            },
-                                                                            'generator': false,
-                                                                            'expression': false
-                                                                        },
-                                                                        'property': {
-                                                                            'type': NodeType_1.NodeType.Identifier,
-                                                                            'name': 'constructor'
-                                                                        }
-                                                                    },
-                                                                    'arguments': [
-                                                                        {
-                                                                            'type': NodeType_1.NodeType.Literal,
-                                                                            'value': 'debugger',
-                                                                            'raw': "'debugger'"
-                                                                        }
-                                                                    ]
-                                                                },
-                                                                'arguments': []
-                                                            }
-                                                        }
-                                                    ]
-                                                },
-                                                'alternate': {
-                                                    'type': NodeType_1.NodeType.BlockStatement,
-                                                    'body': [
-                                                        {
-                                                            'type': NodeType_1.NodeType.VariableDeclaration,
-                                                            'declarations': [
-                                                                {
-                                                                    'type': NodeType_1.NodeType.VariableDeclarator,
-                                                                    'id': {
-                                                                        'type': NodeType_1.NodeType.Identifier,
-                                                                        'name': '_0x793b'
-                                                                    },
-                                                                    'init': {
-                                                                        'type': NodeType_1.NodeType.ArrayExpression,
-                                                                        'elements': [
-                                                                            {
-                                                                                'type': NodeType_1.NodeType.Literal,
-                                                                                'value': 'filter',
-                                                                                'raw': "'\\u0066\\u0069\\u006c\\u0074\\u0065\\u0072'"
-                                                                            },
-                                                                            {
-                                                                                'type': NodeType_1.NodeType.Literal,
-                                                                                'value': 'constructor',
-                                                                                'raw': "'\\u0063\\u006f\\u006e\\u0073\\u0074\\u0072\\u0075\\u0063\\u0074\\u006f\\u0072'"
-                                                                            },
-                                                                            {
-                                                                                'type': NodeType_1.NodeType.Literal,
-                                                                                'value': '',
-                                                                                'raw': "''"
-                                                                            },
-                                                                            {
-                                                                                'type': NodeType_1.NodeType.Literal,
-                                                                                'value': 'return{}',
-                                                                                'raw': "'\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u007b\\u007d'"
-                                                                            }
-                                                                        ]
-                                                                    }
-                                                                }
-                                                            ],
-                                                            'kind': 'var'
-                                                        },
-                                                        {
-                                                            'type': NodeType_1.NodeType.ExpressionStatement,
-                                                            'expression': {
-                                                                'type': NodeType_1.NodeType.CallExpression,
-                                                                'callee': {
-                                                                    'type': NodeType_1.NodeType.CallExpression,
-                                                                    'callee': {
-                                                                        'type': NodeType_1.NodeType.MemberExpression,
-                                                                        'computed': true,
-                                                                        'object': {
-                                                                            'type': NodeType_1.NodeType.MemberExpression,
-                                                                            'computed': true,
-                                                                            'object': {
-                                                                                'type': NodeType_1.NodeType.ArrayExpression,
-                                                                                'elements': []
-                                                                            },
-                                                                            'property': {
-                                                                                'type': NodeType_1.NodeType.MemberExpression,
-                                                                                'computed': true,
-                                                                                'object': {
-                                                                                    'type': NodeType_1.NodeType.Identifier,
-                                                                                    'name': '_0x793b'
-                                                                                },
-                                                                                'property': {
-                                                                                    'type': NodeType_1.NodeType.Literal,
-                                                                                    'value': 0,
-                                                                                    'raw': "0x0"
-                                                                                }
-                                                                            }
-                                                                        },
-                                                                        'property': {
-                                                                            'type': NodeType_1.NodeType.MemberExpression,
-                                                                            'computed': true,
-                                                                            'object': {
-                                                                                'type': NodeType_1.NodeType.Identifier,
-                                                                                'name': '_0x793b'
-                                                                            },
-                                                                            'property': {
-                                                                                'type': NodeType_1.NodeType.Literal,
-                                                                                'value': 1,
-                                                                                'raw': "0x1"
-                                                                            }
-                                                                        }
-                                                                    },
-                                                                    'arguments': [
-                                                                        {
-                                                                            'type': NodeType_1.NodeType.BinaryExpression,
-                                                                            'operator': '+',
-                                                                            'left': {
-                                                                                'type': NodeType_1.NodeType.BinaryExpression,
-                                                                                'operator': '+',
-                                                                                'left': {
-                                                                                    'type': NodeType_1.NodeType.BinaryExpression,
-                                                                                    'operator': '+',
-                                                                                    'left': {
-                                                                                        'type': NodeType_1.NodeType.BinaryExpression,
-                                                                                        'operator': '+',
-                                                                                        'left': {
-                                                                                            'type': NodeType_1.NodeType.BinaryExpression,
-                                                                                            'operator': '+',
-                                                                                            'left': {
-                                                                                                'type': NodeType_1.NodeType.BinaryExpression,
-                                                                                                'operator': '+',
-                                                                                                'left': {
-                                                                                                    'type': NodeType_1.NodeType.BinaryExpression,
-                                                                                                    'operator': '+',
-                                                                                                    'left': {
-                                                                                                        'type': NodeType_1.NodeType.MemberExpression,
-                                                                                                        'computed': true,
-                                                                                                        'object': {
-                                                                                                            'type': NodeType_1.NodeType.BinaryExpression,
-                                                                                                            'operator': '+',
-                                                                                                            'left': {
-                                                                                                                'type': NodeType_1.NodeType.Identifier,
-                                                                                                                'name': 'undefined'
-                                                                                                            },
-                                                                                                            'right': {
-                                                                                                                'type': NodeType_1.NodeType.MemberExpression,
-                                                                                                                'computed': true,
-                                                                                                                'object': {
-                                                                                                                    'type': NodeType_1.NodeType.Identifier,
-                                                                                                                    'name': '_0x793b'
-                                                                                                                },
-                                                                                                                'property': {
-                                                                                                                    'type': NodeType_1.NodeType.Literal,
-                                                                                                                    'value': 2,
-                                                                                                                    'raw': "0x2"
-                                                                                                                }
-                                                                                                            }
-                                                                                                        },
-                                                                                                        'property': {
-                                                                                                            'type': NodeType_1.NodeType.Literal,
-                                                                                                            'value': 2,
-                                                                                                            'raw': "0x2"
-                                                                                                        }
-                                                                                                    },
-                                                                                                    'right': {
-                                                                                                        'type': NodeType_1.NodeType.MemberExpression,
-                                                                                                        'computed': true,
-                                                                                                        'object': {
-                                                                                                            'type': NodeType_1.NodeType.BinaryExpression,
-                                                                                                            'operator': '+',
-                                                                                                            'left': {
-                                                                                                                'type': NodeType_1.NodeType.UnaryExpression,
-                                                                                                                'operator': '!',
-                                                                                                                'argument': {
-                                                                                                                    'type': NodeType_1.NodeType.UnaryExpression,
-                                                                                                                    'operator': '!',
-                                                                                                                    'argument': {
-                                                                                                                        'type': NodeType_1.NodeType.ArrayExpression,
-                                                                                                                        'elements': []
-                                                                                                                    },
-                                                                                                                    'prefix': true
-                                                                                                                },
-                                                                                                                'prefix': true
-                                                                                                            },
-                                                                                                            'right': {
-                                                                                                                'type': NodeType_1.NodeType.MemberExpression,
-                                                                                                                'computed': true,
-                                                                                                                'object': {
-                                                                                                                    'type': NodeType_1.NodeType.Identifier,
-                                                                                                                    'name': '_0x793b'
-                                                                                                                },
-                                                                                                                'property': {
-                                                                                                                    'type': NodeType_1.NodeType.Literal,
-                                                                                                                    'value': 2,
-                                                                                                                    'raw': "0x2"
-                                                                                                                }
-                                                                                                            }
-                                                                                                        },
-                                                                                                        'property': {
-                                                                                                            'type': NodeType_1.NodeType.Literal,
-                                                                                                            'value': 3,
-                                                                                                            'raw': "0x3"
-                                                                                                        }
-                                                                                                    }
-                                                                                                },
-                                                                                                'right': {
-                                                                                                    'type': NodeType_1.NodeType.MemberExpression,
-                                                                                                    'computed': true,
-                                                                                                    'object': {
-                                                                                                        'type': NodeType_1.NodeType.BinaryExpression,
-                                                                                                        'operator': '+',
-                                                                                                        'left': {
-                                                                                                            'type': NodeType_1.NodeType.CallExpression,
-                                                                                                            'callee': {
-                                                                                                                'type': NodeType_1.NodeType.CallExpression,
-                                                                                                                'callee': {
-                                                                                                                    'type': NodeType_1.NodeType.Identifier,
-                                                                                                                    'name': 'Function'
-                                                                                                                },
-                                                                                                                'arguments': [
-                                                                                                                    {
-                                                                                                                        'type': NodeType_1.NodeType.MemberExpression,
-                                                                                                                        'computed': true,
-                                                                                                                        'object': {
-                                                                                                                            'type': NodeType_1.NodeType.Identifier,
-                                                                                                                            'name': '_0x793b'
-                                                                                                                        },
-                                                                                                                        'property': {
-                                                                                                                            'type': NodeType_1.NodeType.Literal,
-                                                                                                                            'value': 3,
-                                                                                                                            'raw': "0x3"
-                                                                                                                        }
-                                                                                                                    }
-                                                                                                                ]
-                                                                                                            },
-                                                                                                            'arguments': []
-                                                                                                        },
-                                                                                                        'right': {
-                                                                                                            'type': NodeType_1.NodeType.MemberExpression,
-                                                                                                            'computed': true,
-                                                                                                            'object': {
-                                                                                                                'type': NodeType_1.NodeType.Identifier,
-                                                                                                                'name': '_0x793b'
-                                                                                                            },
-                                                                                                            'property': {
-                                                                                                                'type': NodeType_1.NodeType.Literal,
-                                                                                                                'value': 2,
-                                                                                                                'raw': "0x2"
-                                                                                                            }
-                                                                                                        }
-                                                                                                    },
-                                                                                                    'property': {
-                                                                                                        'type': NodeType_1.NodeType.Literal,
-                                                                                                        'value': 2,
-                                                                                                        'raw': "0x2"
-                                                                                                    }
-                                                                                                }
-                                                                                            },
-                                                                                            'right': {
-                                                                                                'type': NodeType_1.NodeType.MemberExpression,
-                                                                                                'computed': true,
-                                                                                                'object': {
-                                                                                                    'type': NodeType_1.NodeType.BinaryExpression,
-                                                                                                    'operator': '+',
-                                                                                                    'left': {
-                                                                                                        'type': NodeType_1.NodeType.Identifier,
-                                                                                                        'name': 'undefined'
-                                                                                                    },
-                                                                                                    'right': {
-                                                                                                        'type': NodeType_1.NodeType.MemberExpression,
-                                                                                                        'computed': true,
-                                                                                                        'object': {
-                                                                                                            'type': NodeType_1.NodeType.Identifier,
-                                                                                                            'name': '_0x793b'
-                                                                                                        },
-                                                                                                        'property': {
-                                                                                                            'type': NodeType_1.NodeType.Literal,
-                                                                                                            'value': 2,
-                                                                                                            'raw': "0x2"
-                                                                                                        }
-                                                                                                    }
-                                                                                                },
-                                                                                                'property': {
-                                                                                                    'type': NodeType_1.NodeType.Literal,
-                                                                                                    'value': 0,
-                                                                                                    'raw': "0x0"
-                                                                                                }
-                                                                                            }
-                                                                                        },
-                                                                                        'right': {
-                                                                                            'type': NodeType_1.NodeType.MemberExpression,
-                                                                                            'computed': true,
-                                                                                            'object': {
-                                                                                                'type': NodeType_1.NodeType.BinaryExpression,
-                                                                                                'operator': '+',
-                                                                                                'left': {
-                                                                                                    'type': NodeType_1.NodeType.BinaryExpression,
-                                                                                                    'operator': '+',
-                                                                                                    'left': {
-                                                                                                        'type': NodeType_1.NodeType.UnaryExpression,
-                                                                                                        'operator': '!',
-                                                                                                        'argument': {
-                                                                                                            'type': NodeType_1.NodeType.ArrayExpression,
-                                                                                                            'elements': []
-                                                                                                        },
-                                                                                                        'prefix': true
-                                                                                                    },
-                                                                                                    'right': {
-                                                                                                        'type': NodeType_1.NodeType.ArrayExpression,
-                                                                                                        'elements': [
-                                                                                                            {
-                                                                                                                'type': NodeType_1.NodeType.Literal,
-                                                                                                                'value': 0,
-                                                                                                                'raw': "0x0"
-                                                                                                            }
-                                                                                                        ]
-                                                                                                    }
-                                                                                                },
-                                                                                                'right': {
-                                                                                                    'type': NodeType_1.NodeType.Identifier,
-                                                                                                    'name': 'String'
-                                                                                                }
-                                                                                            },
-                                                                                            'property': {
-                                                                                                'type': NodeType_1.NodeType.Literal,
-                                                                                                'value': 20,
-                                                                                                'raw': "0x14"
-                                                                                            }
-                                                                                        }
-                                                                                    },
-                                                                                    'right': {
-                                                                                        'type': NodeType_1.NodeType.MemberExpression,
-                                                                                        'computed': true,
-                                                                                        'object': {
-                                                                                            'type': NodeType_1.NodeType.BinaryExpression,
-                                                                                            'operator': '+',
-                                                                                            'left': {
-                                                                                                'type': NodeType_1.NodeType.BinaryExpression,
-                                                                                                'operator': '+',
-                                                                                                'left': {
-                                                                                                    'type': NodeType_1.NodeType.UnaryExpression,
-                                                                                                    'operator': '!',
-                                                                                                    'argument': {
-                                                                                                        'type': NodeType_1.NodeType.ArrayExpression,
-                                                                                                        'elements': []
-                                                                                                    },
-                                                                                                    'prefix': true
-                                                                                                },
-                                                                                                'right': {
-                                                                                                    'type': NodeType_1.NodeType.ArrayExpression,
-                                                                                                    'elements': [
-                                                                                                        {
-                                                                                                            'type': NodeType_1.NodeType.Literal,
-                                                                                                            'value': 0,
-                                                                                                            'raw': "0x0"
-                                                                                                        }
-                                                                                                    ]
-                                                                                                }
-                                                                                            },
-                                                                                            'right': {
-                                                                                                'type': NodeType_1.NodeType.Identifier,
-                                                                                                'name': 'String'
-                                                                                            }
-                                                                                        },
-                                                                                        'property': {
-                                                                                            'type': NodeType_1.NodeType.Literal,
-                                                                                            'value': 20,
-                                                                                            'raw': "0x14"
-                                                                                        }
-                                                                                    }
-                                                                                },
-                                                                                'right': {
-                                                                                    'type': NodeType_1.NodeType.MemberExpression,
-                                                                                    'computed': true,
-                                                                                    'object': {
-                                                                                        'type': NodeType_1.NodeType.BinaryExpression,
-                                                                                        'operator': '+',
-                                                                                        'left': {
-                                                                                            'type': NodeType_1.NodeType.UnaryExpression,
-                                                                                            'operator': '!',
-                                                                                            'argument': {
-                                                                                                'type': NodeType_1.NodeType.UnaryExpression,
-                                                                                                'operator': '!',
-                                                                                                'argument': {
-                                                                                                    'type': NodeType_1.NodeType.ArrayExpression,
-                                                                                                    'elements': []
-                                                                                                },
-                                                                                                'prefix': true
-                                                                                            },
-                                                                                            'prefix': true
-                                                                                        },
-                                                                                        'right': {
-                                                                                            'type': NodeType_1.NodeType.MemberExpression,
-                                                                                            'computed': true,
-                                                                                            'object': {
-                                                                                                'type': NodeType_1.NodeType.Identifier,
-                                                                                                'name': '_0x793b'
-                                                                                            },
-                                                                                            'property': {
-                                                                                                'type': NodeType_1.NodeType.Literal,
-                                                                                                'value': 2,
-                                                                                                'raw': "0x2"
-                                                                                            }
-                                                                                        }
-                                                                                    },
-                                                                                    'property': {
-                                                                                        'type': NodeType_1.NodeType.Literal,
-                                                                                        'value': 3,
-                                                                                        'raw': "0x3"
-                                                                                    }
-                                                                                }
-                                                                            },
-                                                                            'right': {
-                                                                                'type': NodeType_1.NodeType.MemberExpression,
-                                                                                'computed': true,
-                                                                                'object': {
-                                                                                    'type': NodeType_1.NodeType.BinaryExpression,
-                                                                                    'operator': '+',
-                                                                                    'left': {
-                                                                                        'type': NodeType_1.NodeType.UnaryExpression,
-                                                                                        'operator': '!',
-                                                                                        'argument': {
-                                                                                            'type': NodeType_1.NodeType.UnaryExpression,
-                                                                                            'operator': '!',
-                                                                                            'argument': {
-                                                                                                'type': NodeType_1.NodeType.ArrayExpression,
-                                                                                                'elements': []
-                                                                                            },
-                                                                                            'prefix': true
-                                                                                        },
-                                                                                        'prefix': true
-                                                                                    },
-                                                                                    'right': {
-                                                                                        'type': NodeType_1.NodeType.MemberExpression,
-                                                                                        'computed': true,
-                                                                                        'object': {
-                                                                                            'type': NodeType_1.NodeType.Identifier,
-                                                                                            'name': '_0x793b'
-                                                                                        },
-                                                                                        'property': {
-                                                                                            'type': NodeType_1.NodeType.Literal,
-                                                                                            'value': 2,
-                                                                                            'raw': "0x2"
-                                                                                        }
-                                                                                    }
-                                                                                },
-                                                                                'property': {
-                                                                                    'type': NodeType_1.NodeType.Literal,
-                                                                                    'value': 1,
-                                                                                    'raw': "0x1"
-                                                                                }
-                                                                            }
-                                                                        }
-                                                                    ]
-                                                                },
-                                                                'arguments': []
-                                                            }
-                                                        }
-                                                    ]
-                                                }
-                                            },
-                                            {
-                                                'type': NodeType_1.NodeType.ExpressionStatement,
-                                                'expression': {
-                                                    'type': NodeType_1.NodeType.CallExpression,
-                                                    'callee': {
-                                                        'type': NodeType_1.NodeType.Identifier,
-                                                        'name': 'debuggerProtection'
-                                                    },
-                                                    'arguments': [
-                                                        {
-                                                            'type': NodeType_1.NodeType.UpdateExpression,
-                                                            'operator': '++',
-                                                            'argument': {
-                                                                'type': NodeType_1.NodeType.Identifier,
-                                                                'name': 'counter'
-                                                            },
-                                                            'prefix': true
-                                                        }
-                                                    ]
-                                                }
-                                            }
-                                        ]
-                                    },
-                                    'generator': false,
-                                    'expression': false
-                                },
-                                {
-                                    'type': NodeType_1.NodeType.TryStatement,
-                                    'block': {
-                                        'type': NodeType_1.NodeType.BlockStatement,
-                                        'body': [
-                                            {
-                                                'type': NodeType_1.NodeType.ExpressionStatement,
-                                                'expression': {
-                                                    'type': NodeType_1.NodeType.CallExpression,
-                                                    'callee': {
-                                                        'type': NodeType_1.NodeType.Identifier,
-                                                        'name': 'debuggerProtection'
-                                                    },
-                                                    'arguments': [
-                                                        {
-                                                            'type': NodeType_1.NodeType.Literal,
-                                                            'value': 0,
-                                                            'raw': "0"
-                                                        }
-                                                    ]
-                                                }
-                                            }
-                                        ]
-                                    },
-                                    'guardedHandlers': [],
-                                    'handlers': [
-                                        {
-                                            'type': NodeType_1.NodeType.CatchClause,
-                                            'param': {
-                                                'type': NodeType_1.NodeType.Identifier,
-                                                'name': 'y'
-                                            },
-                                            'body': {
-                                                'type': NodeType_1.NodeType.BlockStatement,
-                                                'body': []
-                                            }
-                                        }
-                                    ],
-                                    'handler': {
-                                        'type': NodeType_1.NodeType.CatchClause,
-                                        'param': {
-                                            'type': NodeType_1.NodeType.Identifier,
-                                            'name': 'y'
-                                        },
-                                        'body': {
-                                            'type': NodeType_1.NodeType.BlockStatement,
-                                            'body': []
-                                        }
-                                    },
-                                    'finalizer': null
-                                }
-                            ]
-                        },
-                        'generator': false,
-                        'expression': false
+        return NodeUtils_1.NodeUtils.getBlockScopeNodeByIndex(esprima.parse(`
+                var ${this.debugProtectionFunctionName} = function () {
+                    function debuggerProtection (counter) {
+                        if (('' + counter / counter)['length'] !== 1 || counter % 20 === 0) {
+                            (function () {}.constructor('debugger')());
+                        } else {
+                            [].filter.constructor((undefined + '')[2] + (!![] + '')[3] + (Function('return{}')() + '')[2] + (undefined + '')[0] + (![] + [0] + String)[20] + (![] + [0] + String)[20] + (!![] + '')[3] + (!![] + '')[1])();
+                        }
+                        
+                        debuggerProtection(++counter);
                     }
-                }
-            ],
-            'kind': 'var'
-        };
+                    
+                    try {
+                        debuggerProtection(0);
+                    } catch (y) {}
+                };
+            `));
     }
 }
 exports.DebugProtectionFunctionNode = DebugProtectionFunctionNode;

+ 28 - 665
src/nodes/DebugProtectionFunctionNode.ts

@@ -1,11 +1,8 @@
-/* tslint:disable:max-line-length */
-
+import * as esprima from 'esprima';
 import * as estraverse from 'estraverse';
 
 import { ITreeNode } from '../interfaces/nodes/ITreeNode';
 
-import { NodeType } from '../enums/NodeType';
-
 import { Node } from './Node';
 import { NodeUtils } from '../NodeUtils';
 
@@ -63,670 +60,36 @@ export class DebugProtectionFunctionNode extends Node {
     }
 
     /**
+     * @returns {string}
+     */
+    public getNodeIdentifier (): string {
+        return this.debugProtectionFunctionName;
+    }
+
+    /**
+     * Found this trick in JScrambler
+     *
      * @returns any
      */
     protected getNodeStructure (): any {
-        return {
-            'type': NodeType.VariableDeclaration,
-            'declarations': [
-                {
-                    'type': NodeType.VariableDeclarator,
-                    'id': {
-                        'type': NodeType.Identifier,
-                        'name': this.debugProtectionFunctionName
-                    },
-                    'init': {
-                        'type': NodeType.FunctionExpression,
-                        'id': null,
-                        'params': [],
-                        'defaults': [],
-                        'body': {
-                            'type': NodeType.BlockStatement,
-                            'body': [
-                                {
-                                    'type': NodeType.FunctionDeclaration,
-                                    'id': {
-                                        'type': NodeType.Identifier,
-                                        'name': 'debuggerProtection'
-                                    },
-                                    'params': [
-                                        {
-                                            'type': NodeType.Identifier,
-                                            'name': 'counter'
-                                        }
-                                    ],
-                                    'defaults': [],
-                                    'body': {
-                                        'type': NodeType.BlockStatement,
-                                        'body': [
-                                            {
-                                                'type': NodeType.IfStatement,
-                                                'test': {
-                                                    'type': NodeType.LogicalExpression,
-                                                    'operator': '||',
-                                                    'left': {
-                                                        'type': NodeType.BinaryExpression,
-                                                        'operator': '!==',
-                                                        'left': {
-                                                            'type': NodeType.MemberExpression,
-                                                            'computed': true,
-                                                            'object': {
-                                                                'type': NodeType.BinaryExpression,
-                                                                'operator': '+',
-                                                                'left': {
-                                                                    'type': NodeType.Literal,
-                                                                    'value': '',
-                                                                    'raw': "''"
-                                                                },
-                                                                'right': {
-                                                                    'type': NodeType.BinaryExpression,
-                                                                    'operator': '/',
-                                                                    'left': {
-                                                                        'type': NodeType.Identifier,
-                                                                        'name': 'counter'
-                                                                    },
-                                                                    'right': {
-                                                                        'type': NodeType.Identifier,
-                                                                        'name': 'counter'
-                                                                    }
-                                                                }
-                                                            },
-                                                            'property': {
-                                                                'type': NodeType.Literal,
-                                                                'value': 'length',
-                                                                'raw': "'length'"
-                                                            }
-                                                        },
-                                                        'right': {
-                                                            'type': NodeType.Literal,
-                                                            'value': 1,
-                                                            'raw': "1"
-                                                        }
-                                                    },
-                                                    'right': {
-                                                        'type': NodeType.BinaryExpression,
-                                                        'operator': '===',
-                                                        'left': {
-                                                            'type': NodeType.BinaryExpression,
-                                                            'operator': '%',
-                                                            'left': {
-                                                                'type': NodeType.Identifier,
-                                                                'name': 'counter'
-                                                            },
-                                                            'right': {
-                                                                'type': NodeType.Literal,
-                                                                'value': 20,
-                                                                'raw': "20"
-                                                            }
-                                                        },
-                                                        'right': {
-                                                            'type': NodeType.Literal,
-                                                            'value': 0,
-                                                            'raw': "0"
-                                                        }
-                                                    }
-                                                },
-                                                'consequent': {
-                                                    'type': NodeType.BlockStatement,
-                                                    'body': [
-                                                        {
-                                                            'type': NodeType.ExpressionStatement,
-                                                            'expression': {
-                                                                'type': NodeType.CallExpression,
-                                                                'callee': {
-                                                                    'type': NodeType.CallExpression,
-                                                                    'callee': {
-                                                                        'type': NodeType.MemberExpression,
-                                                                        'computed': false,
-                                                                        'object': {
-                                                                            'type': NodeType.FunctionExpression,
-                                                                            'id': null,
-                                                                            'params': [],
-                                                                            'defaults': [],
-                                                                            'body': {
-                                                                                'type': NodeType.BlockStatement,
-                                                                                'body': []
-                                                                            },
-                                                                            'generator': false,
-                                                                            'expression': false
-                                                                        },
-                                                                        'property': {
-                                                                            'type': NodeType.Identifier,
-                                                                            'name': 'constructor'
-                                                                        }
-                                                                    },
-                                                                    'arguments': [
-                                                                        {
-                                                                            'type': NodeType.Literal,
-                                                                            'value': 'debugger',
-                                                                            'raw': "'debugger'"
-                                                                        }
-                                                                    ]
-                                                                },
-                                                                'arguments': []
-                                                            }
-                                                        }
-                                                    ]
-                                                },
-                                                'alternate': {
-                                                    'type': NodeType.BlockStatement,
-                                                    'body': [
-                                                        {
-                                                            'type': NodeType.VariableDeclaration,
-                                                            'declarations': [
-                                                                {
-                                                                    'type': NodeType.VariableDeclarator,
-                                                                    'id': {
-                                                                        'type': NodeType.Identifier,
-                                                                        'name': '_0x793b'
-                                                                    },
-                                                                    'init': {
-                                                                        'type': NodeType.ArrayExpression,
-                                                                        'elements': [
-                                                                            {
-                                                                                'type': NodeType.Literal,
-                                                                                'value': 'filter',
-                                                                                'raw': "'\\u0066\\u0069\\u006c\\u0074\\u0065\\u0072'"
-                                                                            },
-                                                                            {
-                                                                                'type': NodeType.Literal,
-                                                                                'value': 'constructor',
-                                                                                'raw': "'\\u0063\\u006f\\u006e\\u0073\\u0074\\u0072\\u0075\\u0063\\u0074\\u006f\\u0072'"
-                                                                            },
-                                                                            {
-                                                                                'type': NodeType.Literal,
-                                                                                'value': '',
-                                                                                'raw': "''"
-                                                                            },
-                                                                            {
-                                                                                'type': NodeType.Literal,
-                                                                                'value': 'return{}',
-                                                                                'raw': "'\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u007b\\u007d'"
-                                                                            }
-                                                                        ]
-                                                                    }
-                                                                }
-                                                            ],
-                                                            'kind': 'var'
-                                                        },
-                                                        {
-                                                            'type': NodeType.ExpressionStatement,
-                                                            'expression': {
-                                                                'type': NodeType.CallExpression,
-                                                                'callee': {
-                                                                    'type': NodeType.CallExpression,
-                                                                    'callee': {
-                                                                        'type': NodeType.MemberExpression,
-                                                                        'computed': true,
-                                                                        'object': {
-                                                                            'type': NodeType.MemberExpression,
-                                                                            'computed': true,
-                                                                            'object': {
-                                                                                'type': NodeType.ArrayExpression,
-                                                                                'elements': []
-                                                                            },
-                                                                            'property': {
-                                                                                'type': NodeType.MemberExpression,
-                                                                                'computed': true,
-                                                                                'object': {
-                                                                                    'type': NodeType.Identifier,
-                                                                                    'name': '_0x793b'
-                                                                                },
-                                                                                'property': {
-                                                                                    'type': NodeType.Literal,
-                                                                                    'value': 0,
-                                                                                    'raw': "0x0"
-                                                                                }
-                                                                            }
-                                                                        },
-                                                                        'property': {
-                                                                            'type': NodeType.MemberExpression,
-                                                                            'computed': true,
-                                                                            'object': {
-                                                                                'type': NodeType.Identifier,
-                                                                                'name': '_0x793b'
-                                                                            },
-                                                                            'property': {
-                                                                                'type': NodeType.Literal,
-                                                                                'value': 1,
-                                                                                'raw': "0x1"
-                                                                            }
-                                                                        }
-                                                                    },
-                                                                    'arguments': [
-                                                                        {
-                                                                            'type': NodeType.BinaryExpression,
-                                                                            'operator': '+',
-                                                                            'left': {
-                                                                                'type': NodeType.BinaryExpression,
-                                                                                'operator': '+',
-                                                                                'left': {
-                                                                                    'type': NodeType.BinaryExpression,
-                                                                                    'operator': '+',
-                                                                                    'left': {
-                                                                                        'type': NodeType.BinaryExpression,
-                                                                                        'operator': '+',
-                                                                                        'left': {
-                                                                                            'type': NodeType.BinaryExpression,
-                                                                                            'operator': '+',
-                                                                                            'left': {
-                                                                                                'type': NodeType.BinaryExpression,
-                                                                                                'operator': '+',
-                                                                                                'left': {
-                                                                                                    'type': NodeType.BinaryExpression,
-                                                                                                    'operator': '+',
-                                                                                                    'left': {
-                                                                                                        'type': NodeType.MemberExpression,
-                                                                                                        'computed': true,
-                                                                                                        'object': {
-                                                                                                            'type': NodeType.BinaryExpression,
-                                                                                                            'operator': '+',
-                                                                                                            'left': {
-                                                                                                                'type': NodeType.Identifier,
-                                                                                                                'name': 'undefined'
-                                                                                                            },
-                                                                                                            'right': {
-                                                                                                                'type': NodeType.MemberExpression,
-                                                                                                                'computed': true,
-                                                                                                                'object': {
-                                                                                                                    'type': NodeType.Identifier,
-                                                                                                                    'name': '_0x793b'
-                                                                                                                },
-                                                                                                                'property': {
-                                                                                                                    'type': NodeType.Literal,
-                                                                                                                    'value': 2,
-                                                                                                                    'raw': "0x2"
-                                                                                                                }
-                                                                                                            }
-                                                                                                        },
-                                                                                                        'property': {
-                                                                                                            'type': NodeType.Literal,
-                                                                                                            'value': 2,
-                                                                                                            'raw': "0x2"
-                                                                                                        }
-                                                                                                    },
-                                                                                                    'right': {
-                                                                                                        'type': NodeType.MemberExpression,
-                                                                                                        'computed': true,
-                                                                                                        'object': {
-                                                                                                            'type': NodeType.BinaryExpression,
-                                                                                                            'operator': '+',
-                                                                                                            'left': {
-                                                                                                                'type': NodeType.UnaryExpression,
-                                                                                                                'operator': '!',
-                                                                                                                'argument': {
-                                                                                                                    'type': NodeType.UnaryExpression,
-                                                                                                                    'operator': '!',
-                                                                                                                    'argument': {
-                                                                                                                        'type': NodeType.ArrayExpression,
-                                                                                                                        'elements': []
-                                                                                                                    },
-                                                                                                                    'prefix': true
-                                                                                                                },
-                                                                                                                'prefix': true
-                                                                                                            },
-                                                                                                            'right': {
-                                                                                                                'type': NodeType.MemberExpression,
-                                                                                                                'computed': true,
-                                                                                                                'object': {
-                                                                                                                    'type': NodeType.Identifier,
-                                                                                                                    'name': '_0x793b'
-                                                                                                                },
-                                                                                                                'property': {
-                                                                                                                    'type': NodeType.Literal,
-                                                                                                                    'value': 2,
-                                                                                                                    'raw': "0x2"
-                                                                                                                }
-                                                                                                            }
-                                                                                                        },
-                                                                                                        'property': {
-                                                                                                            'type': NodeType.Literal,
-                                                                                                            'value': 3,
-                                                                                                            'raw': "0x3"
-                                                                                                        }
-                                                                                                    }
-                                                                                                },
-                                                                                                'right': {
-                                                                                                    'type': NodeType.MemberExpression,
-                                                                                                    'computed': true,
-                                                                                                    'object': {
-                                                                                                        'type': NodeType.BinaryExpression,
-                                                                                                        'operator': '+',
-                                                                                                        'left': {
-                                                                                                            'type': NodeType.CallExpression,
-                                                                                                            'callee': {
-                                                                                                                'type': NodeType.CallExpression,
-                                                                                                                'callee': {
-                                                                                                                    'type': NodeType.Identifier,
-                                                                                                                    'name': 'Function'
-                                                                                                                },
-                                                                                                                'arguments': [
-                                                                                                                    {
-                                                                                                                        'type': NodeType.MemberExpression,
-                                                                                                                        'computed': true,
-                                                                                                                        'object': {
-                                                                                                                            'type': NodeType.Identifier,
-                                                                                                                            'name': '_0x793b'
-                                                                                                                        },
-                                                                                                                        'property': {
-                                                                                                                            'type': NodeType.Literal,
-                                                                                                                            'value': 3,
-                                                                                                                            'raw': "0x3"
-                                                                                                                        }
-                                                                                                                    }
-                                                                                                                ]
-                                                                                                            },
-                                                                                                            'arguments': []
-                                                                                                        },
-                                                                                                        'right': {
-                                                                                                            'type': NodeType.MemberExpression,
-                                                                                                            'computed': true,
-                                                                                                            'object': {
-                                                                                                                'type': NodeType.Identifier,
-                                                                                                                'name': '_0x793b'
-                                                                                                            },
-                                                                                                            'property': {
-                                                                                                                'type': NodeType.Literal,
-                                                                                                                'value': 2,
-                                                                                                                'raw': "0x2"
-                                                                                                            }
-                                                                                                        }
-                                                                                                    },
-                                                                                                    'property': {
-                                                                                                        'type': NodeType.Literal,
-                                                                                                        'value': 2,
-                                                                                                        'raw': "0x2"
-                                                                                                    }
-                                                                                                }
-                                                                                            },
-                                                                                            'right': {
-                                                                                                'type': NodeType.MemberExpression,
-                                                                                                'computed': true,
-                                                                                                'object': {
-                                                                                                    'type': NodeType.BinaryExpression,
-                                                                                                    'operator': '+',
-                                                                                                    'left': {
-                                                                                                        'type': NodeType.Identifier,
-                                                                                                        'name': 'undefined'
-                                                                                                    },
-                                                                                                    'right': {
-                                                                                                        'type': NodeType.MemberExpression,
-                                                                                                        'computed': true,
-                                                                                                        'object': {
-                                                                                                            'type': NodeType.Identifier,
-                                                                                                            'name': '_0x793b'
-                                                                                                        },
-                                                                                                        'property': {
-                                                                                                            'type': NodeType.Literal,
-                                                                                                            'value': 2,
-                                                                                                            'raw': "0x2"
-                                                                                                        }
-                                                                                                    }
-                                                                                                },
-                                                                                                'property': {
-                                                                                                    'type': NodeType.Literal,
-                                                                                                    'value': 0,
-                                                                                                    'raw': "0x0"
-                                                                                                }
-                                                                                            }
-                                                                                        },
-                                                                                        'right': {
-                                                                                            'type': NodeType.MemberExpression,
-                                                                                            'computed': true,
-                                                                                            'object': {
-                                                                                                'type': NodeType.BinaryExpression,
-                                                                                                'operator': '+',
-                                                                                                'left': {
-                                                                                                    'type': NodeType.BinaryExpression,
-                                                                                                    'operator': '+',
-                                                                                                    'left': {
-                                                                                                        'type': NodeType.UnaryExpression,
-                                                                                                        'operator': '!',
-                                                                                                        'argument': {
-                                                                                                            'type': NodeType.ArrayExpression,
-                                                                                                            'elements': []
-                                                                                                        },
-                                                                                                        'prefix': true
-                                                                                                    },
-                                                                                                    'right': {
-                                                                                                        'type': NodeType.ArrayExpression,
-                                                                                                        'elements': [
-                                                                                                            {
-                                                                                                                'type': NodeType.Literal,
-                                                                                                                'value': 0,
-                                                                                                                'raw': "0x0"
-                                                                                                            }
-                                                                                                        ]
-                                                                                                    }
-                                                                                                },
-                                                                                                'right': {
-                                                                                                    'type': NodeType.Identifier,
-                                                                                                    'name': 'String'
-                                                                                                }
-                                                                                            },
-                                                                                            'property': {
-                                                                                                'type': NodeType.Literal,
-                                                                                                'value': 20,
-                                                                                                'raw': "0x14"
-                                                                                            }
-                                                                                        }
-                                                                                    },
-                                                                                    'right': {
-                                                                                        'type': NodeType.MemberExpression,
-                                                                                        'computed': true,
-                                                                                        'object': {
-                                                                                            'type': NodeType.BinaryExpression,
-                                                                                            'operator': '+',
-                                                                                            'left': {
-                                                                                                'type': NodeType.BinaryExpression,
-                                                                                                'operator': '+',
-                                                                                                'left': {
-                                                                                                    'type': NodeType.UnaryExpression,
-                                                                                                    'operator': '!',
-                                                                                                    'argument': {
-                                                                                                        'type': NodeType.ArrayExpression,
-                                                                                                        'elements': []
-                                                                                                    },
-                                                                                                    'prefix': true
-                                                                                                },
-                                                                                                'right': {
-                                                                                                    'type': NodeType.ArrayExpression,
-                                                                                                    'elements': [
-                                                                                                        {
-                                                                                                            'type': NodeType.Literal,
-                                                                                                            'value': 0,
-                                                                                                            'raw': "0x0"
-                                                                                                        }
-                                                                                                    ]
-                                                                                                }
-                                                                                            },
-                                                                                            'right': {
-                                                                                                'type': NodeType.Identifier,
-                                                                                                'name': 'String'
-                                                                                            }
-                                                                                        },
-                                                                                        'property': {
-                                                                                            'type': NodeType.Literal,
-                                                                                            'value': 20,
-                                                                                            'raw': "0x14"
-                                                                                        }
-                                                                                    }
-                                                                                },
-                                                                                'right': {
-                                                                                    'type': NodeType.MemberExpression,
-                                                                                    'computed': true,
-                                                                                    'object': {
-                                                                                        'type': NodeType.BinaryExpression,
-                                                                                        'operator': '+',
-                                                                                        'left': {
-                                                                                            'type': NodeType.UnaryExpression,
-                                                                                            'operator': '!',
-                                                                                            'argument': {
-                                                                                                'type': NodeType.UnaryExpression,
-                                                                                                'operator': '!',
-                                                                                                'argument': {
-                                                                                                    'type': NodeType.ArrayExpression,
-                                                                                                    'elements': []
-                                                                                                },
-                                                                                                'prefix': true
-                                                                                            },
-                                                                                            'prefix': true
-                                                                                        },
-                                                                                        'right': {
-                                                                                            'type': NodeType.MemberExpression,
-                                                                                            'computed': true,
-                                                                                            'object': {
-                                                                                                'type': NodeType.Identifier,
-                                                                                                'name': '_0x793b'
-                                                                                            },
-                                                                                            'property': {
-                                                                                                'type': NodeType.Literal,
-                                                                                                'value': 2,
-                                                                                                'raw': "0x2"
-                                                                                            }
-                                                                                        }
-                                                                                    },
-                                                                                    'property': {
-                                                                                        'type': NodeType.Literal,
-                                                                                        'value': 3,
-                                                                                        'raw': "0x3"
-                                                                                    }
-                                                                                }
-                                                                            },
-                                                                            'right': {
-                                                                                'type': NodeType.MemberExpression,
-                                                                                'computed': true,
-                                                                                'object': {
-                                                                                    'type': NodeType.BinaryExpression,
-                                                                                    'operator': '+',
-                                                                                    'left': {
-                                                                                        'type': NodeType.UnaryExpression,
-                                                                                        'operator': '!',
-                                                                                        'argument': {
-                                                                                            'type': NodeType.UnaryExpression,
-                                                                                            'operator': '!',
-                                                                                            'argument': {
-                                                                                                'type': NodeType.ArrayExpression,
-                                                                                                'elements': []
-                                                                                            },
-                                                                                            'prefix': true
-                                                                                        },
-                                                                                        'prefix': true
-                                                                                    },
-                                                                                    'right': {
-                                                                                        'type': NodeType.MemberExpression,
-                                                                                        'computed': true,
-                                                                                        'object': {
-                                                                                            'type': NodeType.Identifier,
-                                                                                            'name': '_0x793b'
-                                                                                        },
-                                                                                        'property': {
-                                                                                            'type': NodeType.Literal,
-                                                                                            'value': 2,
-                                                                                            'raw': "0x2"
-                                                                                        }
-                                                                                    }
-                                                                                },
-                                                                                'property': {
-                                                                                    'type': NodeType.Literal,
-                                                                                    'value': 1,
-                                                                                    'raw': "0x1"
-                                                                                }
-                                                                            }
-                                                                        }
-                                                                    ]
-                                                                },
-                                                                'arguments': []
-                                                            }
-                                                        }
-                                                    ]
-                                                }
-                                            },
-                                            {
-                                                'type': NodeType.ExpressionStatement,
-                                                'expression': {
-                                                    'type': NodeType.CallExpression,
-                                                    'callee': {
-                                                        'type': NodeType.Identifier,
-                                                        'name': 'debuggerProtection'
-                                                    },
-                                                    'arguments': [
-                                                        {
-                                                            'type': NodeType.UpdateExpression,
-                                                            'operator': '++',
-                                                            'argument': {
-                                                                'type': NodeType.Identifier,
-                                                                'name': 'counter'
-                                                            },
-                                                            'prefix': true
-                                                        }
-                                                    ]
-                                                }
-                                            }
-                                        ]
-                                    },
-                                    'generator': false,
-                                    'expression': false
-                                },
-                                {
-                                    'type': NodeType.TryStatement,
-                                    'block': {
-                                        'type': NodeType.BlockStatement,
-                                        'body': [
-                                            {
-                                                'type': NodeType.ExpressionStatement,
-                                                'expression': {
-                                                    'type': NodeType.CallExpression,
-                                                    'callee': {
-                                                        'type': NodeType.Identifier,
-                                                        'name': 'debuggerProtection'
-                                                    },
-                                                    'arguments': [
-                                                        {
-                                                            'type': NodeType.Literal,
-                                                            'value': 0,
-                                                            'raw': "0"
-                                                        }
-                                                    ]
-                                                }
-                                            }
-                                        ]
-                                    },
-                                    'guardedHandlers': [],
-                                    'handlers': [
-                                        {
-                                            'type': NodeType.CatchClause,
-                                            'param': {
-                                                'type': NodeType.Identifier,
-                                                'name': 'y'
-                                            },
-                                            'body': {
-                                                'type': NodeType.BlockStatement,
-                                                'body': []
-                                            }
-                                        }
-                                    ],
-                                    'handler': {
-                                        'type': NodeType.CatchClause,
-                                        'param': {
-                                            'type': NodeType.Identifier,
-                                            'name': 'y'
-                                        },
-                                        'body': {
-                                            'type': NodeType.BlockStatement,
-                                            'body': []
-                                        }
-                                    },
-                                    'finalizer': null
-                                }
-                            ]
-                        },
-                        'generator': false,
-                        'expression': false
+        return NodeUtils.getBlockScopeNodeByIndex(
+            esprima.parse(`
+                var ${this.debugProtectionFunctionName} = function () {
+                    function debuggerProtection (counter) {
+                        if (('' + counter / counter)['length'] !== 1 || counter % 20 === 0) {
+                            (function () {}.constructor('debugger')());
+                        } else {
+                            [].filter.constructor((undefined + '')[2] + (!![] + '')[3] + (Function('return{}')() + '')[2] + (undefined + '')[0] + (![] + [0] + String)[20] + (![] + [0] + String)[20] + (!![] + '')[3] + (!![] + '')[1])();
+                        }
+                        
+                        debuggerProtection(++counter);
                     }
-                }
-            ],
-            'kind': 'var'
-        };
+                    
+                    try {
+                        debuggerProtection(0);
+                    } catch (y) {}
+                };
+            `)
+        );
     }
 }

+ 5 - 6
src/nodes/UnicodeArrayRotateFunctionCallNode.js

@@ -2,6 +2,7 @@
 const estraverse = require('estraverse');
 const NodeType_1 = require("../enums/NodeType");
 const Node_1 = require('./Node');
+const NodeUtils_1 = require("../NodeUtils");
 class UnicodeArrayRotateFunctionCallNode extends Node_1.Node {
     constructor(astTree, unicodeArrayRotateFunctionName, unicodeArrayName, unicodeArrayRotateValue) {
         super();
@@ -14,13 +15,11 @@ class UnicodeArrayRotateFunctionCallNode extends Node_1.Node {
     appendNode() {
         estraverse.replace(this.astTree, {
             leave: (node, parent) => {
-                switch (node.type) {
-                    case NodeType_1.NodeType.Program:
-                        node.body.unshift(this.getNode());
-                        break;
-                    default:
-                        break;
+                if (NodeUtils_1.NodeUtils.isProgramNode(node)) {
+                    node.body.unshift(this.getNode());
+                    return estraverse.VisitorOption.Break;
                 }
+                return estraverse.VisitorOption.Skip;
             }
         });
     }

+ 6 - 7
src/nodes/UnicodeArrayRotateFunctionCallNode.ts

@@ -6,6 +6,7 @@ import { ITreeNode } from "../interfaces/nodes/ITreeNode";
 import { NodeType } from "../enums/NodeType";
 
 import { Node } from './Node';
+import { NodeUtils } from "../NodeUtils";
 
 export class UnicodeArrayRotateFunctionCallNode extends Node {
     /**
@@ -57,15 +58,13 @@ export class UnicodeArrayRotateFunctionCallNode extends Node {
     public appendNode (): void {
         estraverse.replace(this.astTree, {
             leave: (node: ITreeNode, parent: ITreeNode): any => {
-                switch (node.type) {
-                    case NodeType.Program:
-                        (<IProgramNode>node).body.unshift(this.getNode());
+                if (NodeUtils.isProgramNode(node)) {
+                    node.body.unshift(this.getNode());
 
-                        break;
-
-                    default:
-                        break;
+                    return estraverse.VisitorOption.Break;
                 }
+
+                return estraverse.VisitorOption.Skip;
             }
         });
     }

+ 5 - 6
src/nodes/UnicodeArrayRotateFunctionNode.js

@@ -2,6 +2,7 @@
 const estraverse = require('estraverse');
 const NodeType_1 = require("../enums/NodeType");
 const Node_1 = require('./Node');
+const NodeUtils_1 = require("../NodeUtils");
 const Utils_1 = require('../Utils');
 class UnicodeArrayRotateFunctionNode extends Node_1.Node {
     constructor(astTree, unicodeArrayRotateFunctionName, unicodeArrayName) {
@@ -14,13 +15,11 @@ class UnicodeArrayRotateFunctionNode extends Node_1.Node {
     appendNode() {
         estraverse.replace(this.astTree, {
             leave: (node, parent) => {
-                switch (node.type) {
-                    case NodeType_1.NodeType.Program:
-                        node.body.push(this.getNode());
-                        break;
-                    default:
-                        break;
+                if (NodeUtils_1.NodeUtils.isProgramNode(node)) {
+                    node.body.push(this.getNode());
+                    return estraverse.VisitorOption.Break;
                 }
+                return estraverse.VisitorOption.Skip;
             }
         });
     }

+ 6 - 7
src/nodes/UnicodeArrayRotateFunctionNode.ts

@@ -6,6 +6,7 @@ import { ITreeNode } from '../interfaces/nodes/ITreeNode';
 import { NodeType } from "../enums/NodeType";
 
 import { Node } from './Node';
+import { NodeUtils } from "../NodeUtils";
 import { Utils } from '../Utils';
 
 export class UnicodeArrayRotateFunctionNode extends Node {
@@ -50,15 +51,13 @@ export class UnicodeArrayRotateFunctionNode extends Node {
     public appendNode (): void {
         estraverse.replace(this.astTree, {
             leave: (node: ITreeNode, parent: ITreeNode): any => {
-                switch (node.type) {
-                    case NodeType.Program:
-                        (<IProgramNode>node).body.push(this.getNode());
+                if (NodeUtils.isProgramNode(node)) {
+                    node.body.push(this.getNode());
 
-                        break;
-
-                    default:
-                        break;
+                    return estraverse.VisitorOption.Break;
                 }
+
+                return estraverse.VisitorOption.Skip;
             }
         });
     }

+ 1 - 0
tests/dev-test.js

@@ -47,6 +47,7 @@ let obfuscatedCode = index_1.JavaScriptObfuscator.obfuscate(`
         console.log(true, false);
     })();
     `, {
+    debugProtection: true,
     disableConsoleOutput: false,
     rotateUnicodeArray: false
 });

+ 1 - 0
tests/dev-test.ts

@@ -49,6 +49,7 @@ let obfuscatedCode: string = JavaScriptObfuscator.obfuscate(
     })();
     `,
     {
+        debugProtection: true,
         disableConsoleOutput: false,
         rotateUnicodeArray: false
     }