Как стать автором
Обновить

Whitespace Обфускатор для PHP

Время на прочтение2 мин
Количество просмотров11K
Прочитав статью про обфускацию в JavaScript (а именно 3-ю часть статьи), я заинтересовался подобным обфускатором для PHP.

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

Суть заключается в том, чтобы каждый символ исходного кода представить как переведенный в бинарную систему код этого символа. Потом заменить 1 на пробелы, а 0 на табуляцию (можно конечно и наоборот).

С реализацией этого алгоритма на PHP все просто, как и на JavaScript.

Код обфускатора:

function obfuscate($code)
{
    $len = strlen($code);
    $obf = '';
   
    for ($i = 0; $i < $len; $i++) {
        // Получаем и переводим в бинарный вид код i-того символа
        $bin = decbin(ord($code[$i]));
        // Если значение выше получилось не восьмизначным, тогда нужно дописать спереди недостающие 0
        $bin = ($binLen = strlen($bin) > 7)
                 ? $bin
                 : implode('', array_fill(0, 8 - strlen($bin), '0')) . $bin;
        // Теперь просто заменяем 1 на табы, а 0 на пробелы и конкатенируем с уже существующей строкой, которая будет подаваться на выход
        $obf .= str_replace(array('1', '0'), array(chr(9), chr(32)), $bin);
    }
   
    return $obf;
}

Тут вроде бы все нормально (если не вдаваться в детали), теперь приведу пример вызова обфусцированного кода.

Деобфускатор («исполнятор»)

function include_o($file)
{
    $file = trim($file);
    // Проверяем файл на существование
    if ( empty($file)
     ||  !is_readable($file)
    ) {
        throw new Exception("Filename is empty or file isn't readable");
    }
   
    $string = file_get_contents($file);
    $len    = strlen($string);
    $out    = '';
   
    for ($i = 0; $i < $len; $i++) {
        /*
         * Каждые 8 символов заменяем на нули и единицы,
         * Переводим из двоичной системы исчисления в десятеричную и ставим на это место соответствующий символ
         */
        $out .= chr(bindec(str_replace(array(chr(9), chr(32)), array('1', '0'), substr($string, $i, 8))));
        $i += 7;
    }
   
    if (!empty($out)) {
        eval($out);
    }
}

Вроде бы, возвращаемое функцией значение будет «mixed» (если я правильно понимаю, то void — как бы его часть?), но это — если вдаваться в подробности.

Заключение

Мне кажется, что получилось довольно сносно, но претендовать на работающий (подразумевается использующийся на практике) обфускатор этот тип все же не может (знаю, сказана банальная вещь). Это скорее сделано для веселья, по крайней мере, мне было интересно увидеть результат.
Спасибо за внимание, удачи.
Теги:
Хабы:
Всего голосов 23: ↑17 и ↓6+11
Комментарии4

Публикации

Истории

Работа

PHP программист
204 вакансии

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
10 – 11 октября
HR IT & Team Lead конференция «Битва за IT-таланты»
МоскваОнлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн