Re: Шифрование JS-файлов?
От Peter B. Shalimoff (2:5020/400) к Dimon
В ответ на Заголовок предыдущего сообщения в треде (Имя Автора)
From: "Peter B. Shalimoff" <vshalim@home.ru>
Dimon wrote:
> >> Скажите пожалуйста, чем зашифрованы JS-файлы в DataLife Engine?
> > Пример кода?
> eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a
Hу да, как и ожидал: очередной вариант обфускатора на тему eval.
Собственно, любое шифрование скриптов, отдаваемых клиенту, сводится к
выполнению кода: либо через eval, либо через изменение структуры
документа (document.write("<script></script>"). Соответственно, взлом
заключается в переопределении нужной функции и ожидании момента, когда в
нее будет передан расшифрованный текст. Более сложный для взлома вариант
- изменение структуры документы через свойства его элементов (например,
innerHTML) - если я ничего не пропустил, то перехватить обращение к
свойству объекта можно только в Netscape/Gecko. Можно, конечно, сделать
постоянный опрос свойства через setInterval, но это ненадежно:
выполненный расшифрованный код может подчистить за собой. В любом
случае, называть это шифрованием язык не поворачивается, поскольку ключ
для восстановления исходного текста если и существует, то передается
клиенту, и все секреты - больше не секреты. Конкретно в этом случае они,
кажется, отдают себе отчет в этом и честно признаЮтся в параметрах
функции: это - сжатие (function (p,a,c,k,e,r)). Только функция -
unpacker, а не packer.
Взлом варианта, использующего eval, заключается в переопределении
функции eval:
<html>
<script>
// Hаписали шпионскую eval.
// В параметре str содержится расшифрованный текст.
function my_eval(str)
{
// Что у нас там?
alert("my_eval: str:\n" + str);
// Вызываем оригинальную функцию eval на случай,
// если расшифровка состоит из нескольких этапов:
// eval("eval(...)");
var res = old_eval(str);
alert("my_eval: res:\n" + res);
return res;
}
// Сохранили ссылку на оригинальную функцию eval.
var old_eval = eval;
// Заменили оригинальную eval на шпионскую.
eval = my_eval;
</script>
<!-- Поехали. -->
<script src="зашифрованное.js"></script>
С document.write - по аналогии.
Конкретно в этом случае переопределять ничего не надо: просто
форматируем по-человечески код function(p,a,c,k,e,r) и получаем алгоритм
декодера. После того, как становится известен алгоритм декодера,
написание кодера - тривиально. Если надо, могу расписать. Только смысл?
> >> Или может посоветуете какой-то хороший шифратор для JS?
> > Для каких целей?
> Hу собственно для того, чтобы зашифровать файлы.
Понятно, что шифратор нужен, чтобы зашифровать. Для каких целей
шифровать? Если цель - спрятать от клиента, то можно даже и не пытаться:
любое шифрование на стороне клиента будет взломано - вопрос времени и
денег. Если даже мелкомягкий закрытый Script Encoder сломали, то что уж
тут говорить про шифрование, использующее eval/DOM - оно ломается вообще
за шесть секунд. Я объяснения расписывал в разы дольше, чем "ломал". :)
А если цель - уменьшение размера, то обфускатор подойдет, гуглить
"javascript obfuscator".
--
0xdeadbeef
--- ifmail v.2.15dev5.4
* Origin: Sweet Home (2:5020/400)
Ответы на это письмо:
From: Username
Заголовок следующего сообщения в треде может быть длинным и его придется перенести на новую строку
From: Username
Или коротким