All files / src/custom-nodes/unicode-array-nodes UnicodeArrayRotateFunctionNode.ts

96.15% Statements 25/26
75% Branches 3/4
100% Functions 1/1
96.15% Lines 25/26
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109          1x 1x   1x   1x 1x 1x 1x   1x       2x                                                         2x   2x 2x 2x             2x       2x             2x             2x 2x 2x 2x 2x   2x 1x               1x     2x                          
import { INode } from "../../interfaces/nodes/INode";
import { IOptions } from "../../interfaces/IOptions";
 
import { TNodeWithBlockStatement } from "../../types/TNodeWithBlockStatement";
 
import { AppendState } from "../../enums/AppendState";
import { JSFuck } from "../../enums/JSFuck";
 
import { NO_CUSTOM_NODES_PRESET } from "../../preset-options/NoCustomNodesPreset";
 
import { JavaScriptObfuscator } from "../../JavaScriptObfuscator";
import { Node } from '../Node';
import { NodeUtils } from "../../NodeUtils";
import { Utils } from "../../Utils";
 
export class UnicodeArrayRotateFunctionNode extends Node {
    /**
     * @type {AppendState}
     */
    protected appendState: AppendState = AppendState.AfterObfuscation;
 
    /**
     * @type {string[]}
     */
    private unicodeArray: string[];
 
    /**
     * @type {string}
     */
    private unicodeArrayName: string;
 
    /**
     * @param {number}
     */
    private unicodeArrayRotateValue: number;
 
    /**
     * @param unicodeArrayName
     * @param unicodeArray
     * @param unicodeArrayRotateValue
     * @param options
     */
    constructor (
        unicodeArrayName: string,
        unicodeArray: string[],
        unicodeArrayRotateValue: number,
        options: IOptions
    ) {
        super(options);
 
        this.unicodeArrayName = unicodeArrayName;
        this.unicodeArray = unicodeArray;
        this.unicodeArrayRotateValue = unicodeArrayRotateValue;
    }
 
    /**
     * @param blockScopeNode
     */
    public appendNode (blockScopeNode: TNodeWithBlockStatement): void {
        Iif (!this.unicodeArray.length) {
            return;
        }
 
        NodeUtils.insertNodeAtIndex(blockScopeNode.body, this.getNode(), 1);
    }
 
    /**
     * @returns {INode}
     */
    public getNode (): INode {
        return super.getNode();
    }
 
    /**
     * @returns {INode}
     */
    protected getNodeStructure (): INode {
        let arrayName: string = Utils.getRandomVariableName(),
            code: string = '',
            timesName: string = Utils.getRandomVariableName(),
            timesArgumentName: string = Utils.getRandomVariableName(),
            whileFunctionName: string = Utils.getRandomVariableName();
 
        if (this.options.selfDefending) {
            code = JavaScriptObfuscator.obfuscate(`
                (function () {
                    var func = function(){return ${Utils.stringToUnicode('dev')};};
                                        
                    !Function(${Utils.stringToUnicode(`return/\\w+ *\\(\\) *{\\w+ *['|"].+['|"];? *}/`)})().test(func.toString()) ? []['filter']['constructor'](${Utils.stringToJSFuck('while')} + '(${JSFuck.True}){}')() : Function(${Utils.stringToUnicode('a')}, ${Utils.stringToUnicode('b')}, ${Utils.stringToUnicode('a(++b)')})(${whileFunctionName}, ${timesName}) ? []['filter']['constructor'](${Utils.stringToJSFuck('while')} + '(${JSFuck.False}){}')() : []['filter']['constructor'](${Utils.stringToJSFuck('while')} + '(${JSFuck.False}){}')();
                })();
            `, NO_CUSTOM_NODES_PRESET).getObfuscatedCode();
        } else {
            code = `${whileFunctionName}(++${timesName})`;
        }
 
        return NodeUtils.convertCodeToStructure(`
            (function (${arrayName}, ${timesName}) {
                var ${whileFunctionName} = function (${timesArgumentName}) {
                    while (--${timesArgumentName}) {
                        ${arrayName}[${Utils.stringToUnicode('push')}](${arrayName}[${Utils.stringToUnicode('shift')}]());
                    }
                };
                
                ${code}
            })(${this.unicodeArrayName}, 0x${Utils.decToHex(this.unicodeArrayRotateValue)});
        `);
    }
}