Blog. Just Blog

Деобфускация скриптов PHP и JavaScript

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Одним из наиболее надежных на сегодняшний день способов защиты скриптов от изучения и модификации является обфускация.


Обфускация (от лат. obfuscare, "затенять, затемнять") - запутывание кода программы, то есть приведение исходного текста к виду, сохраняющему функциональность программы, но затрудняющему анализ, понимание алгоритмов работы и модификацию.


В отличие от однозначно обратимого шифрования и упаковки, обфускация представляет собой необратимое действие. Это значит, что восстановить код скриптов до первоначального вида не представляется возможным. Все без исключения обфускаторы PHP и JavaScript работают двумя способами: из исходного текста удаляются переносы строк и незначимые пробелы, а имена классов, переменных и функций заменяются на бессмысленный набор символов. Эти действия могут как комбинироваться, так и выполняться независимо.

Как я уже и говорил, при деобфускации привести код в первоначальный вид невозможно. Но вполне можно "облагородить" его до такого состояния, когда можно без особого труда разобраться в алгоритме и внести необходимые изменения. Например, после деобфускации можно сломать защиту некоторых PHP-скриптов, убрать привязку JavaScript к домену, вырезать принудительную рекламу или еще что-нибудь подобное.

Первая стадия деобфускации - форматирование текста скрипта, расстановка переносов, выравнивание кода удобной для восприятия "лесенкой". Для этого я использую два инструмента. Компания WaterProof Software разработала маленькую (менее 100 килобайт) бесплатную программу для форматирования кода PHP-скриптов phpCodeBeautifier. Чтобы скачать ее с офсайта требуется бесплатная регистрация, поэтому вот для удобства прямая ссылка на загрузку. Программа консольная, параметры командной строки можно посмотреть в инструкции из архива. Для любителей окошек есть GUI-версия, правда более старая, но к ней вполне можно подложить консольный файл от последней версии.

Скриншот программы phpCodeBeautifier
Скриншот программы phpCodeBeautifier

Для форматирования скриптов на JavaScript и HTML-кода есть замечательный онлайновый сервис Beautify Javascript. Просто вставляете в форму текст скрипта, нажимаете кнопку "Beautify" и получаете красиво отформатированный скрипт. Для удобства я немного доработал и скомпилировал эту страничку в стационарный exe-файл. Может быть когда-нибудь найду время и силы чтобы переписать скрипт в полноценное приложение.

JavaScript Code Beautifier 1.0JavaScript Code Beautifier 1.0

JS.Code.Beautifier.1.0-PCL.zip (355,926 bytes)

При форматировании больших по объему скриптов браузер может выдать сообщение, что скрипт завис, и предложит остановить его выполнение. Этого делать не надо, просто для обработки требуется больше времени.

Скриншот программы JavaScript Code Beautifier
Скриншот программы JavaScript Code Beautifier

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

Если испорчены имена переменных и функций, то переходим ко второй части деобфускации. Здесь, к сожалению, готовых инструментов нет, ну или по крайней мере я их не встречал. Если кто-нибудь захочет безвозмездно взяться за написание такого инструмента, то я могу предоставить подробное техническое задание. Пока придется ограничиться теоретическими выкладками.
Как это ни странно звучит, но для деобфускации воспользуемся теми же принципами, что и для обфускации. Из всех скриптов извлекаются имена всех переменных, и заменяются на другие. Разница лишь в том, что извлекать мы будем испорченные имена и заменять на более удобные для восприятия. Например $kOObgZ4tf2LEaSmFfc555 (Obfusc) или $IIIIIIIIIIIl (PHP LockIt!) заменить на $var_3. Для одиночного скрипта это можно сделать в обычном блокноте с глобальной заменой, для нескольких скриптов придется сперва извлечь все имена переменных из всех скриптов, а только потом выполнять глобальную замену. При этом не забывайте про служебные переменные типа глобальных массивов $_GET и $_POST в PHP, а также зарезервированные слова в JavaScript. Их обрабатывать не надо. Чтобы замена выполнялась более качественно, делать ее рекомендуется после форматирования кода.

Эта статья описывает лишь общие принципы деобфускации, для каждого случая придется продумывать и применять индивидуальный подход. Но обычно для выполнения взлома или разбора алгоритма отдельной функции полная деобфускация и не требуется. Про распаковку и расшифровку скриптов JavaScript написана отдельная статья.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 29577 | Комментариев: 17

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
shomeax (13.11.2011 в 07:09):
для деобфускации неплохо подходит инструмент рефакторинга в среде NetBeans.
их редактор строит базу использования идентификаторов и позволяет быстро переименовывать в пределах видимости. жаль только, что сама IDE так много весит, но да у неё много других полезностей для веб-программиста, так что поставить имеет смысл.
Vladislav (09.10.2011 в 08:30):
http://cp1251.darkoff.ru/phpoptimizer/
мой аналог JS.Code.Beautifier но для PHP
ManHunter (02.12.2009 в 00:53):
Isaev, пока ничего не посоветую, я Java не занимаюсь, а там обфускация основана все-таки на синтаксисе языка (имхо)
Isaev (01.12.2009 в 22:02):
ManHunter а по этому виду обфускации можешь чего посоветовать?
http://cracklab.ru/f/index.php...m=1&page=0#9
Владимир (28.11.2009 в 21:08):
да я уже ето понял .всё равно спасибо
ManHunter (28.11.2009 в 21:02):
Там все копирайты указаны. Но в интернете ты ее не найдешь.
Владимир (28.11.2009 в 21:00):
последний ворос :Massacre-это тобой написанная программа или из инета?в скрипте сказанно что ты ею мои скрипты декодировал
Владимир (28.11.2009 в 20:47):
слов нет.СПАСИБО
ManHunter (28.11.2009 в 19:44):
Распаковать и посмотреть, испорчен исходный код или нет. Если испорчен, то была использована обфускация, и придется еще дополнительно напрячься, чтобы привести скрипт в читаемый вид.
Владимир (28.11.2009 в 19:40):
а как мне ето узнать?можно поподробнее
ManHunter (28.11.2009 в 19:31):
Снимается элементарно, но при условии, что не была использована обфускация.
Владимир (28.11.2009 в 19:25):
есть скрипт зафшифрован "PHP LockIt! 2.0.4.0 (GZIP)".лечится ето или нет?очень нужно просмотреть исходный текст скрипта
ManHunter (22.11.2009 в 19:38):
Пока нигде. А потом я еще подумаю, выкладывать его на паблик или нет.
Каналья (21.11.2009 в 03:19):
Скажите пожалуйста, где же деобфускатор пхп?)
ManHunter (30.08.2009 в 00:38):
Готовится к релизу полноценный деобфускатор для PHP. Так что скоро будет всем счастье.
ManHunter (27.10.2008 в 07:01):
Nutscracker, эта херня снимается за секунды. Инструментарий в наличии, статья готовится. На яндексе каждый второй скрипт этим пакером обработан.
Nutscracker (27.10.2008 в 03:44):
Еще вот такое безумие бывает:
http://javascript.ru/optimize/...ntsip-raboty

К счастью, лечится заменой eval на что-нибудь, показывающее текст пользователю.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2017
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0039 сек.) / Память: 4.5 Mb
Наверх