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

в 12:47, , рубрики: php, whitespace, обфускация

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

Заключение

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

Автор: sneakquie

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js