Javascript - как побеждать функции и менять их назначение после каждого вызова? - PullRequest
3 голосов
/ 30 марта 2012

Я работаю над простым обфускатором кода 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]) ))

И все еще работать.Итак, вот мои вопросы:

  1. Как разделить код JavaScript на более мелкие функции?Я знаю, что в основном это делают компиляторы, но я также видел некоторые онлайновые beStifiers JS и средства подсветки синтаксиса, способные различать код и правильно выполнять свою работу.Я имею в виду, может ли регулярное выражение выполнять эту работу?

  2. Это не работает и должно:

    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));
    

    Почему?

  3. Существуют ли аналогичные текущие проекты?Может быть, я могу получить некоторые заметки или ссылку на них.

1 Ответ

2 голосов
/ 30 марта 2012

Прежде всего поздравляю с тем, что вы делаете.Это немного безумно, но почти блестяще.

Вопрос 1:

Я не знаю, как вы могли это сделать.Я потратил некоторое время на размышления о том же принципе.

Вопрос 2:

Ваш первый пример не работает, потому что первый вызов a на самом деле a( "2 * 2 = " + x ), где x будетвторой вызов, поэтому, когда вызывается первый a, вы получаете NaN, потому что вы даете ему String

Вопрос 3:

Подобные проекты?Хм, дай мне подумать ... Я думаю, у каждого есть свой проект для чего-то подобного, потому что код виден.Фактические источники, которых я не знаю.

Предложение:

Вы можете считать эту квадратную 2D-матрицу кубом 3D Рубика, чтобы вы могли перетасовать и решить ее.Интересная часть заключается в том, что вы можете комбинировать эту серию ходов, чтобы фактически стать большой функцией для выполнения чего-либо.В любом случае, вероятно, лучшим решением для такого рода вещей IMHO было бы дублировать, а затем стереть основные объекты языка JS и сохранить его в сложном графе внутри анонимной функции, куда никто не может войти, чтобы возиться, как для коданечитаемо, ну я думаю, что это ИСКУССТВО.

...