За последние 24 часа нас посетили 22029 программистов и 988 роботов. Сейчас ищут 723 программиста ...

PHP UnReader - Обфускатор PHP-кода

Тема в разделе "PHP продажа/покупка", создана пользователем V.Terentev, 18 янв 2008.

  1. V.Terentev

    V.Terentev Активный пользователь

    С нами с:
    18 янв 2008
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Волгоград
    [http://altseotools.com/index.php?page=php_unreader]

    PHP UnReader позволяет использовать 6 независимых методов обфускаци:
    1. Удаление комментариев, переводов строк и лишних пробелов.
    2. Замена всех кириллических символов HTML-сущностями в кодировке windows-1251. Этот метод не следует использовать, если PHP код генерирует код JavaScript, который оперирует кириллическими символами.
    3. Замена содержимого всех кавычек последовательностями кодов символов (...chr(224).chr(225)...). Этот метод рекомендуется использовать всегда - один он заметно снижает мнемонические характеристики кода.
    4. Кодирование имён переменных.
    5. Кодирование названий функций.
    6. Кодирование названий классов.

    PHP UnReader позволяет провести обфускацию, используя один или несколько алгоритмов одновременно.

    Можно отключить кодирование имён конкретных переменных, функций, классов. Также можно отключить кодирование отдельных файлов проекта.

    Система реализован в виде PHP-скрипта. Его легко установить на локальном или удалённом сервере.

    Вот пример обработанного кода:

    if(strlen($lll111111l1) <= $lll11l11ll1) { if($lll111111l1 != "") $lll1ll1l1l1 = $lll111111l1; else $llllllll1l1 = chr(202).chr(238).chr(228).chr(32).chr(238).chr(242).chr(241).chr(243).chr(242).chr(241).chr(242).chr(226).chr(243).chr(229).chr(242); } else $llllllll1l1 = chr(202).chr(238).chr(228).chr(32).chr(239).chr(240).chr(229).chr(226).chr(251).chr(248).chr(224).chr(229).chr(242).chr(32).$lll11l11ll1.chr(32).chr(241).chr(232).chr(236).chr(226).chr(238).chr(235).chr(238).chr(226); } if($llllllll1l1 == "") { if($lllll1l11ll) { $lll1ll1l1l1 = chr(32).chr(32).chr(32).chr(32).$lll1ll1l1l1.chr(32); $lll1111l111 = strlen($lll1ll1l1l1); $llll1l111ll = false; $lll1l1ll111 = false; $llll1lll11l = false; $lll1llllll1 = false; $lllll11llll = false; $llll1l11ll1 = ""; for($lll11ll11ll = 4; $lll11ll11ll < $lll1111l111 - 1; $lll11ll11ll ++) { if(!$llll1l111ll) { if($lll1ll1l1l1[$lll11ll11ll] == chr(112) && $lll1ll1l1l1[$lll11ll11ll - 1] == chr(104) && $lll1ll1l1l1[$lll11ll11ll - 2] == chr(112) && $lll1ll1l1l1[$lll11ll11ll - 3] == chr(63) && $lll1ll1l1l1[$lll11ll11ll - 4] == chr(60))

    -------------------------------------------------

    Последняя версия PHP UnReader(ver 1.2.38 от 23.03.2008):
    - возможность "замусоревания" кода
    - поддержка heredoc-синтаксиса
    - переопределения SPL-классов, некоторых других возможностей PHP5
    - улучшен механизм обработки файла с большим количеством отдельных PHP-вставок
    - повышена скорость работы
    - улучшен механизм пресетов

    PHP UnReader, как серверный продукт позволяет автоматизировать процесс продажи скрипта с индивидуальной обфускацией для каждого пользователя. Индивидуальная обфускация позволяет совершенно точно "подписать" копию за определённым клиентом, т.к. набор имён переменных, функций и классов всегда уникален.

    Описание: http://altseotools.com/php_unreader.htm
    Демонстрационная версия: http://altseotools.com/php_unreader
     
  2. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    V.Terentev
    1. Закодированный скрипт занимает в 10 раз больше места, а исполняется раз в 100 медленнее из-за постоянных chr().
    2. Почитайте про функции get_defined_vars(), extract().
    3. Приведенный код легко преобразовывается к исходному виду, будут потеряны лишь исходные имена переменных. Но разобраться, что и как делает скрипт, даже когда переменные называются $a, $b, $c и т. д. - труда не составляет.
     
  3. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    PHP:
    1. <?php
    2.  
    3.   if(strlen($a) <= $b) {
    4.     if($a != "") $c = $a; else $d = "Код отсутствует";
    5.   }
    6.   else $d = "Код превышает ".$b." символов";
    7. }
    8.  
    9. if($d == "") {
    10.   if($e) {
    11.     $c = "    ".$c." ";
    12.     $f = strlen($c);
    13.     $g = false;
    14.     $h = false;
    15.     $i = false;
    16.     $j = false;
    17.     $k = false;
    18.     $l = "";
    19.     for($m = 4; $m < $f - 1; $m ++) {
    20.       if(!$g) {
    21.         if($c[$m] == "p" && $c[$m - 1] == "h" && $c[$m - 2] == "p" && $c[$m - 3] == "?" && $c[$m - 4] == "<")
    Декодированный текст. Скрипт для декодирования написан за 10 минут.
     
  4. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    кому нах все это говно нужно?

    Dagdamor

    +1
     
  5. V.Terentev

    V.Terentev Активный пользователь

    С нами с:
    18 янв 2008
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Волгоград
    Откуда эти все цифры сведения? С теорией оптимизации кода я тоже знаком, но что выходит на практике? Проведём тест:
    1. Обфускация своего же кода, системой с неизменённым исходником: 2.36 сек.
    2. Обфускация своего же кода, системой с обфусцированным исходником: 2.51 сек.
    Видно, что заметного уменьшения быстродействия просто нет, хотя в коде обфускатор символы и строки встречаются довольно часто и в самых критичных местах.
    О размере:
    Чистый исходник: 64,6 КБ.
    Обфусцированный: 133 КБ.
    И что не должно это дать? Объявленные переменные ИСПОЛНЯЕМОГО СЕЙЧАС скрипта. Вы предлагаете запустить скрипт, выполнить его весь по всем веткам алогритма, вконце получить эти переменные? Зачем?
    Давайте попробуем хотябы на 5000 строк, в 10 файлах? Это обфускация, а не компиляция - понятно, что что-то похожее на код можно восстановить. Но смысл в том, чтобы сделать время вникания в алгоритм сравнимым со временем его воспроизводства с нуля.
    Это тоже можно попробовать для крупного скрипта, ещё неплохо чтобы сохранилась его работоспособность. По поводу перемнных $a, $b, $c - выше.
    Господа, профессионалы, давайте по существу, а если нечего сказать, то лучше этого не делать.
     
  6. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    господа профессионалы не занимаются такой ерундой :)
     
  7. V.Terentev

    V.Terentev Активный пользователь

    С нами с:
    18 янв 2008
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Волгоград
    Чем именно не занимаются? Обфускацией? Zend с их ZendEncoder не профессоналы? Я готов ответить на любые вопросы по поводу системы, если они заданы в адекватной форме.
     
  8. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    V.Terentev
    Я предлагаю взять такой гипотетический скрипт:

    PHP:
    1. <?php
    2.  
    3. function getStatistics()
    4. {
    5.   $hitsToday=500;
    6.   $hostsToday=100;
    7.   $usersToday=50;
    8.   return get_defined_vars();
    9. }
    10.  
    11. $statistics=getStatistics();
    12.  
    13. echo $statistics["hitsToday"]; // 500
    и посмотреть, что с ним сделает обфускатор.

    Насчет скорости - я не знаю, как у вас получились такие оптимистичные цифры... учитывая, что каждую строку вы превращаете в набор вызовов функций, причем чем длиннее строка, тем больше вызовов. Предположим, что в системе используется строковый шаблонизатор, т.е. все HTML шаблоны хранятся в виде строк, как в SMF. Там удар по производительности будет смертельным. Предположим, что в системе локализованные сообщения хранятся в виде строк, и их много. Будет то же самое. И так далее...
     
  9. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    > Обфускацией? Zend с их ZendEncoder не профессоналы?

    какая связь между обфускацией и ZendEncoder-ом? :)
     
  10. Anonymous

    Anonymous Guest

    И профессионализмом?
     
  11. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    ZendEncoder разве не обфускейтит сначала?
     
  12. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    а зачем ему "обфускейтить", если он транслирует в zend-байткод? :)
     
  13. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
     
  14. Anonymous

    Anonymous Guest

    Sergey89, не знаю как сейчас, но когда я этим увлекался, все пробелы в коде восстанавливались ;)
     
  15. V.Terentev

    V.Terentev Активный пользователь

    С нами с:
    18 янв 2008
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Волгоград
    Есть демонстрационная версия: http://altseotools.com/php_unreader/. Можно посмотреть что сделает обфускатор.

    Я может что-то совсем упускаю, но так и не могу понять чем get_defined_vars() может помочь в обфускации/деобфускации.

    Скорость тоже можно оценить тестом. Давайте попробуем. Если не хватит 500символов демонстрационной версии - пришлите свой код, я обфусцирую.

    Понятно, что конечная скорость будет зависеть от кода, использования строк в критичных участках. Эту функцию можно включить/отключить в зависимости от особенностей проекта.

    ZendEncoder - это способ решения задачи, которая стоит перед любым обфускатором. НО, это решение подходит не всем, потомучто код полученный после обработки напроч теряет свободу распространения. ZendOptimizer не входит в комплект любого сервера.

    Смотря с какой стороны посмотреть - маркетинг в стиле Микрософта: вот "качественная защита", но правда её нельзя использовать без нашего ZendOptimizer. Хотя и эта защита, как и любая другая не 100%, о чём много пишут, например здесь: http://hax.himki.net/articles/html_pages3.html.
     
  16. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    V.Terentev
    Хорошо, если вам так трудно протестировать собственную систему, я сделаю это за вас.
    Итак, вот результат обработки примера выше вашей системой:

    PHP:
    1. <?php
    2.  
    3. function ll111lll11() { $lllll11l1l=500; $lll111l1ll=100; $llll11l1ll=50; return get_defined_vars(); }
    4. $lll1lllll1=ll111lll11(); echo $lll1lllll1[chr(104).chr(105).chr(116).chr(115).chr(84).chr(111).chr(100).chr(97).chr(121)];
    А вот что он теперь выдает:

     
  17. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. <?php
    2. $x = 0;
    3. $s = 'x';
    4. $$s = 1;
    5. ?>
    PHP:
    1. <?php $lllll1lll1 = 0; $lllll1llll = 'x'; $$s = 1; ?>
     
  18. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. <?php
    2. $x = 'Sergey';
    3. $s = <<<TEST
    4.     hello {$x}
    5. TEST;
    6. print $s;
    7. ?>
    PHP:
    1. <?php $llll1l11ll = chr(83).chr(101).chr(114).chr(103).chr(101).chr(121); $lllll1l1l1 = <<<TEST hello {$llll1l11ll} TEST; print $lllll1l1l1; ?>
     
  19. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. <?php
    2. eval('?><?php $x=1;');
    3. print $x;
    4. ?>
    PHP:
    1. <?php eval('?><?php $x=1;'); print $lll11l1111; ?>
     
  20. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Мой вердикт: продаёте явно незавершённый продукт.
     
  21. V.Terentev

    V.Terentev Активный пользователь

    С нами с:
    18 янв 2008
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Волгоград
    Sergey89
    Это как раз 2 случая, которые не парсятся - хередок и динамическая генерация имён переменных. Об этом написано в хэлпе. Хередок будет скоро сделан, а генерация имён типа ${$a.func($b)} возможна только при трансляции кода - просто надо отменить кодирование этих переменных.

    Dagdamor
    Наконец я понял что Вы имели в виду. Это тоже генерация имени переменной. Но это уже просто издержки метода, а не реализации - если Вы хотите заменить имя перемнной, то надо быть готовым к тому что оно всётаки измениться. Если просто необходимо использовать такое обращение, которое на мой взгляд далеко не самое быстрое и эффективное, нужно просто отключить кодирование переменной hitsToday:
    Код (Text):
    1.  
    2. <?php
    3.  
    4.  function ll1lllll11()
    5.  {
    6.    $hitsToday=500;
    7.    $llllllll11=100;
    8.    $lll111llll=50;
    9.    return get_defined_vars();
    10.  }
    11.  
    12.  $lll1ll11l1=ll1lllll11();
    13.  
    14.  echo $lll1ll11l1["hitsToday"]; // 500
     
  22. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    V.Terentev, я бы посоветовал Вам сначала устранить эти 2 случая, а потом продавать. А покупатели найдутся, если довести до ума всё. В большом проекте никто ничего не будет менять, подстраиваясь под обфускатор.
     
  23. V.Terentev

    V.Terentev Активный пользователь

    С нами с:
    18 янв 2008
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Волгоград
    Sergey89
    Хередок будет устранён в ближайшее время, а вот генерацию имён просто невозможно выполнить без трансляции. Пример: ${$var_1.func_1($var_2).$var_3}, где func_1($var_2) например читает имя из базы данных по ключу из $var_2.
     
  24. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. <?php
    2. $y = array('z'=>1);
    3. $x = "$y[z]";
    PHP:
    1. <?php $lllll1l11l = array(chr(122)=>1); $lll1l1ll1l = "".$lllll1l11l[z]
    PS Magic quotes-то отключите.
     
  25. V.Terentev

    V.Terentev Активный пользователь

    С нами с:
    18 янв 2008
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    Волгоград
    Да, это косяк. Сейчас я это исправлю.
    Просто учитываются случае вроде ${y}, $y->x, $y->$x, $y->${x}, ...

    Кто-то здесь говорил о нескольких регулярных выражениях для решения этой задачи...