Обновить
0

Пользователь

Отправить сообщение
Есть ряд методов обфускации, которые полностью «парализуют» такой подход к обфускации регэкспами. Например, переименование переменных глобально и использование большого кол-ва дубликатов. Тут надо будет следить за областью видимости переменных.
Около года назад я столкнулся с похожей задачкой (тоже, к стати, скрипт всплывающего окна) и вот там как раз подобные методы не сработали.
Но я нашел очень мощный набор инструментов: github.com/estools
Подход такой: разбираем жс-код в дерево, прогоняем по нему разные методы деобфускации, результат опять генерим в жс-код. Первое и последние — не проблема, а вот сами методы было не просто реализовать и особенно там, где нужно учитывать области видимости. Но в итоге получилось и код оказался прям хорошо читаемым, только названия переменных подводили. Но их уже в нормальных IDE можно удобно править в процессе вникания в код.

Вот примеры методов, которые деобфусцируют то, что у вас под номером 4:
var estraverse = require('estraverse');
(function() {

    module.exports = function (ast){
        var count = 0;

        estraverse.replace(ast, {
            enter: function(n, p){
                if(n.type == 'ConditionalExpression' &&
                    n.test.type == 'BinaryExpression' &&
                    n.test.left.type == 'Literal' &&
                    n.test.right.type == 'Literal'){
                    count++;
                    var l = n.test.left.value;
                    var r = n.test.right.value;
                    var test;
                    switch(n.test.operator){
                        case '>':  test = l >  r; break;
                        case '>=': test = l >= r; break;
                        case '<':  test = l <  r; break;
                        case '<=': test = l <= r; break;
                    }
                    return test ? n.consequent : n.alternate;
                }
                return n;
            }
        });
        return count;
    };

}());

var estraverse = require('estraverse');
(function() {

    module.exports = function (ast){
        estraverse.replace(ast, {
            enter: function(n, p){
                if(n.type == 'SequenceExpression' && n.expressions.length == 2){
                    return n.expressions[1];
                }
                return n;
            }
        });
    };

}());


Информация

В рейтинге
Не участвует
Зарегистрирован
Активность