PHP Obfuscator 2.5.4 - файл помощи
Содержание
  1. Об обфускаторе
  2. Требования к системе
  3. Возможности
  4. Базовое использование (Web-интерфейс)
    1. Анализ файлов
    2. Профили обфускатора
    3. Обфускация файлов
  5. Расширенное использование
    1. Этапы (шаги) обфускации
      1. Переименование коллбэков
      2. Добавление бесполезного кода
      3. Шифрование строк
      4. Шифрование фиксированных имен и имен встроенных функций
      5. Шифрование чисел
      6. Изменение системы счисления целых чисел
      7. Переименование переменных
      8. Переименование констант классов
      9. Переименование функций/трейтов/классов/интерфейсов
      10. Переименование пространств имен
      11. Изменение синтаксиса конструкций управления потоком выполнения
      12. Замена встроенных констант их значениями
      13. Оборачивание констант в вызов constant()
      14. Упрощение PHP-синтаксиса
      15. Добавление бесполезных комментариев
      16. Изменение регистра имен сущностей PHP
      17. Добавление аргументов к объявлениям функций
      18. Шифрование символов строк в escape-последовательности
      19. Сжатие кода
      20. Установка копирайта
    2. Модули, используемые в этапах обфускации
      1. Encoder (настройки шифрования строк)
      2. Encoder (настройки шифрования чисел)
      3. String processor (настройки обработки существующих и генерируемых строк)
    3. Создание профилей обфускатора
      1. Задание используемых встроенных классов и интерфейсов
      2. Задание используемых пользовательских классов и интерфейсов
      3. Фиксирование имен сущностей PHP
      4. Настройка окружения обфусцируемых PHP-скриптов
      5. Работа со словарями комментариев
      6. Выбор предустановленного профиля обфускации
      7. Настройка этапов и проходов обфускации
      8. Ревью и применение настроек
      9. XML-представление профиля обфускатора
      10. Сохранение, использование, редактирование, удаление файлов XML-профилей обфускатора
    4. Профили генератора бесполезного кода (XML)
    5. Фильтры этапов обфускации
  6. Консольный интерфейс и его опции
  7. Планируемые доработки
  8. Что не поддерживается обфускатором на данный момент
  9. Changelog
Об обфускаторе
Проект PHP Obfuscator 2 является последователем PHP Obfuscator 1.5, написанного тем же автором. Скрипт был полностью переписан и заточен под возможности самых последних версий PHP. Помимо этого, была добавлена масса новых возможностей, функция совместной обработки нескольких файлов, анализатор кода, обновлен Web-интерфейс и добавлен консольный режим работы. Скрипты после обфускации будут работать на PHP 5.2 и выше (если Вы, конечно, не использовали в них возможности более новых версий PHP).
Требования к системе
Для работы обфускатора необходим PHP версии 5.4 или старше. Также требуются следующие расширения PHP: mb_substr, ctype, PCRE, iconv, zlib, libxml, SimpleXML, DOM, tokenizer, ZIP. Для работы с Web-интерфейсом рекомендуется использовать Web-браузер (Opera, Chrome, Firefox, IE, Safari) самой последней версии. Если Вы планируете обрабатывать большое количество скриптов или скрипты большого размера, рекомендуется разрешить интерпретатору PHP выделять достаточное количество оперативной памяти (256 Мб и больше) и работать неограниченное время. Кроме того, для обфускации скриптов, написанных под PHP какой-либо версии, обфускатор должен быть запущен на PHP такой же версии или новее. Это значит, что Вы не сможете обфусцировать скрипт, написанный под PHP 5.6, если запустите обфускатор на PHP 5.4 или 5.5.
Возможности
Обфускатор поддерживает все самые современные синтаксические особенности языка PHP вплоть до версии 5.6 включительно. Далее перечислены основные возможности обфускатора:
Полная поддержка ООП
Обфускатор поддерживает все особенности ООП языка PHP пятой ветки.
Анализ файлов
Позволяет производить предварительный анализ файлов для того, чтобы определить, может ли скрипт быть успешно обфусцирован без предварительной настройки обфускатора.
Совместная обработка файлов
Можно обработать как отдельный PHP-скрипт, так и несколько скриптов разом. В этом случае они будут обработаны как скрипты одного проекта, с одинаковыми настройками.
Профили обфускации
Позволяют полностью кастомизировать работу обфускатора. Могут применяться как встроенные профили, так и пользовательские. Для создания пользовательских профилей создан удобный мастер.
Большое количество вариантов обфускации
Благодаря большому набору опций обфускации можно как защитить скрипт, так и оптимизировать его. Все зависит от настройки обфускатора.
Профили генератора бесполезного кода
Можно полностью кастомизировать работу генератора случайного бесполезного кода.
Словари комментариев
Можно настроить, как и какие бесполезные комментарии будут добавлены в скрипт.
Современный Web-интерфейс
Отображает прогресс выполнения заданной операции, поддерживает темы и два языка локализации.
Консольный режим
Вдобавок к Web-интерфейсу, обфускатор имеет консольный режим. Благодаря этому обфускатор может быть встроен в цепочку сборки какого-либо проекта, а также использоваться в автоматическом режиме.
Автоматическая проверка обновлений
Обфускатор позволяет настроить автоматическую проверку новых версий, либо проверять их наличие вручную.
Базовое использование
Web-интерфейс обфускатора позволяет обрабатывать (анализировать и производить обфускацию) PHP-скрипты несколькими способами:
Вставка PHP-кода в поле ввода
Вы можете вставить PHP-код для обработки в текстовое поле на соответствующей вкладке Web-интерфейса обфускатора. В случае выполнения обфускации имеется также возможность вывести ответный результат в это же поле (а не в виде скачивания файла). В этом случае следует отметить соответствующий флажок под полем ввода. Внимание! Если результат обфускации будет содержать непечатаемые символы (недопустимые для кодировки UTF-8), копирование из поля может его испортить. Кроме того, обфускатор в такой ситуации может выдать соответствующую ошибку, если не удастся передать результат в поле ввода. В этом случае флажок необходимо снять и повторить обфускацию.
При использовании поля ввода также имеется возможность просмотреть все предупреждения анализатора после проведения анализа кода.
Загрузка PHP-файла
Обфускатор поддерживает загрузку PHP-файлов по одиночке. Если загружается сразу несколько файлов, они будут обработаны совместно, как взаимосвязанные файлы.
Загрузка ZIP-архива с PHP-файлами
Вы также можете загрузить ZIP-архив с несколькими PHP-файлами, которые требуется обработать совместно. ZIP-архив может содержать также и другие файлы, помимо PHP-скриптов. Обфускатор выберет файлы для обработки по списку расширений, указанному на вкладке загрузки. При обфускации как результат вы получите оригинальный ZIP-архив, в котором все PHP-файлы заменены на обработанные.
Анализ файлов
Анализ файлов необходим для того, чтобы определить, может ли тот или иной PHP-файл быть корректно обработан обфускатором. Анализатор выведет подробный отчет о том, какие возможности метапрограммирования и в каких строках были использованы в анализируемых скриптах. Если такие особенности были обнаружены в каком-либо скрипте, то нет гарантии, что он будет обработан обфускатором корректно без дополнительной настройки. Метапрограммирование позволяет менять код скрипта на этапе выполнения, т.е. код на этапе парсинга по сути неизвестен, поэтому невозможно правильно его обфусцировать.
Кроме того, проведенный анализ PHP-скриптов, которые Вы собираетесь обработать обфускатором, поможет при создании собственного профиля обфускатора с использованием мастера создания профилей.
Таким образом, всегда рекомендуется проводить анализ тех файлов, которые вы собираетесь обрабатывать, перед их обфускацией. В процессе работы анализатора будет отображаться прогресс его работы с указанием текущего обрабатываемого файла и выполняемого действия.
Если Вы использовали поле ввода для передачи исходного кода PHP-скрипта, то после анализа все предупреждения анализатора будут отображены в этом поле, и их можно будет пролистать, переключившись на вкладку с полем ввода и затем используя кнопки "Предыдущее предупреждение анализатора" и "Следующее предупреждение анализатора".
Профили обфускатора
Обфускатор включает в себя несколько встроенных профилей. Они должны позволить обрабатывать большинство PHP-скриптов без какой-либо дополнительной настройки. Далее представлен список профилей с их подробным описанием:
Pack only (Только упаковка)
Этот профиль производит исключительно упаковку скрипта. Применим для всех скриптов, даже для тех, которые используют метапрограммирование.
Комментарии будут удалены, все ненужные пробелы также будут удалены. Весь встроенный HTML, HEREDOC, NOWDOC будут преобразованы в вызовы echo().
Compress (Сжатие)
Позволяет дополнительно к упаковке заархивировать скрипт. Также является применимым для всех скриптов.
Комментарии и ненужные пробельные символы будут удалены. Весь встроенный HTML, HEREDOC, NOWDOC будут преобразованы в вызовы echo(). Скрипт будет сжат с использованием GZIP.
Optimize (Оптимизация)
Создан для оптимизации PHP-скриптов. Упаковывает скрипт, дает PHP-сущностям максимально короткие имена, упрощает синтаксис. Это позволяет интерпретатору PHP производить загрузку и исполнение скрипта немного быстрее.
Комментарии и ненужные пробельные символы будут удалены. Весь встроенный HTML, HEREDOC, NOWDOC будут преобразованы в вызовы echo(). Все сущности PHP будут переименованы с использованием максимально коротких имен. Синтаксис конструкций управления потоком выполнения будет изменен на классический. Некоторые константы будут заменены их значениями. Некоторые необязательные синтаксические особенности PHP будут удалены. Имена некоторых встроенных функций будут заменены на их более короткие псевдонимы.
Maximum compress (Максимальное сжатие)
Профиль аналогичен предыдущему, но также использует GZIP-сжатие. Цель этого профиля - произвести максимальное сжатие скрипта.
Комментарии и ненужные пробельные символы будут удалены. Весь встроенный HTML, HEREDOC, NOWDOC будут преобразованы в вызовы echo(). Все сущности PHP будут переименованы с использованием коротких имен. Синтаксис конструкций управления потоком выполнения будет изменен на классический. Некоторые константы будут заменены их значениями. Некоторые необязательные синтаксические особенности PHP будут удалены. Имена некоторых встроенных функций будут заменены на их более короткие псевдонимы. Скрипт будет сжат с использованием GZIP.
Light (Легкий)
Чувствительно усложняет разбор скрипта. Не приносит сильного ущерба производительности.
Комментарии и ненужные пробельные символы будут удалены. Весь встроенный HTML, HEREDOC, NOWDOC будут преобразованы в вызовы echo(). Все сущности PHP будут переименованы с использованием случайных имен из непечатаемых символов. Некоторые константы будут заменены их значениями. Некоторые необязательные синтаксические особенности PHP будут удалены. Синтаксис конструкций управления потоком выполнения будет изменен на альтернативный. Система счисления целых чисел будет изменена на восьмеричную. Будут добавлены некоторые бесполезные комментарии на английском языке. Регистр букв в именах некоторых сущностей PHP будет изменен случайным образом. Некоторые символы в строках будут заменены на восьмеричные и шестнадцатеричные escape-последовательности. Скрипт будет сжат с использованием GZIP.
Medium (Средний)
Сильно усложняет разбор скрипта. Приносит некоторый ущерб производительности.
Комментарии и ненужные пробельные символы будут удалены. Весь встроенный HTML, HEREDOC, NOWDOC будут преобразованы в вызовы echo(). Все сущности PHP будут переименованы с использованием случайных имен из непечатаемых символов. В некоторые объявления глобальных функций будут добавлены неиспользуемые аргументы. Некоторые константы будут заменены на их значения. Остальные константы будут преобразованы в вызовы функции constant(). Некоторые необязательные синтаксические особенности PHP будут удалены. Все строки будут зашифрованы с использованием base64 с распаковщиком в виде класса. Все целые числа будут развернуты в последовательность случайных математических операций. Синтаксис конструкций управления потоком выполнения будет изменен на альтернативный. Система счисления целых чисел будет изменена на восьмеричную. Будут добавлены некоторые бесполезные комментарии на английском языке. Регистр букв в именах некоторых сущностей PHP будет изменен случайным образом. Некоторые символы в строках будут заменены на восьмеричные и шестнадцатеричные escape-последовательности. Скрипт будет сжат с использованием GZIP.
Hard (Тяжелый)
Очень сильно усложняет разбор скрипта. Скрипт после обфускации будет работать заметно медленнее. Применяйте этот профиль с осторожностью к тем скриптам, для которых производительность играет большую роль.
Комментарии и ненужные пробельные символы будут удалены. Весь встроенный HTML, HEREDOC, NOWDOC будут преобразованы в вызовы echo(). Все сущности PHP будут переименованы с использованием случайных имен из непечатаемых символов. Будет добавлен случайный бесполезный код. В некоторые объявления глобальных функций будут добавлены неиспользуемые аргументы. Некоторые константы будут заменены на их значения. Остальные константы будут преобразованы в вызовы функции constant(). Некоторые необязательные синтаксические особенности PHP будут удалены. Все строки будут случайным образом разбиты и зашифрованы с использованием XOR на случайных ключах с распаковщиком в виде класса. Все имена пользовательских функций будут случайным образом разбиты и зашифрованы с использованием base64. Все целые числа будут развернуты в последовательность случайных математических операций. Все целые числа будут зишифрованы с использованием массива $GLOBALS. Все числа с плавающей точкой будут зашифрованы с использованием распаковщика в виде класса. Синтаксис конструкций управления потоком выполнения будет изменен на альтернативный. Система счисления целых чисел будет изменена на восьмеричную. Будут добавлены некоторые бесполезные комментарии на английском языке. Регистр букв в именах некоторых сущностей PHP будет изменен случайным образом. Некоторые символы в строках будут заменены на восьмеричные и шестнадцатеричные escape-последовательности. Скрипт будет сжат с использованием GZIP.
Hardcore (Суровый)
Невероятно усложняет разбор скрипта. Использует два прохода обфускации. Очень сильно увеличивает размер скрипта, а также замедляет его работу. Применяйте этот профиль к небольшим скриптам, которым неважна скорость работы.
Комментарии и ненужные пробельные символы будут удалены. Весь встроенный HTML, HEREDOC, NOWDOC будут преобразованы в вызовы echo(). При обфускации будет выполнено два прохода.
Проход 1: Будет добавлен случайный бесполезный код. В некоторые объявления глобальных функций будут добавлены неиспользуемые аргументы. Некоторые константы будут заменены на их значения. Остальные константы будут преобразованы в вызовы функции constant(). Все строки будут случайным образом разбиты и зашифрованы с использованием XOR на случайных ключах с распаковщиком в виде класса. Регистр букв в именах некоторых сущностей PHP будет изменен случайным образом. Все имена пользовательских функций будут случайным образом разбиты и зашифрованы с использованием base64. Все целые числа будут развернуты в последовательность случайных математических операций. Все целые числа будут зишифрованы с использованием массива $GLOBALS. Все числа с плавающей точкой будут зашифрованы с использованием распаковщика в виде класса. Все сущности PHP будут переименованы с использованием случайных имен из непечатаемых символов. Некоторые необязательные синтаксические особенности PHP будут удалены.
Проход 2: Все строки будут случайным образом разбиты и зашифрованы с использованием XOR на случайных ключах с распаковщиком в виде класса. Все имена пользовательских функций будут случайным образом разбиты и зашифрованы с использованием base64. Все целые числа будут развернуты в последовательность случайных математических операций. Все целые числа будут зишифрованы с использованием массива $GLOBALS. Все числа с плавающей точкой будут зашифрованы с использованием распаковщика в виде класса. Система счисления целых чисел будет изменена на восьмеричную. Все сущности PHP будут переименованы с использованием случайных имен из непечатаемых символов. Синтаксис конструкций управления потоком выполнения будет изменен на альтернативный. Будут добавлены некоторые бесполезные комментарии на английском языке. Регистр букв в именах некоторых сущностей PHP будет изменен случайным образом. Некоторые символы в строках будут заменены на восьмеричные и шестнадцатеричные escape-последовательности. Скрипт будет сжат с использованием GZIP.
Обфускатор также поддерживает создание пользовательских профилей. Это позволяет максимально кастомизировать работу обфускатора, а также произвести необходимую настройку для скриптов, которые обрабатываются ошибочно при использовании встроенных профилей (например, для скриптов, в которых использовано метапрограммирование).
Обфускация файлов
Выбор файла (или файлов) для обфускации осуществляется так же, как при использовании анализатора. Чем сложнее профиль, тем больше времени займет процесс. В процессе работы обфускатора будет отображаться прогресс его работы с указанием текущего обрабатываемого файла и выполняемого действия.
Для обфускации необходимо выбрать профиль обфускации, используя соответствующий список в Web-интерфейсе. Можно создать собственный профиль обфускатора. Для этого следует в списке выбора профиля отметить вариант "Пользовательский" ("Custom"), после чего воспользоваться появившимися кнопками под списком. Для обфускации также требуется задать профиль генератора случайного кода (в случае, если профиль обфускатора содержит этап генерации случайного бесполезного кода), используя соответствующий список в Web-интерфейсе. Если выбрана опция задания пользовательской конфигурации генератора, необходимо будет ее указать перед обфускацией, нажав на соответстующую кнопку под списком.
Этапы (шаги) обфускации
Этапы обфускации - это варианты обработки исходного скрипта. Они могут применяться для усложнения разбора кода или наоборот, для его оптимизации. Каждый этап выполняет конкретные действия и имеет те или иные настройки. В каждом проходе обфускатора может содержаться несколько этапов. Каждый этап выполняется один раз. Все они выполняются последовательно друг за другом. Далее приведено подробное описание каждого этапа и его настроек. Для каждого этапа будут даны некоторые рекомендации по использованию. Также указаны идентификаторы этапов для создания собственной конфигурации в формате XML с нуля. Для этого же приведены названия параметров настройки этапов и их допустимые значения вместе с примерами готовых конфигураций.
Есть возможность настроить также проходы обфускации. Каждый проход может содержать несколько этапов, и все проходы выполняются последовательно один за другим. Большинство профилей содержит один проход, и больше одного прохода может потребоваться только при создании очень сложных профилей.
Переименование коллбэков
Этот этап позволяет произвести предварительную обработку коллбэков следующего вида (пространства имен также поддерживаются):
array_map(Array('my_function'), $arr);
array_map(Array('MyClass', 'someFunction'), $arr);
array_map(Array('MyClass::someFunction'), $arr);
array_map(Array($obj, 'someFunction'), $arr);
array_map(Array($obj, 'MyParentClass::someFunction'), $arr);
array_map(Array($obj, 'parent::someFunction'), $arr);
array_map(Array($obj, 'self::someFunction'), $arr);
array_map(Array($obj, 'static::someFunction'), $arr);
Это необходимо, чтобы в дальнейшем правильно переименовать функции и классы, которые используются в подобных текстовых коллбэках. Этот этап автоматически привязывается к первым в профиле этапам Переименования функций/трейтов/классов/интерфейсов и Переименования пространств имен, получая из них настройки переименования сущностей. Обратите внимание, что только встроенные функции могут быть определены обфускатором как принимающие аргументы-коллбэки (такие, как array_map). При этом не все встроенные функции могут быть обработаны. Встроенные классы с методами, принимающими коллбэки (кроме __construct) не поддерживаются. Например, следующий код не может быть обработан на этом этапе, потому что в общем случае невозможно определить, к какому классу принадлежит вызываемый метод uasort, и принимает ли он название функции-коллбэка или же просто строку:
<?php
function cmp($a, $b)
{
    if($a == $b)
        return 0;

    return ($a < $b) ? -1 : 1;
}

$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);
$obj = new ArrayObject($array);
$obj->uasort('cmp');
print_r($obj);
Итак, если Вы используете коллбэки с текстовыми именами классов и функций (а не лямбда-функции), вероятно, стоит их все тщательно проверить и зафиксировать их имена в настройках профиля обфускатора (или заменить на лямбда-функции). В любом случае, рекомендуется включать этот этап в самое начало первого прохода, если Вы собираетесь переименовывать функции, классы или пространства имён. Нет смысла добавлять этот этап во второй и последующие проходы (если они есть в Вашем профиле), так как в этом случае какие-то PHP-сущности, вероятно, уже будут переименованы (если первый проход содержал соответствующие этапы обфускации). Кроме того, в таком случае обфускатор не сможет корректно обработать текстовые коллбэки при обфускации нескольких файлов совместно.
Таким образом, если Вы хотите, чтобы Ваш скрипт обфусцировался корректно без дополнительной настройки:
Если в коде используются пространства имен, то в некоторых случаях этап переименования коллбэков не сможет отличить глобальную встроенную функцию PHP от локальной, объявленной внутри пространства имен. Пример:
namespace Test
{
    function array_map($a, $b)
    {
    }
    
    //Этот вызов будет обработан - понятно, что функция глобальная
    \array_map('func', [1, 2, 3]);
    //Этот вызов НЕ будет обработан - понятно, что функция локальная
    \Test\array_map('func', [1, 2, 3]);
    //Этот вызов также НЕ будет обработан - понятно, что функция локальная
    namespace\array_map('func', [1, 2, 3]);
    //В общем случае здесь непонятно - глобальная функция использована или локальная,
    //поэтому такой вызов по умолчанию обработан не будет. Чтобы включить обработку подобных
    //вызовов, следует включить опцию force_namespaced_functions_processing, см. далее.
    array_map('func', [1, 2, 3]);
}
Анализатор помечает такие вызовы при проведении анализа скрипта.
ID этапа: rename_callback_functions_classes
Настройки этапа:
Режим обработки функций/классов в коллбэках
Соответствующий тег: mode [make_obfuscatable / fix_names].
Эта опция необязательна. Указывает, как должны обрабатываться текстовые коллбэки. По умолчанию mode = make_obfuscatable, что соответствует нормальному переименованию функций, классов и пространств имён, используемых в коллбэках, в соответствии с настройками этапов Переименования функций/трейтов/классов/интерфейсов и Переименования пространств имён. Можно задать mode = fix_names, в этом случае обнаруженные имена классов, функций и пространств имён, используемые в текстовых коллбэках, будут автоматически фиксироваться, т.е. не будут переименованы.
Форсированная обработка вызовов функций, которые могут быть как локальными, так и глобальными, внутри пространств имен
Соответствующий тег: force_namespaced_functions_processing [true / false].
Эта опция необязательна. Указывает, должны ли обрабатываться вызовы функций, которые могут быть как локальными, так и глобальными, внутри пространств имен. По умолчанию отключена.
Пример XML-конфигурации этапа:
<step id="rename_callback_functions_classes">
    <mode>make_obfuscatable</mode>
</step>
Добавление бесполезного кода
Добавляет случайный бесполезный код в Ваши PHP-скрипты без изменения логики их работы. Вы можете установить собственную конфигурацию для генератора случайного кода, в противном случае будет использована встроенная. Встроенная конфигурация поддерживает генерацию как фиксированных строк кода, которые не будут выполняться, так и динамическое создание кода на базе тех имен PHP-сущностей, которые используются в обрабатываемом скрипте, что еще более усложняет понимание того, нужен тот или иной фрагмент кода, или он был добавлен в процессе обфускации. Несмотря на то, что добавляемый код не влияет на логику скрипта, он может уменьшить скорость его выполнения. Чем больше кода добавляется, тем медленнее будет работать скрипт после обфускации, поэтому используйте этот этап разумно в случаях, когда скорость работы важна.
ID этапа: insert_useless_code
Этап поддерживает фильтры.
Настройки этапа:
Вероятность
Соответствующий тег: probability [Число].
Эта опция обязательна. Определяет вероятность добавления бесполезного кода в допустимые места кода исходного скрипта. Допустимо значение от 1 до 100.
Пример XML-конфигурации этапа:
<step id="insert_useless_code">
    <probability>7</probability>
</step>
Шифрование строк
Шифрует все строки в скриптах, используя выбранный алгоритм. Также шифрует inline HTML, HEREDOC, NOWDOC. Этот этап может замедлить выполнение скрипта, так как строки будут расшифровываться в процессе выполнения при каждом обращении к строке.
ID этапа: encode_strings
Этап поддерживает фильтры.
Сам этап не имеет никаких настроек. XML-тег настройки этапа включает в себя XML-тег настройки алгоритма шифрования (encoder).
Пример XML-конфигурации этапа:
<step id="encode_strings">
    <encoder id="class">
        <string_id_processor id="non_printable">
            <min_length>5</min_length>
            <max_length>10</max_length>
        </string_id_processor>
        <encoding_mode>xor</encoding_mode>
        <string_split>true</string_split>
    </encoder>
</step>
Шифрование фиксированных имен и имен встроенных функций
Шифрует все имена встроенных функций и фиксированные имена функций, используя выбранный алгоритм. Этот этап может замедлить выполнение скрипта, так как имена функций будут расшифровываться в процессе выполнения при каждом вызове той или иной функции.
Если функция находится внутри именованного пространства имен, то она может быть как локальной, так и глобальной в случае, если ее пространство имен не указано явно или не прописано через псевдоним use function. В этом случае функция обрабатываться не будет.
ID этапа: encode_funcs
Этап поддерживает фильтры.
Сам этап не имеет никаких настроек. XML-тег настройки этапа включает в себя XML-тег настройки алгоритма шифрования (encoder).
Пример XML-конфигурации этапа:
<step id="encode_funcs">
    <encoder>
        <string_id_processor id="non_printable">
            <min_length>5</min_length>
            <max_length>10</max_length>
        </string_id_processor>
        <encoding_mode>base64</encoding_mode>
        <string_split>true</string_split>
    </encoder>
</step>
Шифрование чисел
Шифрует целые числа и числа с плавающей точкой, используя выбранный алгоритм. Может заменять целые числа последовательностью случайных математических операций. Этот этап может замедлить выполнение скрипта, так как числа будут расшифровываться или вычисляться в процессе выполнения при каждом обращении к ним.
ID этапа: encode_numbers
Этап поддерживает фильтры.
XML-тег настройки этапа включает в себя XML-тег настройки алгоритма шифрования чисел (encoder).
Настройки этапа:
Цель
Соответствующий тег: target [int / float / all].
Эта опция обязательна. Указывает, к каким числам применим данный этап. Допустимые значения: int - целые числа; float - числа с плавающей точкой, all - все числа.
Пример XML-конфигурации этапа:
<step id="encode_numbers">
    <encoder id="random_math">
        <mode>all</mode>
        <max_op_count>5</max_op_count>
    </encoder>
    <target>int</target>
</step>
Изменение системы счисления целых чисел
Меняет систему счисления целых чисел на десятичную/шестандцатеричную/восьмеричную/двоичную или случайным образом.
ID этапа: change_integer_base
Настройки этапа:
Система счисления
Соответствующий тег: base [dec / hex / oct / bin / random].
Эта опция обязательна. Указывает, в какую систему счисления переводить целые числа. Допустимые значения: dec - десятичная, hex - шестнадцатеричная, oct - восьмеричная, bin - двоичная, random - случайная для каждого числа. Обратите внимание, что двоичная система счисления поддерживается только в PHP 5.4 и новее. Поэтому применяйте опции bin и random только для тех скриптов, которые будут выполняться на PHP 5.4+.
Пример XML-конфигурации этапа:
<step id="change_integer_base">
    <base>oct</base>
</step>
Переименование переменных
Переименовывает глобальные, локальные переменные и переменные-члены классов, используя выбранный алгоритм. Те переменные, имена которых были зафиксированы, переименовываться не будут.
ID этапа: rename_vars
Сам этап не имеет никаких настроек. XML-тег настройки этапа включает в себя XML-тег настройки обработки существующих и генерируемых строк (name_processor).
Пример XML-конфигурации этапа:
<step id="rename_vars">
    <name_processor id="non_printable">
        <min_length>5</min_length>
        <max_length>10</max_length>
    </name_processor>
</step>
Переименование констант классов
Переименовывает константы классов, используя выбранный алгоритм. Те константы классов, имена которых были зафиксированы, переименовываться не будут.
ID этапа: rename_consts
Сам этап не имеет никаких настроек. XML-тег настройки этапа включает в себя XML-тег настройки обработки существующих и генерируемых строк (name_processor).
Пример XML-конфигурации этапа:
<step id="rename_consts">
    <name_processor id="non_printable">
        <min_length>5</min_length>
        <max_length>10</max_length>
    </name_processor>
</step>
Переименование функций/трейтов/классов/интерфейсов
Переименовывает функции, классы, трейты и интерфейсы, используя выбранный алгоритм. Вы сможете выбрать, что именно переименовывать и как. Те функции, трейты, классы и интерфейсы, имена которых были зафиксированы, переименовываться не будут.
ID этапа: rename_functions_traits_classes_interfaces
Настройки этапа:
Переименовывать ли классы и интерфейсы
Соответствующий тег: rename_classes_interfaces
Если тег присутствует, то классы и интерфейсы будут переименованы.
Переименовывать ли трейты
Соответствующий тег: rename_traits
Если тег присутствует, то трейты будут переименованы.
Переименовывать ли функции
Соответствующий тег: rename_functions
Если тег присутствует, то функции будут переименованы.
XML-тег настройки этапа может опционально включать в себя XML-тег настройки обработки существующих и генерируемых строк (name_processor). Если этот тег вложен непосредственно в тег настройки этапа (<step>), то указанные настройки переименования будут применяться ко всем PHP-сущностям, с которыми работает этап, например:
<step id="rename_functions_traits_classes_interfaces">
    <name_processor id="non_printable">
        <min_length>5</min_length>
        <max_length>10</max_length>
    </name_processor>
    <rename_classes_interfaces/>
    <rename_traits/>
    <rename_functions/>
</step>
В этом случае с использованием одного и того же алгоритма non_printable (имена из непечатаемых ASCII-символов) будут переименованы классы и интерфейсы, трейты, функции.
В свою очередь, каждый из тегов rename_classes_interfaces, rename_traits и rename_functions может также содержать вложенный XML-тег настройки обработки существующих и генерируемых строк (name_processor). В этом случае для конкретных сущностей PHP будет применяться собственный генератор имен. Пример:
<step id="rename_functions_traits_classes_interfaces">
    <name_processor id="non_printable">
        <min_length>5</min_length>
        <max_length>10</max_length>
    </name_processor>
    <rename_classes_interfaces>
        <name_processor id="random_letters">
            <prefix>_</prefix>
            <min_length>5</min_length>
            <max_length>10</max_length>
        </name_processor>
    </rename_classes_interfaces>
    <rename_traits/>
    <rename_functions/>
</step>
В этом случае с использованием одного и того же алгоритма non_printable будут переименованы только трейты и функции, а для переименования классов и интерфейсов будет применен другой алгоритм - random_letters (имена из случайных латинских букв).
Если для каждого из тегов rename_classes_interfaces, rename_traits и rename_functions указан алгоритм переименования, то общий алгоритм можно опустить. Пример:
<step id="rename_functions_traits_classes_interfaces">
    <rename_classes_interfaces>
        <name_processor id="random_letters">
            <prefix>_</prefix>
            <min_length>5</min_length>
            <max_length>10</max_length>
        </name_processor>
    </rename_classes_interfaces>
    <rename_traits>
        <name_processor id="md5">
            <prefix>q</prefix>
        </name_processor>
    </rename_traits>
    <rename_functions>
        <name_processor id="similar">
            <prefix>z</prefix>
        </name_processor>
    </rename_functions>
</step>
Если для какого-либо из тегов rename_classes_interfaces, rename_traits и rename_functions задан собственный алгоритм переименования, рекомендуется для него задавать уникальный префикс имен. Это позволит избежать генерации повторных имен для PHP-сущностей из разных групп.
Переименование пространств имен
Переименовывает части имени каждого пространства имен, используя выбранный алгоритм. Например, если обфускатор встречает имя класса \Test\Ns\MyClass, то имена "Test" и "Ns" будут переименованы. Те части имен пространств имен, которые были зафиксированы, переименовываться не будут.
ID этапа: rename_namespaces
Сам этап не имеет никаких настроек. XML-тег настройки этапа включает в себя XML-тег настройки обработки существующих и генерируемых строк (name_processor).
Пример XML-конфигурации этапа:
<step id="rename_namespaces">
    <name_processor id="non_printable">
        <min_length>5</min_length>
        <max_length>10</max_length>
    </name_processor>
</step>
Изменение синтаксиса конструкций управления потоком выполнения
Изменяет синтаксис всех или выбранных конструкций управления потоком выполнения на классический или альтернативный. К таким конструкциям относятся if-else, while, for, foreach, switch-case, declare.
ID этапа: change_syntax
Настройки этапа:
Изменить ли синтакс конструкции if-else
Соответствующий тег: ifelse [alternate / classic / пустое значение].
Эта опция необязательна. Указывает, будет ли изменен синтаксис конструкции if-else.
Изменить ли синтакс конструкции while
Соответствующий тег: while [alternate / classic / пустое значение].
Эта опция необязательна. Указывает, будет ли изменен синтаксис конструкции while.
Изменить ли синтакс конструкции for
Соответствующий тег: for [alternate / classic / пустое значение].
Эта опция необязательна. Указывает, будет ли изменен синтаксис конструкции for.
Изменить ли синтакс конструкции foreach
Соответствующий тег: foreach [alternate / classic / пустое значение].
Эта опция необязательна. Указывает, будет ли изменен синтаксис конструкции foreach.
Изменить ли синтакс конструкции switch-case
Соответствующий тег: switch [alternate / classic / пустое значение].
Эта опция необязательна. Указывает, будет ли изменен синтаксис конструкции switch-case.
Изменить ли синтакс конструкции declare
Соответствующий тег: declare [alternate / classic / пустое значение].
Эта опция необязательна. Указывает, будет ли изменен синтаксис конструкции declare.
Для всех вышеперечисленных опций допустимы следующие значения:
Пример XML-конфигурации этапа:
<step id="change_syntax">
    <ifelse>alternate</ifelse>
    <while>alternate</while>
    <for>alternate</for>
    <foreach>alternate</foreach>
    <switch>classic</switch>
</step>
Замена встроенных констант их значениями
Замененяет большинство глобальных встроенных констант на их реальные значения. Те глобальные константы, имена которых были зафиксированы, разворачиваться в значения не будут. Кроме того, некоторые константы, значение которых всегда зависит от версии PHP или от настроек среды, в которой запускается скрипт, также не будут заменены на их значения. К таким константам относятся, например, PHP_EOL и PHP_VERSION.
Если константа находится внутри именованного пространства имен, то она может быть как локальной, так и глобальной в случае, если ее пространство имен не указано явно или не прописано через псевдоним use const. В этом случае константа обрабатываться не будет.
ID этапа: resolve_constants
Этап не имеет настроек.
Пример XML-конфигурации этапа:
<step id="resolve_constants" />
Оборачивание констант в вызов constant()
Заменяет все глобальные константы на вызов функции constant() с соответствующим аргументом - названием константы в виде строки. Это может несколько снизить производительность результирующего скрипта. Этот этап может применяться в сочетании с этапом шифрования строк, так как в этом случае аргументы функций constant() будут дополнительно зашифрованы.
Если константа находится внутри именованного пространства имен, то она может быть как локальной, так и глобальной в случае, если ее пространство имен не указано явно или не прописано через псевдоним use const. В этом случае константа обрабатываться не будет.
ID этапа: wrap_constants
Этап поддерживает фильтры.
Этап не имеет настроек.
Пример XML-конфигурации этапа:
<step id="wrap_constants" />
Упрощение PHP-синтаксиса
Удаляет некоторые малозначащие особенности синтаксиса (такие, как type hints), может заменять имена некоторых PHP-функций на их более короткие псевдонимы.
ID этапа: shorten_syntax
Настройки этапа:
Удалить ли ключевое слово final
Соответствующий тег: remove_final [true / false].
Эта опция необязательна. Указывает, будут ли в скрипте удалены ключевые слова final. Значение по умолчанию - false.
Удалить ли ключевое слово public
Соответствующий тег: remove_public [true / false].
Эта опция необязательна. Указывает, будут ли в скрипте удалены ключевые слова public перед методами и данными классов, интерфейсов и трейтов. Значение по умолчанию - false.
Удалить ли контроль типов (Type Hinting)
Соответствующий тег: remove_type_hints [true / false].
Эта опция необязательна. Указывает, будут ли в скрипте удалены type hint'ы. Значение по умолчанию - false.
Заменить ли некоторые функции на их более короткие псевдонимы
Соответствующий тег: apply_short_aliases [true / false].
Эта опция необязательна. Указывает, будут ли в скрипте заменены некоторые функции на их более короткие псевдонимы. К таким функциям относятся, например, exit и die, или rtrim и chop. Значение по умолчанию - false.
Пример XML-конфигурации этапа:
<step id="shorten_syntax">
    <remove_final>true</remove_final>
    <remove_public>true</remove_public>
    <remove_type_hints>true</remove_type_hints>
    <apply_short_aliases>true</apply_short_aliases>
</step>
Добавление бесполезных комментариев
Добавляет бесполезные комментарии из встроенных или пользовательских словарей. Подробнее о создании собственных словарей и подключении к конфигурации встроенных можно прочесть здесь и здесь.
ID этапа: insert_comments
Настройки этапа:
Режим добавления комментариев
Соответствующий тег: mode [random / successive].
Эта опция обязательна. Указывает, как будут добавляться комментарии из выбранных словарей. Если указано значение random, то комментарии будут выбираться из словарей случайным образом. Если же указано значение successive, то комментарии будут выбираться последовательно циклически.
Вероятность добавления комментариев
Соответствующий тег: probability [Число].
Эта опция обязательна. Указывает, с какой вероятностью будут добавляться комментарии в допустимые места исходного скрипта.
Словарь комментариев
Соответствующий тег: dictionary [Название встроенного или пользовательского словаря].
Эта опция обязательна. Может присутствовать несколько таких опций, если Вы желаете подключить несколько словарей комментариев к этапу. Имеется два встроенных словаря: en - английские комментарии и ru - русские комментарии.
Пример XML-конфигурации этапа:
<step id="insert_comments">
    <mode>successive</mode>
    <probability>5</probability>
    <dictionary>en</dictionary>
    <dictionary>ru</dictionary>
    <dictionary>my_own_dict</dictionary>
</step>
Изменение регистра имен сущностей PHP
Изменяет регистр букв в именах классов, функций, интерфейсов, трейтов и переменных случайным образом. Работает только с английскими буквами в именах сущностей.
ID этапа: change_names_case
Этап не имеет настроек.
Пример XML-конфигурации этапа:
<step id="change_names_case" />
Добавление аргументов к объявлениям функций
Добавляет случайные аргументы в конец объявлений глобальных функций и некоторых методов (а именно, методов финальных классов, не имплементирующих интерфейсы и не имеющих родителя). Добавленные аргументы будут иметь установленные значения по умолчанию, сгенерированные случайным образом. Этот этап может слегка снизить скорость выполнения скрипта.
ID этапа: add_function_args
Этап поддерживает фильтры.
Настройки этапа:
Минимальное количество добавляемых аргументов
Соответствующий тег: min_arg_count [Число].
Эта опция обязательна. Указывает, сколько минимально аргументов должно быть добавлено к объявлениям функций. Минимально допустимое значение 1.
Максимальное количество добавляемых аргументов
Соответствующий тег: max_arg_count [Число].
Эта опция обязательна. Указывает, сколько максимально аргументов должно быть добавлено к объявлениям функций.
Вероятность добавления аргументов
Соответствующий тег: probability [Число].
Эта опция обязательна. Указывает, с какой вероятностью будут добавляться аргументы к объявлениям функций.
Пример XML-конфигурации этапа:
<step id="add_function_args">
    <min_arg_count>1</min_arg_count>
    <max_arg_count>3</max_arg_count>
    <probability>25</probability>
</step>
Шифрование символов строк в escape-последовательности
Шифрует случайные или все символы строк, преобразуя их в шестнадцатеричные или восьмеричные escape-последовательности.
ID этапа: escape_string_characters
Этап поддерживает фильтры.
Настройки этапа:
Режим шифрования
Соответствующий тег: escape_mode [hex / oct / all].
Эта опция необязательна. Значение по умолчанию all. Указывает режим генерации escape-последовательностей. Допустимы значения hex (шестнадцатеричные последовательности), oct (восьмеричные последовательности), all (шестнадцатеричные и восьмеричные последовательности).
Целевые строки
Соответствующий тег: encode_only_double_quoted [true / false].
Эта опция необязательна, значение по умолчанию false. Указывает, должны ли подвергаться шифрованию только строки в двойных и обратных кавычках. Если передано значение false, то шифроваться будут также строки в одинарных кавычках (они будут преобразованы в строки в двойных кавычках, что может очень незначительно замедлить выполнение скрипта).
Вероятность добавления escape-последовательностей
Соответствующий тег: probability [Число].
Эта опция обязательна. Указывает, с какой вероятностью будут добавляться escape-последовательности.
Пример XML-конфигурации этапа:
<step id="escape_string_characters">
    <escape_mode>all</escape_mode>
    <probability>25</probability>
</step>
Сжатие кода
Сжимает скрипт с использованием GZIP.
ID этапа: compress
Настройки этапа:
Уровень сжатия
Соответствующий тег: level [Число].
Эта опция необязательна. Указывает уровень сжатия. Допустимы значения от 1 до 9. Значение по умолчанию 9.
Режим сжатия
Соответствующий тег: compression_mode [gzcompress / gzencode / gzdeflate].
Эта опция необязательна. Указывает режим сжатия. Значение по умолчанию gzcompress. Допустимы значения: gzcompress - сжатие ZLIB, gzencode - сжатие GZIP, gzdeflate - сжатие DEFLATE.
Режим кодирования
Соответствующий тег: encoding_mode [base64 / uuencode / hex / raw].
Эта опция необязательна. Указывает режим кодирования данных после их сжатия. Значение по умолчанию base64. Допустимы значения: base64 - кодирование BASE64, uuencode - кодирование UUENCODE, hex - кодирование HEX, raw - бинарное представление данных без кодирования.
Пример XML-конфигурации этапа:
<step id="compress">
    <level>9</level>
</step>
Добавляет в начало скрипта комментарий, заданный пользователем.
ID этапа: insert_copyright
Настройки этапа:
Комментарий
Соответствующий тег: comment [Текст].
Эта опция обязательна. Указывает добавляемый в начало скрипта комментарий.
Пример XML-конфигурации этапа:
<step id="insert_copyright">
    <comment>This file is protected by copyright!</comment>
</step>
Модуль Encoder (настройки шифрования строк)
Данный модуль используется в этапах шифрования строк и шифрования фиксированных имен и имен встроенных функций.
XML-тег настройки модуля включает в себя XML-тег настройки обработки существующих и генерируемых строк (string_id_processor).
Настройки модуля:
Режим работы модуля
Соответствующий атрибут корневого тега: id [class / globals].
Эта опция необязательна. Указывает режим работы модуля. class - строки будут зашифрованы и упакованы внутрь класса, расшифровывание будет производиться этим же классом; globals - строки будут зашифрованы и добавлены в массив $GLOBALS. Это опция по умолчанию. Значение class не поддерживается при шифровании имен функций.
Способ шифрования строк
Соответствующий тег: encoding_mode [base64 / uu_base64 / gzcompress_base64 / bin2hex / xor].
Эта опция обязательна. Указывает способ, которым будут шифроваться строки.
  • base64 - строки будут зашифрованы с помощью алгоритма base64.
  • uu_base64 - строки будут зашифрованы с помощью алгоритмов uuencode и base64.
  • gzcompress_base64 - строки будут зашифрованы с помощью алгоритмов gzip и base64.
  • bin2hex - строки будут зашифрованы с помощью преобразования bin2hex.
  • xor - строки будут зашифрованы с помощью алгоритма XOR с генерацией случайных ключей шифрования. Не поддерживается при режиме работы модуля globals.
Разбивать ли зашифрованные строки
Соответствующий тег: string_split [true / false].
Эта опция необязательна. Указывает, должны ли случайным образом разбиваться строки после шифрования на части. Значение по умолчанию false.
Модуль Encoder (настройки шифрования чисел)
Данный модуль используется в этапе шифрования чисел.
Настройки модуля:
Режим работы модуля
Соответствующий атрибут корневого тега: id [random_math / class / globals].
Эта опция обязательна. Указывает режим работы модуля.
  • class - числа будут зашифрованы и упакованы в класс, расшифровывание будет производиться этим же классом.
  • globals - числа будут зашифрованы и добавлены в массив $GLOBALS.
  • random_math - числа будут разбиты на последовательность случайных математических операций. Этот режим поддерживает только целые числа (int).
Режим разбиения на математические операции (только при id = random_math)
Соответствующий тег: mode [all / sum_diff / random_division].
Эта опция необязательна. Указывает способ, какие математические операции будут применяться при вычислении чисел.
  • sum_diff - случайные сложения и вычитания.
  • random_division - случайное деление и сложение, затем округление с помощью round().
  • all - все варианты случайным образом. Это значение по умолчанию.
Максимальное количество математических операций (только при id = random_math)
Соответствующий тег: max_op_count [Число].
Эта опция необязательна. Указывает максимальное количество чисел-операндов, на которые будет разбито число. Значение по умолчанию 5.
Модуль String processor (настройки обработки существующих и генерируемых строк)
Данный модуль используется в этапах переименования переменных, переименования констант классов, переименования функций/трейтов/классов/интерфейсов, переименования пространств имен, а также в модуле Encoder (настройки шифрования строк). Обратите внимание, что в этапах обфускации этот модуль имеет название тега name_processor, а в модуле encoder для шифрования строк - string_id_processor. Модуль применяется для взаимнооднозначного преобразования одной строки в другую.
Настройки модуля:
Режим работы модуля
Соответствующий атрибут корневого тега: id [non_printable / incremental / incremental_with_letters / md5 / random_letters / similar].
Эта опция обязательна. Указывает режим работы модуля.
  • non_printable - строки будут преобразованы в другие строки, составленные из непечатаемых символов из верхнего диапазона расширенной кодировки ASCII.
  • incremental - строки будут преобразованы в последовательные порядковые номера.
  • incremental_with_letters - строки будут преобразованы в последовательные идентификаторы, состоящие из цифр, символа подчеркивания и непечатаемых символов из верхнего диапазона расширенной кодировки ASCII.
  • md5 - строки будут преобразованы в другие строки, являющиеся MD5-хешами от исходных.
  • random_letters - строки будут преобразованы в другие строки, составленные случайным образом из заданных букв или символов (по умолчанию - английский алфавит).
  • similar - строки будут преобразованы в другие строки, составленные из повторяющегося заданного символа.
Префикс имен
Соответствующий тег: prefix [Строка].
Эта опция необязательна. Указывает префикс для генерируемых строк. Значение по умолчанию "_". Обратите внимание, что префикс иногда необходимо задавать, например, в случае, когда генерируемое имя может начинаться с цифры (так как имена PHP-сущностей не могут начинаться с цифры).
Минимальная длина строки (только при id = non_printable и id = random_letters)
Соответствующий тег: min_length [Число].
Эта опция обязательна. Указывает минимальную длину генерируемых строк. Минимально допустимое значение 1.
Максимальная длина строки (только при id = non_printable и id = random_letters)
Соответствующий тег: max_length [Число].
Эта опция обязательна. Указывает максимальную длину генерируемых строк.
Преобразовывать ли строки в корректную кодировку UTF-8 (только при id = non_printable)
Соответствующий тег: to_utf8 [true / false].
Эта опция необязательна. Указывает, производить ли преобразование непечатаемых символов в корректную кодировку UTF-8. По умолчанию эта опция отключена.
Импользуемые для генерации строк буквы (только при id = random_letters)
Соответствующий тег: letters [Строка].
Эта опция необязательна. Задает список символов, которые могут быть использованы для генерации строк. Значение по умолчанию - английский алфавит.
Символ, который будет использоваться для создания строки (только при id = similar)
Соответствующий тег: symbol [Символ].
Эта опция необязательна. Указывает, какой символ должен использоваться для генерации однообразных строк. Значение по умолчанию "_".
Создание профилей обфускатора
При обфускации Вы, помимо выбора стандартного встроенного профиля обфускатора, можете создать свой собственный. Есть два способа сделать это. Сначала в списке выбора профиля отметьте вариант "Пользовательский" ("Custom"), после чего воспользуйтесь появившимися кнопками под списком. Кнопка "Мастер профилей" ("Profile wizard") позволяет произвести пошаговое создание профиля с использованием удобного редактора. Если Вы планируете воспользоваться этой опцией, предварительно рекомендуется произвести анализ тех файлов, которые планируется обработать обфускатором. Вторая кнопка "Просмотреть/править текстовую конфигурацию" ("View/edit raw config...") позволяет задать или просмотреть конфигурацию профиля обфускатора в виде XML.
Задание используемых встроенных классов и интерфейсов
На соответствующем шаге мастера генерации профиля обфускатора Вам будет предоставлена возможность задать имена всех встроенных в PHP или его расширения классов и интерфейсов, которые используются в Вашем скрипте. Если вы произвели предварительный анализ файлов, которые будут обрабатываться обфускатором, соответствующие списки уже будут содержать все обнаруженные имена. Однако, анализатор может пропустить то или иное имя по какой-то причине (например, если в проанализированных скриптах используется метапрограммирование). В этом случае следует его добавить на этом шаге. Если PHP-обфускатору не известно то имя, которое Вы добавляете, будет выдано соответствующее сообщение. Такое возможно, потому что в коде обфускатора содержится база имен классов и интерфейсов, которая может со временем устареть. В этом случае необходимо будет указать как пользовательское и зафиксировать имя такого класса или интерфейса, а также всех его методов, констант и переменных.
Далее приведен пример XML-конфигурации, которая сообщит обфускатору, что в Вашем коде используются классы ZipArchive и Exception. Обратите внимание, что обязательного перечисления в XML-конфигурации требуют только те классы, которые не обнаруживаются анализатором. В общем случае, если Вы не используете метапрограммирование, эта опция Вам скорее всего не понадобится.
<used_built_in_classes>
    <name>ZipArchive</name>
    <name>Exception</name>
</used_built_in_classes>
Тег used_built_in_classes должен содержаться в корневом XML-теге настроек профиля обфускатора (подробнее здесь).
Задание используемых пользовательских классов и интерфейсов
На этом шаге мастера генерации профиля обфускатора Вы сможете указать те имена классов и интерфейсов, которые Вы сами объявляете в коде и используете. Как и в случае со встроенными классами и интерфейсами, если Вы анализировали файлы перед созданием профиля обфускатора, соответствующий список уже будет содержать перечисление всех таких классов и интерфейсов. Если Вы не нашли в нем какого-то имени, Вы можете добавить его на этом этапе.
Далее приведен пример XML-конфигурации, которая сообщит обфускатору, что в Вашем коде используется (и, возможно, объявляется) Ваш собственный класс MyClass. Обратите внимание, что обязательного перечисления в XML-конфигурации требуют только те классы, которые не обнаруживаются анализатором.
<used_custom_classes>
    <name>MyClass</name>
</used_custom_classes>
Тег used_custom_classes должен содержаться в корневом XML-теге настроек профиля обфускатора (подробнее здесь).
Фиксирование имен сущностей PHP
На этом шаге мастера генерации профиля обфускатора Вы сможете зафиксировать имена классов и интерфейсов, методов, трейтов, функций, переменных-членов, переменных вне классов, констант, которые не должны заменяться в процессе обфускации. Это может понадобиться в следующих ситуациях: Если Вы не планируете добавлять в профиль этапы переименования соответствующих сущностей, то, очевидно, фиксировать их имена не требуется, - они и так останутся оригинальными.
Предположим, что Ваш код использует неизвестную обфускатору библиотеку SuperLibrary, в которой один класс:
class SuperLib_ClassOne
{
    const SUPER_CONSTANT = 567;
    const OTHER_SUPER_CONSTANT = 890;

    public static $arr = [1, 2, 3];

    public function FuncOne()
    {
    }

    public function FuncTwo($x, $y)
    {
        return $x + $y;
    }
}
Далее приведен пример XML-конфигурации, которая сообщит обфускатору, что в Вашем коде используется эта библиотека.
<fixed_classes>
    <name>SuperLib_ClassOne</name>
</fixed_classes>
<fixed_methods>
    <name>FuncOne</name>
    <name>FuncTwo</name>
</fixed_methods>
<fixed_member_variables>
    <name>arr</name>
</fixed_member_variables>
<fixed_class_constants>
    <name>OTHER_SUPER_CONSTANT</name>
    <name>SUPER_CONSTANT</name>
</fixed_class_constants>
Следует также не забыть указать как пользовательское имя класса SuperLib_ClassOne.
На данном этапе также можно задать глобальные встроенные в PHP или его расширения константы, которые не должны разворачиваться в их значения. Это полезно, если Вы планируете включить в профиль обфускатора соответствующий этап, но не желаете, чтобы какие-то константы заменялись на их значения. Для их перечисления служит тег fixed_built_in_constants.
Все вышеперечисленные теги должны содержаться в XML-теге настроек обфускатора obfuscator (подробнее здесь).
Настройка окружения обфусцируемых PHP-скриптов
Начиная с версии 2.5.2 обфускатор позволяет создавать профили обфускации с учетом окружения PHP-скриптов, которые Вы собираетесь обрабатывать. Например, если Вам требуется обфусцировать PHP-файлы, которые используют библиотеку Smarty, то окружением для них являются PHP-файлы Smarty. Если Вы разрабатываете плагин для phpBB, то PHP-скрипты движка phpBB - это окружение Вашего плагина. При обфускации таких скриптов нет смысла обфусцировать их окружение, но при этом требуется, чтобы все используемые из окружения сущности PHP не были переименованы в процессе обфускации. С помощью мастера создания профилей обфускации возможно создать профиль, который будет фиксировать все встретившиеся в окружении имена сущностей PHP (т.е. функций, классов, трейтов, переменных и т.д.) автоматически. Далее приведен алгоритм, как это сделать:
  1. Сначала необходимо произвести анализ всех PHP-файлов окружения (например, необходимо проанализировать все файлы phpBB или Smarty, загрузив в обфускатор ZIP-архив с ними). Обратите внимание, что файлы окружения могут содержать метапрограммирование (о чем будет сказано в отчёте анализатора), в этом случае имена не всех сущности PHP могут попасть в профиль, но, тем не менее, это сильно облегчит создание требуемого профиля.
  2. Далее в мастере создания профилей на шаге Фиксирование имен сущностей PHP следует нажать на кнопку "Сохранить окружение" ("Prepare environment"). В результате имена всех обнаруженных в проанализированных файлах сущностей PHP будут сохранены в память. Теперь можно закрыть мастер профилей.
  3. Далее следует проанализировать те скрипты, которые необходимо обфусцировать.
  4. Теперь в мастере создания профилей на шаге Фиксирование имен сущностей PHP следует нажать на кнопку "Восстановить окружение" ("Restore environment"). В результате все сохранённые ранее имена сущностей PHP будут добавлены в списки фиксированных имён. После этого можно продолжать работу с мастером создания профилей до завершения создания профиля.
  5. Созданный профиль с фиксированными именами сущностей PHP окружения может использоваться для обфускации Ваших скриптов без обфускации скриптов окружения.
Работа со словарями комментариев
Этот шаг мастера позволяет указать, какие из встроенных словарей комментариев следует использовать. Кроме того, можно создать собственный словарь комментариев. Если использовать в профиле обфускатора этап добавления бесполезных комментариев не планируется, можно пропустить этот шаг. Каждый создаваемый словарь комментариев должен иметь хотя бы один комментарий и уникальный идентификатор. Зарезервированы идентификаторы en и ru. Встроенные словари можно использовать в этапе добавления комментариев только после того, как они были подключены к конфигурации обфускатора.
Далее приведен пример XML-конфигурации, которая сообщит обфускатору, что Вы желаете подключить оба встроенных словаря комментариев (с русскими и английскими комментариями).
<built_in_comments_dictionary id="en" />
<built_in_comments_dictionary id="ru" />
Тег built_in_comments_dictionary должен содержаться в корневом XML-теге настроек профиля обфускатора (подробнее здесь).
Далее приведен пример XML-конфигурации, которая создает пользовательский словарь с идентификатором my_dict и тремя комментариями.
<comments_dictionary id="my_dict">
    <comment>comment 1</comment>
    <comment>aw some useless comment 2</comment>
    <comment>more comments...</comment>
</comments_dictionary>
Тег comments_dictionary должен содержаться в корневом XML-теге настроек профиля обфускатора (подробнее здесь).
Выбор предустановленного профиля обфускации
Этот шаг обфускации является последним перед переходом к непосредственной настройке проходов и этапов обфускатора. На этом шаге Вы можете выбрать предустановку профиля обфускатора, чтобы не создавать и не настраивать проходы и этапы обфускации с нуля. Названия предустановок соответствуют названиям встроенных профилей обфускатора и содержат те же проходы и этапы, которые перечислены здесь. Таким образом, Вы можете выбрать ту предустановку, которая больше всего удовлетворяет Вашим требованиям, и перейти к следующему шагу настройки.
Настройка этапов и проходов обфускации
Это основной шаг мастера создания профилей. Здесь Вам будет предоставлена возможность сконфигурировать все проходы и этапы обфускации. Описания этапов и их настроек даны в этом и последующих разделах. Для каждого этапа необходимо будет выбрать проходы, в которых он будет активен. Если ни один проход выбран не будет, этап не попадет в конечную конфигурацию из-за ненадобности. Описание XML-конфигурации проходов приведено в этом разделе.
Ревью и применение настроек
На этапе ревизии созданных проходов и этапов у Вас будет возможность просмотреть все настройки профиля и отредактировать их, вернувшись к предыдущему шагу, либо перейти к следующему, где отобразится непосредственно готовая XML-конфигурация профиля обфускатора, созданная для Вас мастером. Вы сможете применить ее, нажав соответствующую кнопку. Ее также можно скопировать и сохранить для того, чтобы применять в дальнейшем.
XML-представление профиля обфускатора
Фрагменты XML-конфигураций различных этапов, словарей комментариев, фиксированных имен PHP-сущностей приведены в соответствующих разделах. В этом разделе будет приведен пример полной XML-конфигурации профиля обфускатора, а также рассмотрены те элементы разметки, которые не были освещены ранее.
Встроенный профиль hardcore в виде XML с комментариями:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Корневой тег конфигурации - settings -->
<settings>
    <!-- Подключаем встроенный словарь английских комментариев -->
    <built_in_comments_dictionary id="en" />
    <!-- Настройки обфускатора -->
    <obfuscator>
        <!-- Добавление бесполезного кода -->
        <step id="insert_useless_code" active="false">
            <probability>12</probability>
        </step>

        <!-- Переименование коллбэков -->
        <step id="rename_callback_functions_classes" active="false" />

        <!-- Добавление аргументов к объявлениям функций -->
        <step id="add_function_args" active="false">
            <min_arg_count>2</min_arg_count>
            <max_arg_count>5</max_arg_count>
            <probability>70</probability>
        </step>

        <!-- Замена встроенных констант их значениями -->
        <step id="resolve_constants" active="false" />

        <!-- Оборачивание констант в вызов constant() -->
        <step id="wrap_constants" active="false" />

        <!-- Шифрование строк -->
        <step id="encode_strings">
            <encoder id="class">
                <string_id_processor id="non_printable">
                    <min_length>5</min_length>
                    <max_length>10</max_length>
                </string_id_processor>
                <encoding_mode>xor</encoding_mode>
                <string_split>true</string_split>
            </encoder>
        </step>

        <!-- Изменение регистра имен сущностей PHP -->
        <step id="change_names_case" active="false" number="0" />

        <!-- Шифрование фиксированных имен и имен встроенных функций -->
        <step id="encode_funcs">
            <encoder>
                <string_id_processor id="non_printable">
                    <min_length>5</min_length>
                    <max_length>10</max_length>
                </string_id_processor>
                <encoding_mode>base64</encoding_mode>
                <string_split>true</string_split>
            </encoder>
        </step>

        <!-- Шифрование чисел -->
        <step id="encode_numbers">
            <target>int</target>
            <encoder id="random_math">
                <mode>all</mode>
                <max_op_count>5</max_op_count>
            </encoder>
        </step>

        <!-- Шифрование чисел -->
        <step id="encode_numbers">
            <target>int</target>
            <encoder id="globals" />
        </step>

        <!-- Шифрование чисел -->
        <step id="encode_numbers">
            <target>float</target>
            <encoder id="class" />
        </step>

        <!-- Изменение системы счисления целых чисел -->
        <step id="change_integer_base" active="false">
            <base>oct</base>
        </step>

        <!-- Переименование переменных -->
        <step id="rename_vars">
            <name_processor id="non_printable">
                <min_length>5</min_length>
                <max_length>10</max_length>
            </name_processor>
        </step>

        <!-- Переименование констант классов -->
        <step id="rename_consts">
            <name_processor id="non_printable">
                <min_length>5</min_length>
                <max_length>10</max_length>
            </name_processor>
        </step>

        <!-- Переименование пространств имен -->
        <step id="rename_namespaces" active="false">
            <name_processor id="non_printable">
                <min_length>5</min_length>
                <max_length>10</max_length>
            </name_processor>
        </step>

        <!-- Переименование функций/трейтов/классов/интерфейсов -->
        <step id="rename_functions_traits_classes_interfaces">
            <name_processor id="non_printable">
                <min_length>5</min_length>
                <max_length>10</max_length>
            </name_processor>

            <rename_classes_interfaces />
            <rename_traits />
            <rename_functions />
        </step>

        <!-- Изменение синтаксиса конструкций управления потоком выполнения -->
        <step id="change_syntax" active="false">
            <ifelse>alternate</ifelse>
            <while>alternate</while>
            <for>alternate</for>
            <foreach>alternate</foreach>
            <switch>alternate</switch>
            <declare>alternate</declare>
        </step>

        <!-- Упрощение PHP-синтаксиса -->
        <step id="shorten_syntax" active="false">
            <remove_final>true</remove_final>
            <remove_public>true</remove_public>
            <remove_type_hints>true</remove_type_hints>
        </step>

        <!-- Изменение регистра имен сущностей PHP -->
        <step id="change_names_case" active="false" number="1" />

        <!-- Шифрование символов строк в escape-последовательности -->
        <step id="escape_string_characters" active="false">
            <probability>50</probability>
            <escape_mode>all</escape_mode>
        </step>

        <!-- Добавление бесполезных комментариев -->
        <step id="insert_comments" active="false">
            <mode>successive</mode>
            <probability>33</probability>
            <dictionary>en</dictionary>
        </step>

        <!-- Сжатие кода -->
        <step id="compress" active="false" />

        <!-- Конфигурация проходов. Их два. -->
        <pass>
            <!-- Здесь перечислены те шаги, которые активны в первом проходе -->
            <step number="0">change_names_case</step>
            <step>rename_namespaces</step>
            <step>insert_useless_code</step>
            <step>add_function_args</step>
            <step>resolve_constants</step>
            <step>wrap_constants</step>
            <step>rename_callback_functions_classes</step>
            <step>shorten_syntax</step>
        </pass>
        <pass>
            <!-- Здесь перечислены те шаги, которые активны во втором проходе -->
            <step number="1">change_names_case</step>
            <step>change_integer_base</step>
            <step>change_syntax</step>
            <step>escape_string_characters</step>
            <step>insert_comments</step>
            <step>compress</step>
        </pass>
    </obfuscator>
</settings>
Итак, в этом примере приведен пример конфигурации, состоящей из двух проходов и нескольких этапов. У некоторых этапов проставлен атрибут active="false". Это означает, что этап будет по умолчанию неактивен ни в одном из проходов. С другой стороны, если такой атрибут отсутствует или имеет значение true, то этап будет активен во всех проходах. Для того, чтобы включить тот или иной неактивный этап в каком-либо проходе, следует в соответствующий тег <pass> добавить идентификатор этапа (как в примере выше).
В примере выше имеется два этапа с одинаковым идентификатором change_names_case. Для того, чтобы отличать один от другого, задается атрибут number, которому присваивается произвольный номер. Это будет индексом этапа, по которому потом можно ссылаться на этот этап в теге <pass>. Индекс всех этапов по умолчанию всегда 0. Если Вы создавали XML-конфигурацию с помощью мастера, Вам не нужно будет задумываться о проставлении атрибутов active и number, а также добавлении этапов в теги <pass>, - мастер сделает это автоматически. Если Вы создаете профиль, состоящий из одного прохода, достаточно просто в конфигурацию обфускатора добавить пустой тег <pass />, а у этапов, включенных в конфигурацию, опустить атрибут active="false". В этом случае все этапы будут выполняться последовательно, и ни один из них не будет пропущен (это и требуется в такой конфигурации).
Таким образом, этапы при применении приведенной выше конфигурации будут выполняться в следующем порядке:
Сохранение, использование, редактирование, удаление файлов XML-профилей обфускатора
Начиная с версии 2.5.1 Web-интерфейс обфускатора позволяет сохранять, редактировать, удалять и использовать профили обфускатора в виде файлов. Для того, чтобы эта возможность стала доступной, необходимо создать доступный для чтения каталог obf_profiles в том же каталоге файловой системы, где находится сам php-файл обфускатора. Далее, в созданный каталог можно поместить один или несколько файлов с расширением xml. Имена файлов профилей могут содержать заглавные и строчные буквы английского алфавита, цифры, символ подчеркивания, дефис и точку. Эти файлы будут распознаны обфускатором как пользовательские профили обфускации и отобразятся в списке профилей, когда Вы откроете Web-интерфейс обфускатора в браузере. При выборе того или иного файла профиля в списке профилей его можно будет использовать для обфускации. Кроме того, этот профиль можно будет просмотреть в виде XML, а также сохранить, сохранить под другим именем и удалить, нажав кнопку "Просмотреть/править текстовую конфигурацию". При создании конфигурации обфускатора с помощью мастера создания профилей, после применения профиля, Вы также сможете сохранить этот профиль в файл, выбрав в списке профилей опцию "Пользовательский" и нажав на кнопку под списком "Просмотреть/править текстовую конфигурацию".
Если Вам не требуется возможность сохранения, редактирования, удаления и использования XML-профилей в виде файлов, просто не создавайте каталог obf_profiles.
Если Вам не требуется возможность сохранения, редактирования и удаления XML-профилей в виде файлов, но при этом Вы хотите, чтобы профили можно было загружать из каталога obf_profiles только для чтения, создайте в этом каталоге файл с названием readonly.
Профили генератора бесполезного кода (XML)
Обфускатор как в Web-интерфейсе, так и через консоль позволяет указать расширенный XML-профиль генератора случайного бесполезного кода. По умолчанию используется встроенный профиль. Этот профиль может быть использован на соответствующем этапе обфускации. Скорее всего, Вам не потребуется создавать собственный профиль для этого этапа, но в этом разделе, тем не менее, описан его XML-формат на небольшом примере (являющемся, по сути, частью встроенного профиля генератора кода), а также приведено некоторое его описание.
<?xml version="1.0" encoding="UTF-8"?>
<useless_instructions>
    <actions min="1" max="5" max_nested_actions="2" max_nested_level="1">
        <action>libxml_use_internal_errors(true);</action>
        <action>fputs($f, PHP_EOL);</action>
        <action>$str = fgets($f);</action>
        <action>$str = explode(';', $str);</action>
        <action>session_destroy();</action>
        <action>session_cache_limiter('private');</action>
    </actions>

    <script_based_actions usage_probability="75">
        <action>[VAR] = [VAR];</action>
        <action>[VAR] = [VAR] + [VAR];</action>
        <action>[VAR] = new [CLASS]([VAR],[FUNCTION]());</action>
        <action>[CLASS]::[METHOD]();</action>
        <action>[CLASS]::[METHOD]([VAR]);</action>
        <action>[VAR]-&gt;[METHOD]([VAR],[VAR]-&gt;[METHOD]());</action>
        <action>[FUNCTION]([VAR]);</action>
        <action>[VAR] = [CLASS]::[METHOD]([VAR],[VAR]);</action>
        <action>[VAR]-&gt;[MEMBER] = [CLASS]::[METHOD]();</action>
        <action>[VAR]-&gt;[MEMBER] = [VAR]-&gt;[METHOD]();</action>
        <action>fclose([VAR]);</action>
        <action>[VAR] = fopen([VAR], 'r');</action>
        <action>[VAR] = mysql_query([VAR]);</action>
        <action>register_shutdown_function('[FUNCTION]');</action>
    </script_based_actions>

    <functions min_combinations="1" max_combinations="3">
        <function id="1">
            <name>abs</name>
            <arguments>
                <rand_int from="-5000" to="-1" />
            </arguments>
            <condition value="gt;ge;eq;eeq">
                <rand_int from="5001" to="10000" />
            </condition>
        </function>

        <function>
            <name>abs</name>
            <arguments>
                <rand_int from="-10000" to="-7000" />
            </arguments>
            <condition value="lt;le;eq;eeq">
                <function id="1"/>
            </condition>
        </function>

        <function>
            <name>addslashes</name>
            <arguments>
                <rand_string />
            </arguments>
            <condition value="ne;nee">
                <arg number="1"/>
            </condition>
        </function>

        <function>
            <name>mt_rand</name>
            <arguments>
                <rand_int from="1" to="10" />
                <rand_int from="11" to="20" />
            </arguments>
            <condition value="gt;ge;eq;eeq">
                <rand_int from="30" to="100" />
            </condition>
        </function>

        <function>
            <name>pi</name>
            <condition value="ge;gt;eq;eeq">
                <rand_float from="4" to="100" />
            </condition>
        </function>

        <function>
            <expression>!is_finite([ARG])</expression>
            <arguments>
                <rand_int from="1" to="1000" />
            </arguments>
        </function>

        <function>
            <expression>count(array_keys(Array([ARG]))) &gt; [ARG]</expression>
            <arguments>
                <rand_int from="-500" to="500" />
                <rand_int from="2" to="500" />
            </arguments>
        </function>
</useless_instructions>
Корневой тег конфигурации генератора случайного кода имеет имя useless_instructions. В него должен быть вложен тег actions, содержащий список действий, которые НЕ будут выполнены. Здесь может быть что угодно, являющееся допустимым PHP-кодом. Каждое действие (строка или блок кода) должно содержаться во вложенном теге action. Эти действия будут использованы генератором при создании блоков бесполезного кода. Каждый такой блок содержит условие, которое не будет выполнено, и непосредственно случайный набор действий. Обязательные атрибуты тега actions:
В корневой тег конфигурации должен быть также вложен тег script_based_actions. Он содержит набор динамически генерируемых действий, которые будут создаваться с использованием тех пользовательских имен переменных, функций, классов, методов и переменных-членов, которые встречаются в обрабатываемом скрипте. В тексте каждого действия будет производиться автозамена:
Если в процессе генерации для какого-либо скрипта какие-то из динамических действий не могут быть заполнены (например, в скрипте не объявлено и не использовано ни одного пользовательского класса, т.е. подстрока [CLASS] не может быть заменена на какое-то имя), то эти действия не будут использоваться генератором. Обязательный атрибут тега script_based_actions - usage_probability, он определяет, с какой вероятностью (в процентах) генератор отдаст предпочтение действиям из блока script_based_actions вместо тех, которые объявлены в блоке actions.
Еще один обязательный тег, который должен быть вложен в корневой тег профиля, это functions. В нем должны быть представлены функции, обязательно возвращающие значение false. Из случайной комбинации вызовов этих функций будут составляться условия, тоже возвращающие false. Обязательные атрибуты тега functions:
В тег functions должны быть вложены описания функций, которые могут быть заданы несколькими способами. Рассмотрим несколько примеров, выбранных из конфигурации выше.
<function id="1">
    <name>abs</name>
    <arguments>
        <rand_int from="-5000" to="-1" />
    </arguments>
    <condition value="gt;ge;eq;eeq">
        <rand_int from="5001" to="10000" />
    </condition>
</function>
В первом примере задается функция abs. Ее аргумент - случайное целое число в диапазоне от -5000 до -1. Этот аргумент задается тегом rand_int, вложенным в тег arguments. Соответствующие атрибуты, задающие диапазон значений - from и to. Генератор кода создаст вызов этой функции и подставит в нее соответствующий аргумент. Затем возвращенное функцией значение будет сравниваться со значением, заданным в теге condition. В данном примере это случайное целое число в диапазоне от 5001 до 10000. Сравнение будет производиться операциями "больше", "больше или равно", "равно", "эквивалентно". Операции задаются в атрибуте value тега condition. Допустимые значения:
Вы можете задать сразу несколько операций через точку с запятой. Очевидно, что рассматриваемое сравнение всегда будет возвращать false. Теперь перейдем к следующей функции.
<function>
    <name>abs</name>
    <arguments>
        <rand_int from="-10000" to="-7000" />
    </arguments>
    <condition value="lt;le;eq;eeq">
        <function id="1"/>
    </condition>
</function>
Эта функция почти ничем не отличается от предыдущей, за исключением того, что она ссылается на нее в теге condition. Это сделано с помощью тега function и его атрибута id. Обратите внимание, что предыдущий пример в корневом теге function содержит такой же атрибут с тем же самым значением. Таким образом, в результате обработки генератором этой функции может получиться следующий код:
if(abs(-8291) <= abs(-5))
{
    //...
}
Перейдем к следующему примеру:
<function>
    <name>addslashes</name>
    <arguments>
        <rand_string />
    </arguments>
    <condition value="ne;nee">
        <arg number="1"/>
    </condition>
</function>
Этот фрагмент XML объявляет функцию addslashes с аргументом в виде случайной строки. Аргумент задается тегом rand_string. Если этот тег не имеет никаких атрибутов, он будет генерировать произвольную строку длиной от 5 до 10 случайных английских букв и цифр. Допустимые атрибуты тега rand_string: Те rand_string может также включать в себя один или более тегов string, задающих конкретные значения допустимых строк. Если задан хотя бы один такой тег, строка будет выбрана из них случайным образом:
<rand_string>
    <string>str 1</string>
    <string>str 2</string>
    <string>str 3</string>
</rand_string>
В этом случае строка при генерации будет выбрана случайным образом из доступных "str 1", "str 2" и "str 3".
В рассматриваемом примере функции значение, с которым будет сравниваться результат выполнения функции, будет таким же, как первый аргумент. Это достигается заданием тега arg с атрибутом number в секции condition. Перейдем к следующему примеру.
<function>
    <name>pi</name>
    <condition value="ge;gt;eq;eeq">
        <rand_float from="4" to="100" />
    </condition>
</function>
Здесь объявляется функция pi без аргументов. Сравниваться возвращенное ей значение будет со случайным числом с плавающей точкой в диапазоне от 4.0 до 100.0. Это задается тегом rand_float с соответствующими атрибутами from и to, указывающими диапазон числа.
Второй способ объявления функций для генератора бесполезного кода - задание целых выражений, в которые будут подставляться какие-либо аргументы:
<function>
    <expression>count(array_keys(Array([ARG]))) &gt; [ARG]</expression>
    <arguments>
        <rand_int from="-500" to="500" />
        <rand_int from="2" to="500" />
    </arguments>
</function>
Выражение задается тегом expression. В значении этого тега производится автозамена подстроки [ARG] на соответствующий аргумент из списка arguments. Первая подстрока заменяется на первый по счету аргумент, вторая - на второй и так далее.
Итак, в этом примере были рассмотрены все возможности генератора бесполезного кода и способы их настройки в XML-конфигурации.
Фильтры этапов обфускации
Начиная с версии 2.2 обфускатор поддерживает простые фильтры обфускации. Они позволяют не применять (или, наоборот, применять) тот или иной этап к конкретным частям целевого PHP-кода. Например, Вы желаете добавить в файл бесполезный код и зашифровать в нем строки, однако, в Вашем коде есть фрагменты, критичные по производительности, и Вы бы не хотели, чтобы скорость их выполнения замедлилась. Именно в этом случае необходимо настроить соответствующие фильтры этапов.
Этапы, поддерживающие фильтры: добавление бесполезного кода, шифрование строк, шифрование фиксированных имен и имен встроенных функций, шифрование чисел, оборачивание констант в вызов constant(), добавление аргументов к объявлениям функций, шифрование символов строк в escape-последовательности.
Для того, чтобы отметить тот или иной участок кода в целевом PHP-скрипте, используются комментарии специального формата. Вернемся к примеру из начала описания фильтров. Допустим, что требуется обфусцировать следующий код:
<?php
function my_func()
{
    $ret = 0;
    
    for($i = 0; $i !== 1000000; ++$i)
    {
        $ret += 2;
        ++$ret;
    }
    
    return $ret;
}

$start = microtime(true);

$result = my_func() + my_func();

$total = microtime(true) - $start;

echo 'Total time: ' . ($total) . ' sec';
При выполнении такого скрипта можно получить, например, такой вывод: Total time: 0.16301703453064 sec. Однако, после обфускации такого кода с помощью встроенного профиля hard (тяжелый) можно при выполнении получившегося скрипта наблюдать следующий вывод: Total time: 3.9926209449768 sec. Это говорит о том, что скрипт стал выполняться приблизительно в 25 раз медленее. Такой результат является неудовлетворительным, но вполне ожидаемым. В приведенном коде есть цикл for на 1000000 итераций. Обфускатор на профиле hard будет шифровать в цикле числа и добавит в него бесполезный код (который не будет ничего делать, однако, будет занимать время при исполнении скрипта). В результате цикл будет выполняться значительно медленнее. Для того, чтобы заставить обфускатор не применять эти этапы (шифрование чисел и добавление бесполезного кода) к указанному циклу, необходимо в коде с помощью комментариев специального формата пометить его:
...
function my_func()
{
    $ret = 0;
    
    //dxobf+ some text
    for($i = 0; $i !== 1000000; ++$i)
    {
        $ret += 2;
        ++$ret;
    }
    //dxobf- some text
    
...
Системный комментарий dxobf+ обозначает начало блока кода, а dxobf- - конец блока. Таким образом, цикл с большим количеством итераций помечен блоком с комментарием some text. Текст комментария может быть любым и должен идти после dxobf+ или dxobf-. Если конец блока не указан, то им считается конец скрипта. Блоки могут быть любым образом вложены друг в друга. Поддерживаются также многострочные комментарии (кроме стиля PhpDoc).
Далее следует создать собственный файл конфигурации обфускатора на базе профиля hard. Для всех шагов добавления бесполезного кода и шифрования чисел следует задать фильтр:
<?xml version="1.0" encoding="UTF-8"?>
<settings>
<built_in_comments_dictionary id="en" />
<obfuscator>
    <step id="insert_useless_code">
        <probability>7</probability>

        <filter>
            <mode>reject</mode>
            <comment>some text</comment>
        </filter>
    </step>
...
    <step id="encode_numbers">
        <target>int</target>
        <encoder id="random_math">
            <mode>all</mode>
            <max_op_count>5</max_op_count>
        </encoder>

        <filter>
            <mode>reject</mode>
            <comment>some text</comment>
        </filter>
    </step>

    <step id="encode_numbers">
        <target>int</target>
        <encoder id="globals" />

        <filter>
            <mode>reject</mode>
            <comment>some text</comment>
        </filter>
    </step>

    <step id="encode_numbers">
        <target>float</target>
        <encoder id="class" />

        <filter>
            <mode>reject</mode>
            <comment>some text</comment>
        </filter>
    </step>
...
Применив дополненную конфигурацию к скрипту и выполнив результат, можно получить примерно такой вывод: Total time: 0.16499996185303 sec. Результат практически не отличается от оригинального, а значит, цель достигнута: скрипт обработан обфускатором без потери производительности.
Настройки фильтров:
Режим фильтрации
Соответствующий тег: mode [accept / reject].
Эта опция обязательна. Указывает режим фильтрации для этапа обфускации: accept - этап должен применяться ТОЛЬКО к фрагментам кода, помеченным заданным комментарием; reject - этап НЕ ДОЛЖЕН применяться к фрагментам кода, помеченным заданным комментарием.
Комментарий
Соответствующий тег: comment [любая строка].
Эта опция обязательна. Задает комментарий, задаваемый в коде для фильтра.
Фильтры для этапов обфускации можно задавать и в Web-интерфейсе обфускатора, не прибегая к ручному редактированию XML-конфигурации.
Консольный интерфейс и его опции
Консольный режим обфускатора поддерживает те же функции, что и Web-интерфейс, кроме мастера создания профилей. Консольный интерфейс позволяет обрабатывать целые директории (включая вложенные) с PHP-файлами, но не поддерживает работу c ZIP-архивами, в отличие от Web-интерфейса. Далее перечислены опции, которые можно передавать обфускатору при запуске через консоль. Полный список опций с их описаниями на английском языке также выводится, если запустить обфускатор, не передав ему ни одной опции. В списке ниже перечислены длинные и короткие названия опций, а также их описания.
Планируемые доработки
Очевидно, что такой масштабный проект не может быть идеальным. Он определенно будет содержать какие-то ошибки и недоработки, которые по мере их обнаружения со временем будут исправляться. Кроме того, планируется добавить следующую функциональность:
Что не поддерживается обфускатором на данный момент
На данный момент обфускатор НЕ поддерживает:
Changelog
2.0
2.1
2.2
2.2.1
2.3
2.3.1
2.4
2.4.1
2.5
2.5.1
2.5.2
2.5.3
2.5.4