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