diff --git a/dist/src/Utils.js b/dist/src/Utils.js index 8b09d938..bdaab6d9 100644 --- a/dist/src/Utils.js +++ b/dist/src/Utils.js @@ -21,7 +21,11 @@ class Utils { return newArray; } static decToHex(dec) { - return (dec + Math.pow(16, 6)).toString(16).substr(-6).replace(Utils.hexRepetitiveZerosRegExp, ''); + const decToHexSliceValue = -6, exponent = 6, radix = 16; + return (dec + Math.pow(radix, exponent)) + .toString(radix) + .substr(decToHexSliceValue) + .replace(Utils.hexRepetitiveZerosRegExp, ''); } static getRandomInteger(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; @@ -37,8 +41,9 @@ class Utils { return obj; } static stringToUnicode(string) { + const radix = 16, unicodeSliceValue = -4; return `'${string.replace(/[\s\S]/g, (escape) => { - return `\\u${('0000' + escape.charCodeAt(0).toString(16)).slice(-4)}`; + return `\\u${('0000' + escape.charCodeAt(0).toString(radix)).slice(unicodeSliceValue)}`; })}'`; } } diff --git a/dist/tests/dev-test.js b/dist/tests/dev-test.js index c4a6ecb1..4cab2bc9 100644 --- a/dist/tests/dev-test.js +++ b/dist/tests/dev-test.js @@ -1,6 +1,4 @@ -"use strict"; -const JavaScriptObfuscator = require("../index"); -let obfuscatedCode = JavaScriptObfuscator.obfuscate(` +let JavaScriptObfuscator = require('../index'), obfuscatedCode = JavaScriptObfuscator.obfuscate(` (function(){ var result = 1, term1 = 0, diff --git a/src/NodeUtils.ts b/src/NodeUtils.ts index 89f9d815..b7d29d33 100644 --- a/src/NodeUtils.ts +++ b/src/NodeUtils.ts @@ -9,7 +9,7 @@ import { IPropertyNode } from "./interfaces/nodes/IPropertyNode"; import { INode } from './interfaces/nodes/INode'; import { IVariableDeclaratorNode } from "./interfaces/nodes/IVariableDeclaratorNode"; -import { BlockScopeNode } from "./types/BlockScopeNode"; +import { TBlockScopeNode } from "./types/TBlockScopeNode"; import { NodeType } from "./enums/NodeType"; @@ -69,13 +69,13 @@ export class NodeUtils { * @param depth * @returns {INode} */ - public static getBlockScopeOfNode (node: INode, depth: number = 0): BlockScopeNode { + public static getBlockScopeOfNode (node: INode, depth: number = 0): TBlockScopeNode { if (!node.parentNode) { throw new ReferenceError('`parentNode` property of given node is `undefined`'); } if (node.parentNode.type === NodeType.Program) { - return node.parentNode; + return node.parentNode; } if (!Utils.arrayContains(NodeUtils.scopeNodes, node.parentNode.type)) { @@ -90,7 +90,7 @@ export class NodeUtils { return NodeUtils.getBlockScopeOfNode(node.parentNode); } - return node; // blocks statement of scopeNodes + return node; // blocks statement of scopeNodes } /** @@ -142,7 +142,7 @@ export class NodeUtils { * @param node * @returns {boolean} */ - public static isNodeHasBlockScope (node: INode): node is BlockScopeNode { + public static isNodeHasBlockScope (node: INode): node is TBlockScopeNode { return node.hasOwnProperty('body'); } diff --git a/src/Obfuscator.ts b/src/Obfuscator.ts index 673b15bc..90d8963a 100644 --- a/src/Obfuscator.ts +++ b/src/Obfuscator.ts @@ -1,11 +1,12 @@ import * as estraverse from 'estraverse'; import { ICustomNode } from './interfaces/ICustomNode'; -import { INodeObfuscator } from './interfaces/INodeObfuscator'; import { INodesGroup } from './interfaces/INodesGroup'; import { INode } from './interfaces/nodes/INode'; import { IOptions } from "./interfaces/IOptions"; +import { TNodeObfuscator } from "./types/TNodeObfuscator"; + import { AppendState } from './enums/AppendState'; import { NodeType } from './enums/NodeType'; @@ -29,9 +30,9 @@ export class Obfuscator { private nodes: Map = new Map (); /** - * @type {Map} + * @type {Map} */ - private nodeObfuscators: Map = new Map ([ + private nodeObfuscators: Map = new Map ([ [NodeType.ArrowFunctionExpression, [FunctionObfuscator]], [NodeType.ClassDeclaration, [FunctionDeclarationObfuscator]], [NodeType.CatchClause, [CatchClauseObfuscator]], @@ -123,8 +124,8 @@ export class Obfuscator { return; } - this.nodeObfuscators.get(node.type).forEach((obfuscator: Function) => { - new ( obfuscator(this.nodes, this.options)).obfuscateNode(node, parentNode); + this.nodeObfuscators.get(node.type).forEach((obfuscator: TNodeObfuscator) => { + new obfuscator(this.nodes, this.options).obfuscateNode(node, parentNode); }); } diff --git a/src/Utils.ts b/src/Utils.ts index 0a934f36..95f008a2 100644 --- a/src/Utils.ts +++ b/src/Utils.ts @@ -17,15 +17,15 @@ export class Utils { * @param array * @param times * @param reverse - * @returns any[] + * @returns {T[]} */ - public static arrayRotate (array: any[], times: number, reverse: boolean = false): any[] { + public static arrayRotate (array: T[], times: number, reverse: boolean = false): T[] { if (times < 0) { return; } - let newArray: any[] = array, - temp: any; + let newArray: T[] = array, + temp: T; while (times--) { if (!reverse) { @@ -45,7 +45,14 @@ export class Utils { * @returns {string} */ public static decToHex(dec: number): string { - return (dec + Math.pow(16, 6)).toString(16).substr(-6).replace(Utils.hexRepetitiveZerosRegExp, ''); + const decToHexSliceValue: number = -6, + exponent: number = 6, + radix: number = 16; + + return (dec + Math.pow(radix, exponent)) + .toString(radix) + .substr(decToHexSliceValue) + .replace(Utils.hexRepetitiveZerosRegExp, ''); } /** @@ -90,8 +97,11 @@ export class Utils { * @returns {string} */ public static stringToUnicode (string: string): string { + const radix: number = 16, + unicodeSliceValue: number = -4; + return `'${string.replace(/[\s\S]/g, (escape: string): string => { - return `\\u${('0000' + escape.charCodeAt(0).toString(16)).slice(-4)}`; + return `\\u${('0000' + escape.charCodeAt(0).toString(radix)).slice(unicodeSliceValue)}`; })}'`; } } diff --git a/src/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.ts b/src/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.ts index 0c6268b9..c704c5f1 100644 --- a/src/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.ts +++ b/src/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.ts @@ -1,6 +1,8 @@ import * as esprima from 'esprima'; -import { BlockScopeNode } from "../../types/BlockScopeNode"; +import { INode } from "../../interfaces/nodes/INode"; + +import { TBlockScopeNode } from "../../types/TBlockScopeNode"; import { Node } from '../Node'; import { NodeUtils } from "../../NodeUtils"; @@ -15,7 +17,7 @@ export class ConsoleOutputDisableExpressionNode extends Node { /** * @param blockScopeNode */ - public appendNode (blockScopeNode: BlockScopeNode): void { + public appendNode (blockScopeNode: TBlockScopeNode): void { NodeUtils.prependNode(blockScopeNode.body, this.getNode()); } @@ -33,9 +35,9 @@ export class ConsoleOutputDisableExpressionNode extends Node { * _console * })(); * - * @returns any + * @returns {INode} */ - protected getNodeStructure (): any { + protected getNodeStructure (): INode { return NodeUtils.getBlockScopeNodeByIndex( esprima.parse(` (function () { diff --git a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionCallNode.ts b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionCallNode.ts index e3e13851..f14d02f7 100644 --- a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionCallNode.ts +++ b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionCallNode.ts @@ -1,4 +1,6 @@ -import { BlockScopeNode } from "../../types/BlockScopeNode"; +import { IExpressionStatementNode } from "../../interfaces/nodes/IExpressionStatementNode"; + +import { TBlockScopeNode } from "../../types/TBlockScopeNode"; import { NodeType } from "../../enums/NodeType"; @@ -25,14 +27,14 @@ export class DebugProtectionFunctionCallNode extends Node { /** * @param blockScopeNode */ - public appendNode (blockScopeNode: BlockScopeNode): void { + public appendNode (blockScopeNode: TBlockScopeNode): void { NodeUtils.appendNode(blockScopeNode.body, this.getNode()); } /** - * @returns any + * @returns {IExpressionStatementNode} */ - protected getNodeStructure (): any { + protected getNodeStructure (): IExpressionStatementNode { return { 'type': NodeType.ExpressionStatement, 'expression': { diff --git a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionIntervalNode.ts b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionIntervalNode.ts index 589c3392..173ff8b3 100644 --- a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionIntervalNode.ts +++ b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionIntervalNode.ts @@ -1,4 +1,6 @@ -import { BlockScopeNode } from "../../types/BlockScopeNode"; +import { IExpressionStatementNode } from "../../interfaces/nodes/IExpressionStatementNode"; + +import { TBlockScopeNode } from "../../types/TBlockScopeNode"; import { NodeType } from '../../enums/NodeType'; @@ -25,14 +27,14 @@ export class DebugProtectionFunctionIntervalNode extends Node { /** * @param blockScopeNode */ - public appendNode (blockScopeNode: BlockScopeNode): void { + public appendNode (blockScopeNode: TBlockScopeNode): void { NodeUtils.appendNode(blockScopeNode.body, this.getNode()); } /** - * @returns any + * @returns {IExpressionStatementNode} */ - protected getNodeStructure (): any { + protected getNodeStructure (): IExpressionStatementNode { return { 'type': NodeType.ExpressionStatement, 'expression': { diff --git a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts index 0cb3436e..d95dcbd0 100644 --- a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts +++ b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts @@ -1,6 +1,8 @@ import * as esprima from 'esprima'; -import { BlockScopeNode } from "../../types/BlockScopeNode"; +import { INode } from "../../interfaces/nodes/INode"; + +import { TBlockScopeNode } from "../../types/TBlockScopeNode"; import { Node } from '../Node'; import { NodeUtils } from '../../NodeUtils'; @@ -28,7 +30,7 @@ export class DebugProtectionFunctionNode extends Node { /** * @param blockScopeNode */ - public appendNode (blockScopeNode: BlockScopeNode): void { + public appendNode (blockScopeNode: TBlockScopeNode): void { let programBodyLength: number = blockScopeNode.body.length, randomIndex: number = Utils.getRandomInteger(0, programBodyLength); @@ -45,9 +47,9 @@ export class DebugProtectionFunctionNode extends Node { /** * Found this trick in JScrambler * - * @returns any + * @returns {INode} */ - protected getNodeStructure (): any { + protected getNodeStructure (): INode { return NodeUtils.getBlockScopeNodeByIndex( esprima.parse(` var ${this.debugProtectionFunctionName} = function () { diff --git a/src/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.ts b/src/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.ts index aa7c9ba1..08b84b47 100644 --- a/src/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.ts +++ b/src/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.ts @@ -2,7 +2,7 @@ import * as esprima from 'esprima'; import { INode } from "../../interfaces/nodes/INode"; -import { BlockScopeNode } from "../../types/BlockScopeNode"; +import { TBlockScopeNode } from "../../types/TBlockScopeNode"; import { AppendState } from "../../enums/AppendState"; @@ -53,7 +53,7 @@ export class UnicodeArrayCallsWrapper extends Node { /** * @param blockScopeNode */ - public appendNode (blockScopeNode: BlockScopeNode): void { + public appendNode (blockScopeNode: TBlockScopeNode): void { NodeUtils.insertNodeAtIndex(blockScopeNode.body, this.getNode(), 1); } @@ -76,9 +76,9 @@ export class UnicodeArrayCallsWrapper extends Node { } /** - * @returns any + * @returns {INode} */ - protected getNodeStructure (): any { + protected getNodeStructure (): INode { let keyName: string = Utils.getRandomVariableName(), node: INode = esprima.parse(` var ${this.unicodeArrayCallsWrapperName} = function (${keyName}) { diff --git a/src/custom-nodes/unicode-array-nodes/UnicodeArrayNode.ts b/src/custom-nodes/unicode-array-nodes/UnicodeArrayNode.ts index 1a0e469f..655c6f40 100644 --- a/src/custom-nodes/unicode-array-nodes/UnicodeArrayNode.ts +++ b/src/custom-nodes/unicode-array-nodes/UnicodeArrayNode.ts @@ -2,7 +2,7 @@ import * as escodegen from 'escodegen'; import { INode } from '../../interfaces/nodes/INode'; -import { BlockScopeNode } from "../../types/BlockScopeNode"; +import { TBlockScopeNode } from "../../types/TBlockScopeNode"; import { AppendState } from '../../enums/AppendState'; import { NodeType } from "../../enums/NodeType"; @@ -10,6 +10,7 @@ import { NodeType } from "../../enums/NodeType"; import { Node } from '../Node'; import { NodeUtils } from "../../NodeUtils"; import { Utils } from '../../Utils'; +import {IVariableDeclarationNode} from "../../interfaces/nodes/IVariableDeclarationNode"; export class UnicodeArrayNode extends Node { /** @@ -53,7 +54,7 @@ export class UnicodeArrayNode extends Node { /** * @param blockScopeNode */ - public appendNode (blockScopeNode: BlockScopeNode): void { + public appendNode (blockScopeNode: TBlockScopeNode): void { NodeUtils.prependNode(blockScopeNode.body, this.getNode()); } @@ -79,7 +80,7 @@ export class UnicodeArrayNode extends Node { return; } - Utils.arrayRotate(this.unicodeArray, this.unicodeArrayRotateValue); + Utils.arrayRotate (this.unicodeArray, this.unicodeArrayRotateValue); this.updateNode(); @@ -87,9 +88,9 @@ export class UnicodeArrayNode extends Node { } /** - * @returns any + * @returns {INode} */ - protected getNodeStructure (): any { + protected getNodeStructure (): IVariableDeclarationNode { return { 'type': NodeType.VariableDeclaration, 'declarations': [ diff --git a/src/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.ts b/src/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.ts index 1237287a..5be83b3d 100644 --- a/src/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.ts +++ b/src/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.ts @@ -2,7 +2,7 @@ import * as esprima from 'esprima'; import { INode } from "../../interfaces/nodes/INode"; -import { BlockScopeNode } from "../../types/BlockScopeNode"; +import { TBlockScopeNode } from "../../types/TBlockScopeNode"; import { AppendState } from "../../enums/AppendState"; @@ -53,7 +53,7 @@ export class UnicodeArrayRotateFunctionNode extends Node { /** * @param blockScopeNode */ - public appendNode (blockScopeNode: BlockScopeNode): void { + public appendNode (blockScopeNode: TBlockScopeNode): void { NodeUtils.insertNodeAtIndex(blockScopeNode.body, this.getNode(), 1); } @@ -69,9 +69,9 @@ export class UnicodeArrayRotateFunctionNode extends Node { } /** - * @returns any + * @returns {INode} */ - protected getNodeStructure (): any { + protected getNodeStructure (): INode { let arrayName: string = Utils.getRandomVariableName(), timesName: string = Utils.getRandomVariableName(), tempArrayName: string = Utils.getRandomVariableName(), diff --git a/src/interfaces/IOptions.d.ts b/src/interfaces/IOptions.d.ts index c28444fa..0cf38876 100644 --- a/src/interfaces/IOptions.d.ts +++ b/src/interfaces/IOptions.d.ts @@ -5,5 +5,4 @@ export interface IOptions { disableConsoleOutput?: boolean; rotateUnicodeArray?: boolean; wrapUnicodeArrayCalls?: boolean; - [id: string]: any; } diff --git a/src/interfaces/nodes/IExpressionStatementNode.d.ts b/src/interfaces/nodes/IExpressionStatementNode.d.ts new file mode 100644 index 00000000..7774ac1d --- /dev/null +++ b/src/interfaces/nodes/IExpressionStatementNode.d.ts @@ -0,0 +1,5 @@ +import { INode } from "./INode"; + +export interface IExpressionStatementNode extends INode { + expression: any; +} diff --git a/src/types/BlockScopeNode.d.ts b/src/types/TBlockScopeNode.d.ts similarity index 75% rename from src/types/BlockScopeNode.d.ts rename to src/types/TBlockScopeNode.d.ts index b463d6a2..6723bc78 100644 --- a/src/types/BlockScopeNode.d.ts +++ b/src/types/TBlockScopeNode.d.ts @@ -3,4 +3,4 @@ import { ICatchClauseNode } from "../interfaces/nodes/ICatchClauseNode"; import { IFunctionNode } from "../interfaces/nodes/IFunctionNode"; import { IProgramNode } from "../interfaces/nodes/IProgramNode"; -export type BlockScopeNode = IBlockStatementNode|ICatchClauseNode|IFunctionNode|IProgramNode; \ No newline at end of file +export type TBlockScopeNode = IBlockStatementNode|ICatchClauseNode|IFunctionNode|IProgramNode; \ No newline at end of file diff --git a/src/types/TNodeObfuscator.d.ts b/src/types/TNodeObfuscator.d.ts new file mode 100644 index 00000000..92462034 --- /dev/null +++ b/src/types/TNodeObfuscator.d.ts @@ -0,0 +1,5 @@ +import { ICustomNode } from "../interfaces/ICustomNode"; +import { INodeObfuscator } from "../interfaces/INodeObfuscator"; +import { IOptions } from "../interfaces/IOptions"; + +export type TNodeObfuscator = (new (nodes: Map , options: IOptions) => INodeObfuscator); \ No newline at end of file diff --git a/tests/dev-test.ts b/tests/dev-test.ts index 4352d5c4..5cded573 100644 --- a/tests/dev-test.ts +++ b/tests/dev-test.ts @@ -1,6 +1,5 @@ -import * as JavaScriptObfuscator from "../index"; - -let obfuscatedCode: string = (JavaScriptObfuscator).obfuscate( +let JavaScriptObfuscator = require('../index'), + obfuscatedCode: string = JavaScriptObfuscator.obfuscate( ` (function(){ var result = 1,