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

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

Заключение

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

Подробнее
Реклама

Комментарии 4

    0
    $bin = ($binLen = strlen($bin) > 7)
                     ? $bin
                     : implode('', array_fill(0, 8 - strlen($bin), '0')) . $bin;

    Это ужасно. Есть str_pad.


    $obf .= str_replace(array('1', '0'), array(chr(9), chr(32)), $bin);

    Почему это нельзя сделать один раз после цикла?


    for ($i = 0; $i < $len; $i++) {
            $out .= chr(bindec(str_replace(array(chr(9), chr(32)), array('1', '0'), substr($string, $i, 8))));
            $i += 7;
        }

    Не понимаю, почему нельзя прибавлять 8 в самом цикле.

      +12
      А зачем вообще нужна обфускация, которая очевидным образом расшифровывается обратно в исходный код?
      Суть обфускации вообще-то в том, что код должен работать именно в зашифрованном виде, без деобфускации, и последняя вообще в идеале должна быть невозможна, или, по крайней мере — максимально усложнена.
        +3
        Это не обфускация, а пользовательская кодировка. Можно предварительно составить таблицу кодировки и по ней тупо читать этот whitespace код.
          0
          Покажите пример обфусцированного кода, можно скриншотом, так будет более понятно (шутка, если что :) ).

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое