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

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 — как бы его часть?), но это — если вдаваться в подробности.

Заключение

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

Публикации

Истории

Работа

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

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

DI CONF SMM — большая конференция по соцсетям в России
Дата 2 марта
Время 09:30 – 18:00
Место
Краснодар Онлайн
Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн