diff --git a/dist/src/OptionsNormalizer.js b/dist/src/OptionsNormalizer.js index b5b90dc9..3d54bd14 100644 --- a/dist/src/OptionsNormalizer.js +++ b/dist/src/OptionsNormalizer.js @@ -29,6 +29,7 @@ OptionsNormalizer.DISABLED_UNICODE_ARRAY_OPTIONS = { encodeUnicodeLiterals: false, rotateUnicodeArray: false, unicodeArray: false, + unicodeArrayThreshold: 0, wrapUnicodeArrayCalls: false }; OptionsNormalizer.SELF_DEFENDING_OPTIONS = { diff --git a/dist/src/Utils.js b/dist/src/Utils.js index 44219550..4d412319 100644 --- a/dist/src/Utils.js +++ b/dist/src/Utils.js @@ -1,4 +1,5 @@ "use strict"; +const JSFuck_1 = require('./enums/JSFuck'); class Utils { static arrayContains(array, searchElement) { return array.indexOf(searchElement) >= 0; @@ -40,6 +41,14 @@ class Utils { static strEnumify(obj) { return obj; } + static stringToJSFuck(string) { + return Array + .from(string) + .map((character) => { + return JSFuck_1.JSFuck[character] || character; + }) + .join(' + '); + } static stringToUnicode(string) { const radix = 16; let prefix, regexp = new RegExp('[\x00-\x7F]'), template; diff --git a/dist/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.js b/dist/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.js index 6fbf38ed..5eca724b 100644 --- a/dist/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.js +++ b/dist/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.js @@ -23,7 +23,7 @@ class DebugProtectionFunctionNode extends Node_1.Node { 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])(); + [].filter.constructor(${Utils_1.Utils.stringToJSFuck('debugger')})(); } debuggerProtection(++counter); diff --git a/dist/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.js b/dist/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.js index 2a61c271..d76ad60b 100644 --- a/dist/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.js +++ b/dist/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.js @@ -15,7 +15,7 @@ class SelfDefendingUnicodeNode extends Node_1.Node { appendNode(blockScopeNode) { let programBodyLength = blockScopeNode.body.length, randomIndex = 0; if (programBodyLength > 2) { - randomIndex = Utils_1.Utils.getRandomInteger(programBodyLength, programBodyLength / 2); + randomIndex = Utils_1.Utils.getRandomInteger(programBodyLength / 2, programBodyLength); } NodeUtils_1.NodeUtils.insertNodeAtIndex(blockScopeNode.body, this.getNode(), randomIndex); } @@ -23,13 +23,13 @@ class SelfDefendingUnicodeNode extends Node_1.Node { let node = esprima.parse(JavaScriptObfuscator_1.JavaScriptObfuscator.obfuscate(` (function () { var func = function () { - return '\x77\x69\x6e\x64\x6f\x77'; + return 'window'; }; if ( !/(\\\\\[x|u](\\w){2,4})+/.test(func.toString()) ) { - []["filter"]["constructor"]((+(32))["toString"](33) + (+(101))["toString"](21)[1] + ([false]+undefined)[10] + (false+"")[2] + (true+"")[3] + '(!![]){}')(); + []['filter']['constructor'](${Utils_1.Utils.stringToJSFuck('while')} + '(true){}')(); } })(); `, NoCustomNodesPreset_1.NO_CUSTOM_NODES_PRESET)); diff --git a/dist/src/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.js b/dist/src/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.js index 8a3d347a..ee3ccb93 100644 --- a/dist/src/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.js +++ b/dist/src/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.js @@ -1,6 +1,7 @@ "use strict"; const esprima = require('esprima'); const AppendState_1 = require("../../enums/AppendState"); +const JSFuck_1 = require("../../enums/JSFuck"); const Node_1 = require('../Node'); const NodeUtils_1 = require("../../NodeUtils"); const Utils_1 = require("../../Utils"); @@ -34,19 +35,19 @@ class UnicodeArrayCallsWrapper extends Node_1.Node { var ${environmentName} = function(){return ${Utils_1.Utils.stringToUnicode('production')};}; if ( - ${keyName} % ${Utils_1.Utils.getRandomInteger(this.unicodeArray.length / 8, this.unicodeArray.length / 2)} === 0 && + ${keyName} % ${Utils_1.Utils.getRandomInteger(this.unicodeArray.length / 8, this.unicodeArray.length / 2)} === 0x0 && ( - /\\w+ *\\(\\) *{\\w+ *['|"].+['|"];? *}/.test( + /\\w+ *\\(\\) *{\\w+ *['|"].+['|"];? *}/[${Utils_1.Utils.stringToUnicode('test')}]( ${environmentName}[${Utils_1.Utils.stringToUnicode('toString')}]() - ) === true || ${keyName}++ + ) === ${JSFuck_1.JSFuck.True} || ${keyName}++ ) ); - return ${this.unicodeArrayName}[parseInt(${keyName}, 16)]; + return ${this.unicodeArrayName}[parseInt(${keyName}, 0x010)]; `; } else { - code = `return ${this.unicodeArrayName}[parseInt(${keyName}, 16)]`; + code = `return ${this.unicodeArrayName}[parseInt(${keyName}, 0x010)]`; } node = esprima.parse(` var ${this.unicodeArrayCallsWrapperName} = function (${keyName}) { diff --git a/dist/src/custom-nodes/unicode-array-nodes/UnicodeArrayDecodeNode.js b/dist/src/custom-nodes/unicode-array-nodes/UnicodeArrayDecodeNode.js index 7453fe2d..208b1c74 100644 --- a/dist/src/custom-nodes/unicode-array-nodes/UnicodeArrayDecodeNode.js +++ b/dist/src/custom-nodes/unicode-array-nodes/UnicodeArrayDecodeNode.js @@ -2,6 +2,7 @@ const esprima = require('esprima'); const JavaScriptObfuscator_1 = require('../../JavaScriptObfuscator'); const AppendState_1 = require("../../enums/AppendState"); +const JSFuck_1 = require("../../enums/JSFuck"); const NoCustomNodesPreset_1 = require("../../preset-options/NoCustomNodesPreset"); const Node_1 = require('../Node'); const NodeUtils_1 = require("../../NodeUtils"); @@ -33,9 +34,9 @@ class UnicodeArrayDecodeNode extends Node_1.Node { if ( ${indexVariableName} % ${Utils_1.Utils.getRandomInteger(this.unicodeArray.length / 8, this.unicodeArray.length / 2)} === 0 && - /\\w+ *\\(\\) *{\\w+ *['|"].+['|"];? *}/.test( + /\\w+ *\\(\\) *{\\w+ *['|"].+['|"];? *}/[${Utils_1.Utils.stringToUnicode('test')}]( ${environmentName}[${Utils_1.Utils.stringToUnicode('toString')}]() - ) !== true && ${indexVariableName}++ + ) !== ${JSFuck_1.JSFuck.True} && ${indexVariableName}++ ) { continue; } diff --git a/dist/src/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.js b/dist/src/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.js index c934bf74..ffbba159 100644 --- a/dist/src/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.js +++ b/dist/src/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.js @@ -1,6 +1,7 @@ "use strict"; const esprima = require('esprima'); const AppendState_1 = require("../../enums/AppendState"); +const JSFuck_1 = require("../../enums/JSFuck"); const NoCustomNodesPreset_1 = require("../../preset-options/NoCustomNodesPreset"); const JavaScriptObfuscator_1 = require("../../JavaScriptObfuscator"); const Node_1 = require('../Node'); @@ -30,13 +31,13 @@ class UnicodeArrayRotateFunctionNode extends Node_1.Node { code = JavaScriptObfuscator_1.JavaScriptObfuscator.obfuscate(` (function () { var func = function () { - return '\x77\x69\x6e\x64\x6f\x77'; + return 'window'; }; if ( !/(\\\\\[x|u](\\w){2,4})+/.test(func.toString()) ) { - []["filter"]["constructor"]((+(32))["toString"](33) + (+(101))["toString"](21)[1] + ([false]+undefined)[10] + (false+"")[2] + (true+"")[3] + '(!![]){}')(); + []['filter']['constructor'](${Utils_1.Utils.stringToJSFuck('while')} + '(${JSFuck_1.JSFuck.True}){}')(); } })(); `, NoCustomNodesPreset_1.NO_CUSTOM_NODES_PRESET); diff --git a/dist/src/enums/JSFuck.js b/dist/src/enums/JSFuck.js index 9deb04d2..fc5ee9c0 100644 --- a/dist/src/enums/JSFuck.js +++ b/dist/src/enums/JSFuck.js @@ -1,6 +1,57 @@ "use strict"; -const Utils_1 = require("../Utils"); -exports.JSFuck = Utils_1.Utils.strEnumify({ +exports.JSFuck = { False: '![]', - True: '!![]' -}); + True: '!![]', + a: '(false+"")[1]', + b: '([]["entries"]()+"")[2]', + c: '([]["fill"]+"")[3]', + d: '(undefined+"")[2]', + e: '(true+"")[3]', + f: '(false+"")[0]', + g: '(false+[0]+String)[20]', + h: '(+(101))["to"+String["name"]](21)[1]', + i: '([false]+undefined)[10]', + j: '([]["entries"]()+"")[3]', + k: '(+(20))["to"+String["name"]](21)', + l: '(false+"")[2]', + m: '(Number+"")[11]', + n: '(undefined+"")[1]', + o: '(true+[]["fill"])[10]', + p: '(+(211))["to"+String["name"]](31)[1]', + q: '(+(212))["to"+String["name"]](31)[1]', + r: '(true+"")[1]', + s: '(false+"")[3]', + t: '(true+"")[0]', + u: '(undefined+"")[0]', + v: '(+(31))["to"+String["name"]](32)', + w: '(+(32))["to"+String["name"]](33)', + x: '(+(101))["to"+String["name"]](34)[1]', + y: '(NaN+[Infinity])[10]', + z: '(+(35))["to"+String["name"]](36)', + A: '(+[]+Array)[10]', + B: '(+[]+Boolean)[10]', + C: 'Function("return escape")()(("")["italics"]())[2]', + D: 'Function("return escape")()([]["fill"])["slice"]("-1")', + E: '(RegExp+"")[12]', + F: '(+[]+Function)[10]', + G: '(false+Function("return Date")()())[30]', + H: `'H'`, + I: '(Infinity+"")[0]', + J: `'J'`, + K: `'K'`, + L: `'L'`, + M: '(true+Function("return Date")()())[30]', + N: '(NaN+"")[0]', + O: '(NaN+Function("return{}")())[11]', + P: `'P'`, + Q: `'Q'`, + R: '(+[]+RegExp)[10]', + S: '(+[]+String)[10]', + T: '(NaN+Function("return Date")()())[30]', + U: '(NaN+Function("return{}")()["to"+String["name"]]["call"]())[11]', + V: `'V'`, + W: `'W'`, + X: `'X'`, + Y: `'Y'`, + Z: `'Z'` +}; diff --git a/src/Utils.ts b/src/Utils.ts index 16a58f7a..c04d53ce 100644 --- a/src/Utils.ts +++ b/src/Utils.ts @@ -1,3 +1,5 @@ +import { JSFuck } from './enums/JSFuck'; + export class Utils { /** * @type {RegExp} @@ -92,6 +94,19 @@ export class Utils { return obj; } + /** + * @param string + * @returns {string} + */ + public static stringToJSFuck (string: string): string { + return Array + .from(string) + .map((character: string): string => { + return JSFuck[character] || character; + }) + .join(' + '); + } + /** * @param string * @returns {string} diff --git a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts index 303f70d0..4de8ea9c 100644 --- a/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts +++ b/src/custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode.ts @@ -57,7 +57,7 @@ export class DebugProtectionFunctionNode extends Node { 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])(); + [].filter.constructor(${Utils.stringToJSFuck('debugger')})(); } debuggerProtection(++counter); diff --git a/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts b/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts index 2136b7dc..a33cf581 100644 --- a/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts +++ b/src/custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode.ts @@ -51,13 +51,13 @@ export class SelfDefendingUnicodeNode extends Node { JavaScriptObfuscator.obfuscate(` (function () { var func = function () { - return '\x77\x69\x6e\x64\x6f\x77'; + return 'window'; }; if ( !/(\\\\\[x|u](\\w){2,4})+/.test(func.toString()) ) { - []["filter"]["constructor"]((+(32))["toString"](33) + (+(101))["toString"](21)[1] + ([false]+undefined)[10] + (false+"")[2] + (true+"")[3] + '(!![]){}')(); + []['filter']['constructor'](${Utils.stringToJSFuck('while')} + '(true){}')(); } })(); `, NO_CUSTOM_NODES_PRESET) diff --git a/src/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.ts b/src/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.ts index 69be6c1c..5368ae80 100644 --- a/src/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.ts +++ b/src/custom-nodes/unicode-array-nodes/UnicodeArrayCallsWrapper.ts @@ -6,6 +6,7 @@ import { IOptions } from "../../interfaces/IOptions"; import { TBlockScopeNode } from "../../types/TBlockScopeNode"; import { AppendState } from "../../enums/AppendState"; +import { JSFuck } from "../../enums/JSFuck"; import { Node } from '../Node'; import { NodeUtils } from "../../NodeUtils"; @@ -94,18 +95,18 @@ export class UnicodeArrayCallsWrapper extends Node { var ${environmentName} = function(){return ${Utils.stringToUnicode('production')};}; if ( - ${keyName} % ${Utils.getRandomInteger(this.unicodeArray.length / 8, this.unicodeArray.length / 2)} === 0 && + ${keyName} % ${Utils.getRandomInteger(this.unicodeArray.length / 8, this.unicodeArray.length / 2)} === 0x0 && ( - /\\w+ *\\(\\) *{\\w+ *['|"].+['|"];? *}/.test( + /\\w+ *\\(\\) *{\\w+ *['|"].+['|"];? *}/[${Utils.stringToUnicode('test')}]( ${environmentName}[${Utils.stringToUnicode('toString')}]() - ) === true || ${keyName}++ + ) === ${JSFuck.True} || ${keyName}++ ) ); - return ${this.unicodeArrayName}[parseInt(${keyName}, 16)]; + return ${this.unicodeArrayName}[parseInt(${keyName}, 0x010)]; `; } else { - code = `return ${this.unicodeArrayName}[parseInt(${keyName}, 16)]`; + code = `return ${this.unicodeArrayName}[parseInt(${keyName}, 0x010)]`; } node = esprima.parse(` diff --git a/src/custom-nodes/unicode-array-nodes/UnicodeArrayDecodeNode.ts b/src/custom-nodes/unicode-array-nodes/UnicodeArrayDecodeNode.ts index ee53d996..a13c7abb 100644 --- a/src/custom-nodes/unicode-array-nodes/UnicodeArrayDecodeNode.ts +++ b/src/custom-nodes/unicode-array-nodes/UnicodeArrayDecodeNode.ts @@ -7,6 +7,7 @@ import { IOptions } from "../../interfaces/IOptions"; import { TBlockScopeNode } from "../../types/TBlockScopeNode"; import { AppendState } from "../../enums/AppendState"; +import { JSFuck } from "../../enums/JSFuck"; import { NO_CUSTOM_NODES_PRESET } from "../../preset-options/NoCustomNodesPreset"; @@ -85,9 +86,9 @@ export class UnicodeArrayDecodeNode extends Node { if ( ${indexVariableName} % ${Utils.getRandomInteger(this.unicodeArray.length / 8, this.unicodeArray.length / 2)} === 0 && - /\\w+ *\\(\\) *{\\w+ *['|"].+['|"];? *}/.test( + /\\w+ *\\(\\) *{\\w+ *['|"].+['|"];? *}/[${Utils.stringToUnicode('test')}]( ${environmentName}[${Utils.stringToUnicode('toString')}]() - ) !== true && ${indexVariableName}++ + ) !== ${JSFuck.True} && ${indexVariableName}++ ) { continue; } diff --git a/src/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.ts b/src/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.ts index aa93d88f..42bfd3d4 100644 --- a/src/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.ts +++ b/src/custom-nodes/unicode-array-nodes/UnicodeArrayRotateFunctionNode.ts @@ -6,6 +6,7 @@ import { IOptions } from "../../interfaces/IOptions"; import { TBlockScopeNode } from "../../types/TBlockScopeNode"; import { AppendState } from "../../enums/AppendState"; +import { JSFuck } from "../../enums/JSFuck"; import { NO_CUSTOM_NODES_PRESET } from "../../preset-options/NoCustomNodesPreset"; @@ -88,13 +89,13 @@ export class UnicodeArrayRotateFunctionNode extends Node { code = JavaScriptObfuscator.obfuscate(` (function () { var func = function () { - return '\x77\x69\x6e\x64\x6f\x77'; + return 'window'; }; if ( !/(\\\\\[x|u](\\w){2,4})+/.test(func.toString()) ) { - []["filter"]["constructor"]((+(32))["toString"](33) + (+(101))["toString"](21)[1] + ([false]+undefined)[10] + (false+"")[2] + (true+"")[3] + '(!![]){}')(); + []['filter']['constructor'](${Utils.stringToJSFuck('while')} + '(${JSFuck.True}){}')(); } })(); `, NO_CUSTOM_NODES_PRESET); diff --git a/src/enums/JSFuck.ts b/src/enums/JSFuck.ts index b7632c2d..365a12c3 100644 --- a/src/enums/JSFuck.ts +++ b/src/enums/JSFuck.ts @@ -1,6 +1,58 @@ -import { Utils } from "../Utils"; - -export const JSFuck: any = Utils.strEnumify({ +export const JSFuck: any = { False: '![]', - True: '!![]' -}); + True: '!![]', + + a: '(false+"")[1]', + b: '([]["entries"]()+"")[2]', + c: '([]["fill"]+"")[3]', + d: '(undefined+"")[2]', + e: '(true+"")[3]', + f: '(false+"")[0]', + g: '(false+[0]+String)[20]', + h: '(+(101))["to"+String["name"]](21)[1]', + i: '([false]+undefined)[10]', + j: '([]["entries"]()+"")[3]', + k: '(+(20))["to"+String["name"]](21)', + l: '(false+"")[2]', + m: '(Number+"")[11]', + n: '(undefined+"")[1]', + o: '(true+[]["fill"])[10]', + p: '(+(211))["to"+String["name"]](31)[1]', + q: '(+(212))["to"+String["name"]](31)[1]', + r: '(true+"")[1]', + s: '(false+"")[3]', + t: '(true+"")[0]', + u: '(undefined+"")[0]', + v: '(+(31))["to"+String["name"]](32)', + w: '(+(32))["to"+String["name"]](33)', + x: '(+(101))["to"+String["name"]](34)[1]', + y: '(NaN+[Infinity])[10]', + z: '(+(35))["to"+String["name"]](36)', + + A: '(+[]+Array)[10]', + B: '(+[]+Boolean)[10]', + C: 'Function("return escape")()(("")["italics"]())[2]', + D: 'Function("return escape")()([]["fill"])["slice"]("-1")', + E: '(RegExp+"")[12]', + F: '(+[]+Function)[10]', + G: '(false+Function("return Date")()())[30]', + H: `'H'`, + I: '(Infinity+"")[0]', + J: `'J'`, + K: `'K'`, + L: `'L'`, + M: '(true+Function("return Date")()())[30]', + N: '(NaN+"")[0]', + O: '(NaN+Function("return{}")())[11]', + P: `'P'`, + Q: `'Q'`, + R: '(+[]+RegExp)[10]', + S: '(+[]+String)[10]', + T: '(NaN+Function("return Date")()())[30]', + U: '(NaN+Function("return{}")()["to"+String["name"]]["call"]())[11]', + V: `'V'`, + W: `'W'`, + X: `'X'`, + Y: `'Y'`, + Z: `'Z'` +};