10 июня 2009

Недавно меня попросили сделать одну простую вещь со скриптами на сайте. Естественно там все оказалось сложнее чем хотелось бы. Чуть позже я узнал что мой предшественник, что пытался разобраться с этим скриптом, не осилил уличной магии JavaScript. Основной затык, как я понимаю, был в функции eval(function(p,a,c,k,e,r){ …всякая хрень… )). Я думаю веб-разработчики видели это и знают как с этим обращаться. А для тех кто не знает, я попытаюсь пролить немного света.

Архивация и шифрования JavaScript

Архивирование JavaScript-а дело на мой взгляд неблагодарное. Бо разархивировать его придется средствами того-же JavaScript. При этом достигается эффект некого шифрования. Как показывает практика – далеко не у всех хватает ума или знаний расшифровать подобный заархивированный скрипт. Но о расшифровке я расскажу потом. Сейчас речь о шифровании или архивирвоании. Не суть важно как назвать :)

Для того чтобы сделать из вашего скрипта какую-то неудобочитаемую хрень, которая однако будет работать, можно написать подобный архиватор самому. А можно воспользоваться уже готовым скриптом и быстренько зашифровать свой JavaScript. Пользоваться сим делом достаточно просто – нужно скопировать свой код в верхнее поле, не забыть поставить галочку Base62 encode, скопировать получившийся код из нижнего окошка.

Стоит понимать – чем меньше скрипт, тем меньше эффект. Как от архивации так и от шифрования. На практике это имеет смысл использовать только для больших файлов. Этак от 300 строчек кода. К примеру сим инструментом очень активно пользуются jQuery-сты
как для самой библиотеки так и для плагинов к ней разнообразных.

Как сделать так чтобы код вернулся взад?

У большинства людей, что интересуются P.A.C.K.E.R-ом обычно стоит задача не заархивировать свой код, а разархивировать чужой. Внимательные или опытные веб-разработчики без труда смогут это сделать. Для криптоаналитиков это тоже не составит никаких проблем. А вот для начинающих программистов будет очень полезно узнать что такое команда eval и что возвращает эта страшная function(p,a,c,k,e,r){ … }

На самом деле все очень просто. Функция eval выполняет код, переданный ей в параметрах в виде строки. Функция пакера – function(p,a,c,k,e,r){ … } – возвращает строчку с кодом, который нужно выполнить. Соответственно если мы хотим прочитать код, мы можем использовать один из трех следующих вариантов:

// 1. Выводим в текстовое поле, откуда потом копируем это все
document.write('<textarea style="width:100%;height:100%">')
document.write(function(p,a,c,k,e,r){ ... всякая хрень ... })
document.write('</textarea>')

// 2. Выводим в firebug, откуда копируем код.
// Естественно firebug должен быть установлен
console.debug('Этот код был разархивирован:', function(p,a,c,k,e,r){ ... всякая хрень ... })

// 3. Просто выводим это в диалоговое окно.
// Но не все браузеры позволяют копировать текст из диалоговых окон.
alert(function(p,a,c,k,e,r){ ... всякая хрень ... })

К сожалению полученный код получится неотформатированным. Если хочется его комфортно читать и редактировать, придется перебрать код руками, сделав отступы везде где это нужно. Хотя если вам лень перебирать код руками, или вы двумя руками голосуется за автоматизацию рутинных операций – можно воспользоваться автоформатированием в своем любимом редакторе, или сходить на сайт автоформатирования для JavaScript

Вот так легко и просто мы можем получить красивый исходный код, чтобы иметь возможность сотворить с ним все, что пожелает наша душа.

3 комментария

3 комментария на запись “Знакомство со страшным зверем P.A.C.K.E.R.”

  1. Алик Кириллович пишет:

    >Основной затык, как я понимаю, был в функции eval(function(p,a,c,k,e,r){ …всякая хрень… ))
    Невалидная конструкция — путаница с круглыми и фигурными скобками.

    JS-обфускаторы обычно не просто шифруют код, но и изменяют его: например заменяют осмысленные имена переменных и функций на короткие, а в некоторых случаях даже преобразуют управляющие конструкции.

    Поэтому, даже после полной расшифровки и форматирования обфусцированного кода, понять его может быть далеко не просто.

  2. nekt пишет:

    Конструкция валидна :) Если чуть полнее, то это получится вот так:

    eval(
        function(p,a,c,k,e,r)
        {
            // всякая хрень в самой ффункции - тут в основном циклы и регекспы
        }( /* всякая хрень в параметрах */ )
    )
    

    А т.к. скобочки – тоже хрень, я их с чистой совестью сократил :)
    Как можно заметить – тут на конце две круглые скобки.

  3. Максим Покровский пишет:

    Ну хоть кто-то пролил свет на эту тему

Оставить комментарий