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

По теме:


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

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

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

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

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

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

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

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

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

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

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

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

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