Недавно меня попросили сделать одну простую вещь со скриптами на сайте. Естественно там все оказалось сложнее чем хотелось бы. Чуть позже я узнал что мой предшественник, что пытался разобраться с этим скриптом, не осилил уличной магии 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 комментария
10.06.2009 в 14:06
>Основной затык, как я понимаю, был в функции eval(function(p,a,c,k,e,r){ …всякая хрень… ))
Невалидная конструкция — путаница с круглыми и фигурными скобками.
JS-обфускаторы обычно не просто шифруют код, но и изменяют его: например заменяют осмысленные имена переменных и функций на короткие, а в некоторых случаях даже преобразуют управляющие конструкции.
Поэтому, даже после полной расшифровки и форматирования обфусцированного кода, понять его может быть далеко не просто.
10.06.2009 в 17:29
Конструкция валидна :) Если чуть полнее, то это получится вот так:
eval( function(p,a,c,k,e,r) { // всякая хрень в самой ффункции - тут в основном циклы и регекспы }( /* всякая хрень в параметрах */ ) )А т.к. скобочки – тоже хрень, я их с чистой совестью сократил :)
Как можно заметить – тут на конце две круглые скобки.
20.08.2009 в 12:38
Ну хоть кто-то пролил свет на эту тему