Я работаю над простым обфускатором кода javascript.
Скажем, у вас есть двумерная квадратная матрица из NxN
функций JavaScript.Для n = 3:
var m = [
[function(){return 1}, function(){return 2}, function(){return 3}],
[function(){return 4}, function(){return 5}, function(){return 6}],
[function(){return 7}, function(){return 8}, function(){return 9}]
]
Теперь в этом примере каждая из этих функций на самом деле будет содержать фрагменты кода из обфусцируемого кода и вызывать его. Типичный запутанный код будет выглядеть так:this:
(function(){ m[1][2](m[2][0](m[0][1]))(m[1][0])(m[2][2])(m[1][1](m[1][2](m[2][0]))); }());
Выше приведено следующее:
(function(){ 6( 7(2) )( 4 )( 9 )( 5( 6( 7 ) ) ); }());
Конечно, при условии, что типичный m[x][y]
возвращает функцииили что угодно, все это было бы очень легко расшифровать.Таким образом, после каждого вызова m[x][y]
, m[x][y]
будет переключать позицию с m[x+1][y-1]
, которая переключается в его позиции поворота с m[0][2]
, и в основном я хочу смешать их так сильно, что вы даже не посмеете попытаться расшифровать.Вероятно, с использованием случайно сгенерированной математики, и это происходит в соответствии с функцией.
Дело в том, что обфускатор должен знать эту формулу заранее, поэтому он знает, в какой m[x][y]
позвонить и в какой момент, и решитьпорядок, в котором нужно побеждать функции.Работающая реализация может даже привести к:
(function( m[0][0](m[0][0](m[0][0]))(m[0][0]) ))
И все еще работать.Итак, вот мои вопросы:
Как разделить код JavaScript на более мелкие функции?Я знаю, что в основном это делают компиляторы, но я также видел некоторые онлайновые beStifiers JS и средства подсветки синтаксиса, способные различать код и правильно выполнять свою работу.Я имею в виду, может ли регулярное выражение выполнять эту работу?
Это не работает и должно:
window.a = function(x){
var r = x*2;
window.a =alert; // redefines itself after first call
return r;
};
a('2 * 2 = ' + a(2)); // doesn't work. it should've alerted "2 * 2 = 4"
С другой стороны, это работает:
var i = 0;
window.a = function(x){
if(i===1){
i=0;
return alert(x);
}
i=1;
return x*2;
};
a('2 * 2='+a(2));
Почему?
Существуют ли аналогичные текущие проекты?Может быть, я могу получить некоторые заметки или ссылку на них.