Деобфускація скриптів 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. Їх обробляти не треба. Щоб заміна виконувалася більш якісно, ​​робити її рекомендується після форматування коду.

Ця стаття описує лише загальні принципи деобфускаціі, для кожного випадку доведеться продумувати і застосовувати індивідуальний підхід. Але зазвичай для виконання злому або розбору алгоритму окремої функції повна деобфускація і не потрібно.