Skip to content

Instantly share code, notes, and snippets.

@nstarke
Created May 6, 2018 19:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nstarke/9f9b95aa1af3b0eee289f0f1ff35803d to your computer and use it in GitHub Desktop.
Save nstarke/9f9b95aa1af3b0eee289f0f1ff35803d to your computer and use it in GitHub Desktop.
JavaScript: Toy Obfuscator 1
// 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