special

This webpage has been robot translated, sorry for typos if any. To view the original content of the page, simply replace the translation subdomain with www in the address bar or use this link.

Деобфускация скриптов 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. Их обрабатывать не надо. Чтобы замена выполнялась более качественно, делать ее рекомендуется после форматирования кода.

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


Created/Updated: 25.05.2018

';>