Created
May 6, 2018 19:07
-
-
Save nstarke/9f9b95aa1af3b0eee289f0f1ff35803d to your computer and use it in GitHub Desktop.
JavaScript: Toy Obfuscator 1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Toy Obfuscator 1 | |
// This is not meant to be a serious attempt at obfuscation, though it does work. | |
// run with CODE_FILE=source.js node toy-obfuscator01.js | |
var fs = require('fs'); | |
var code = fs.readFileSync(process.env.CODE_FILE).toString(); | |
var globalReserved = []; | |
var matrix = []; | |
var magicBlank = Math.floor(Math.random() * 127) + 127; | |
var maxWidth = Math.floor(code.length > 1000 ? (code.length / 10) :10); | |
var width = Math.round((Math.random() * (maxWidth - 2)) + 2); | |
function buildVariable(){ | |
var varName = Math.floor(Math.random() * Math.pow(1024, 3)); | |
while (globalReserved.indexOf(varName) !== -1) varName = Math.floor(Math.random() * Math.pow(1024, 3)); | |
globalReserved.push(varName); | |
return '_' + varName; | |
} | |
function buildNumberMapping(){ | |
var start = 32, end = 127; | |
var mapName = buildVariable(); | |
var unmapName = buildVariable(); | |
var map = {}; | |
map[unmapName] = {}; | |
map[mapName] = {}; | |
for (var i = 0; i <= 9; i++){ | |
var varName = Math.floor(Math.random() * (end - start)) + start; | |
if (globalReserved.indexOf(varName) !== -1) varName = Math.floor(Math.random() * (end - start)) + start; | |
globalReserved.push(varName); | |
map[mapName][i] = String.fromCharCode(varName); | |
map[unmapName][String.fromCharCode(varName)] = i; | |
} | |
return { mapName: mapName, unmapName: unmapName, map: map }; | |
} | |
var numbersMap = buildNumberMapping(); | |
var numbersMapVar = buildVariable(); | |
var numbersMapAssign = 'var ' + numbersMapVar + '=' + JSON.stringify(numbersMap.map) + ';'; | |
function buildNumberFromMapping(num, mapName){ | |
var numStr = "" + num; | |
var result = ''; | |
for (var i = 0; i < numStr.length; i++){ | |
result += numbersMap.map[mapName][numStr[i]]; | |
} | |
return result; | |
} | |
var xKey = buildVariable(); | |
var yKey = buildVariable(); | |
var vKey = buildVariable(); | |
for (var j = 0; j < Math.ceil(code.length / width); j++){ | |
var row = []; | |
for (var i = 0; i < width; i++){ | |
var cell = {}; | |
cell[xKey] = buildNumberFromMapping(i, numbersMap.mapName); | |
cell[yKey] = buildNumberFromMapping(j, numbersMap.mapName); | |
if (code[i + (j * width)]){ | |
cell[vKey] = code[i + (j * width)]; | |
} else { | |
row.push(cell); | |
break; | |
} | |
row.push(cell); | |
} | |
matrix.push(row.sort(function(a, b){ return a[vKey] > b[vKey]; })); | |
} | |
var matrixVar = buildVariable(); | |
var matrixAssign = 'var ' + matrixVar + '=' + JSON.stringify(matrix) + ';'; | |
function buildPrototypeFunctions(){ | |
var objects = Object.getOwnPropertyNames(String.prototype).map(function(item){ | |
return 'String.prototype.' + item; | |
}).concat(Object.getOwnPropertyNames(Array.prototype).map(function(item){ | |
return 'Array.prototype.' + item; | |
})).concat(Object.getOwnPropertyNames(Object.prototype).map(function(item){ | |
return 'Object.prototype.' + item; | |
})).concat(Object.getOwnPropertyNames(Number.prototype).map(function(item){ | |
return 'Number.prototype.' + item; | |
})).concat(Object.getOwnPropertyNames(Boolean.prototype).map(function(item){ | |
return 'Boolean.prototype.' + item; | |
})); | |
objects.push('parseInt'); | |
objects.push('"length"'); | |
var exec = ""; | |
var map = {}; | |
for (var i = 0; i < objects.length; i++){ | |
var varName = buildVariable(); | |
var obj = objects[i]; | |
var objAssign = 'var '+ varName + '=' + obj + ';'; | |
exec += objAssign; | |
map[obj] = varName; | |
} | |
return { exec: exec, map: map }; | |
} | |
var prototypeFunctions = buildPrototypeFunctions(); | |
function buildUnmap(numbersMap, unmapObj){ | |
var varArg1 = buildVariable(); | |
var varResult = buildVariable(); | |
var varIndex = buildVariable(); | |
var varResultAssign = 'var ' + varResult + '="";'; | |
var forLoopBody = varResult + '+='+numbersMap + '["'+unmapObj+'"]['+varArg1+'[' + varIndex + ']];'; | |
var forLoop = 'for (var '+ varIndex +'=0;' + varIndex +'<'+varArg1+'['+ prototypeFunctions.map['"length"'] +'];'+varIndex+'++){' + forLoopBody + '};'; | |
var returnStmt = 'return ' + prototypeFunctions.map['parseInt'] +'(' + varResult + ');'; | |
var exec = 'function(' + varArg1 + '){' +varResultAssign+forLoop+returnStmt+' }'; | |
return exec; | |
} | |
var buildUnmap = buildUnmap(numbersMapVar, numbersMap.unmapName); | |
var buildUnmapVar = buildVariable(); | |
var buildUnmapAssign = 'var ' + buildUnmapVar + '=' + buildUnmap + ';'; | |
function buildDecoder(){ | |
var firstFunctionArg = buildVariable(), | |
secondFunctionArg = buildVariable(), | |
secondFunctionArg2 = buildVariable(); | |
var sortFunction = 'return ' + buildUnmapVar + '(' +secondFunctionArg + '["' + xKey + '"]) >' + buildUnmapVar + '(' + secondFunctionArg2 + '["'+ xKey + '"]);'; | |
var forEachFunction = 'return ' + prototypeFunctions.map['Array.prototype.sort'] + '.call(' + firstFunctionArg + ', function('+ secondFunctionArg + ', ' + secondFunctionArg2 + ' ){' + sortFunction +'});'; | |
var forEachFunctionVar = buildVariable(); | |
var forEachFunctionAssign = forEachFunctionVar + '=' + forEachFunction; // no ; needed, already added. | |
var secondSortFunctionArg1 = buildVariable(), | |
secondSortFunctionArg2 = buildVariable(); | |
var secondSortFunctionCallback = 'return ' + secondSortFunctionArg1 + '[' +buildUnmapVar + '("' + yKey + '")] >' + secondSortFunctionArg2 + '['+buildUnmapVar + '("' + yKey+'")];'; | |
var secondSortFunction = prototypeFunctions.map['Array.prototype.sort'] + '.call('+forEachFunctionVar+', function(' + secondSortFunctionArg1 +',' + secondSortFunctionArg2 + '){' + secondSortFunctionCallback +' });'; | |
var secondSortFunctionVar = buildVariable(); | |
var secondSortFunctionAssign = secondSortFunctionVar + '=' + secondSortFunction; //no ; needed, already added. | |
var decode = prototypeFunctions.map['Array.prototype.map'] + '.call(' + matrixVar + ', function(' + firstFunctionArg + '){' + forEachFunction +'; })'; | |
var decodeVar = buildVariable(); | |
var decodeAssign = 'var ' + decodeVar + '=' +decode +';'; | |
var reduceArg1 = buildVariable(), | |
reduceArg11 = buildVariable(), | |
reduceArg2 = buildVariable(), | |
reduceArg22 = buildVariable(); | |
var reversed = prototypeFunctions.map['Array.prototype.reverse']+'.call('+decodeVar+');'; | |
var reversedVar = buildVariable(); | |
var reversedAssign = 'var '+reversedVar+'='+reversed; | |
var reduce = prototypeFunctions.map['Array.prototype.reduce'] +'.call('+reversedVar+', function('+reduceArg1+','+reduceArg11+'){ return '+ prototypeFunctions.map['Array.prototype.join'] + '.call(' +prototypeFunctions.map['Array.prototype.map']+ '.call('+reduceArg11+ ', function('+reduceArg2+'){ return '+reduceArg2+'["'+vKey+'"] }),"") + '+reduceArg1+' },"");'; | |
return decodeAssign + reversedAssign+ reduce; | |
} | |
var decoder = buildDecoder(); | |
var exec = prototypeFunctions.exec + matrixAssign + numbersMapAssign + buildUnmapAssign + decoder; | |
console.log(exec); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment