[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
V.Terentev 1. Закодированный скрипт занимает в 10 раз больше места, а исполняется раз в 100 медленнее из-за постоянных chr(). 2. Почитайте про функции get_defined_vars(), extract(). 3. Приведенный код легко преобразовывается к исходному виду, будут потеряны лишь исходные имена переменных. Но разобраться, что и как делает скрипт, даже когда переменные называются $a, $b, $c и т. д. - труда не составляет.
PHP: <?php if(strlen($a) <= $b) { if($a != "") $c = $a; else $d = "Код отсутствует"; } else $d = "Код превышает ".$b." символов"; } if($d == "") { if($e) { $c = " ".$c." "; $f = strlen($c); $g = false; $h = false; $i = false; $j = false; $k = false; $l = ""; for($m = 4; $m < $f - 1; $m ++) { if(!$g) { if($c[$m] == "p" && $c[$m - 1] == "h" && $c[$m - 2] == "p" && $c[$m - 3] == "?" && $c[$m - 4] == "<") Декодированный текст. Скрипт для декодирования написан за 10 минут.
Откуда эти все цифры сведения? С теорией оптимизации кода я тоже знаком, но что выходит на практике? Проведём тест: 1. Обфускация своего же кода, системой с неизменённым исходником: 2.36 сек. 2. Обфускация своего же кода, системой с обфусцированным исходником: 2.51 сек. Видно, что заметного уменьшения быстродействия просто нет, хотя в коде обфускатор символы и строки встречаются довольно часто и в самых критичных местах. О размере: Чистый исходник: 64,6 КБ. Обфусцированный: 133 КБ. И что не должно это дать? Объявленные переменные ИСПОЛНЯЕМОГО СЕЙЧАС скрипта. Вы предлагаете запустить скрипт, выполнить его весь по всем веткам алогритма, вконце получить эти переменные? Зачем? Давайте попробуем хотябы на 5000 строк, в 10 файлах? Это обфускация, а не компиляция - понятно, что что-то похожее на код можно восстановить. Но смысл в том, чтобы сделать время вникания в алгоритм сравнимым со временем его воспроизводства с нуля. Это тоже можно попробовать для крупного скрипта, ещё неплохо чтобы сохранилась его работоспособность. По поводу перемнных $a, $b, $c - выше. Господа, профессионалы, давайте по существу, а если нечего сказать, то лучше этого не делать.
Чем именно не занимаются? Обфускацией? Zend с их ZendEncoder не профессоналы? Я готов ответить на любые вопросы по поводу системы, если они заданы в адекватной форме.
V.Terentev Я предлагаю взять такой гипотетический скрипт: PHP: <?php function getStatistics() { $hitsToday=500; $hostsToday=100; $usersToday=50; return get_defined_vars(); } $statistics=getStatistics(); echo $statistics["hitsToday"]; // 500 и посмотреть, что с ним сделает обфускатор. Насчет скорости - я не знаю, как у вас получились такие оптимистичные цифры... учитывая, что каждую строку вы превращаете в набор вызовов функций, причем чем длиннее строка, тем больше вызовов. Предположим, что в системе используется строковый шаблонизатор, т.е. все HTML шаблоны хранятся в виде строк, как в SMF. Там удар по производительности будет смертельным. Предположим, что в системе локализованные сообщения хранятся в виде строк, и их много. Будет то же самое. И так далее...
> Обфускацией? Zend с их ZendEncoder не профессоналы? какая связь между обфускацией и ZendEncoder-ом?
Есть демонстрационная версия: http://altseotools.com/php_unreader/. Можно посмотреть что сделает обфускатор. Я может что-то совсем упускаю, но так и не могу понять чем get_defined_vars() может помочь в обфускации/деобфускации. Скорость тоже можно оценить тестом. Давайте попробуем. Если не хватит 500символов демонстрационной версии - пришлите свой код, я обфусцирую. Понятно, что конечная скорость будет зависеть от кода, использования строк в критичных участках. Эту функцию можно включить/отключить в зависимости от особенностей проекта. ZendEncoder - это способ решения задачи, которая стоит перед любым обфускатором. НО, это решение подходит не всем, потомучто код полученный после обработки напроч теряет свободу распространения. ZendOptimizer не входит в комплект любого сервера. Смотря с какой стороны посмотреть - маркетинг в стиле Микрософта: вот "качественная защита", но правда её нельзя использовать без нашего ZendOptimizer. Хотя и эта защита, как и любая другая не 100%, о чём много пишут, например здесь: http://hax.himki.net/articles/html_pages3.html.
V.Terentev Хорошо, если вам так трудно протестировать собственную систему, я сделаю это за вас. Итак, вот результат обработки примера выше вашей системой: PHP: <?php function ll111lll11() { $lllll11l1l=500; $lll111l1ll=100; $llll11l1ll=50; return get_defined_vars(); } $lll1lllll1=ll111lll11(); echo $lll1lllll1[chr(104).chr(105).chr(116).chr(115).chr(84).chr(111).chr(100).chr(97).chr(121)]; А вот что он теперь выдает:
PHP: <?php $x = 'Sergey'; $s = <<<TEST hello {$x} TEST; print $s; ?> PHP: <?php $llll1l11ll = chr(83).chr(101).chr(114).chr(103).chr(101).chr(121); $lllll1l1l1 = <<<TEST hello {$llll1l11ll} TEST; print $lllll1l1l1; ?>
PHP: <?php eval('?><?php $x=1;'); print $x; ?> PHP: <?php eval('?><?php $x=1;'); print $lll11l1111; ?>
Sergey89 Это как раз 2 случая, которые не парсятся - хередок и динамическая генерация имён переменных. Об этом написано в хэлпе. Хередок будет скоро сделан, а генерация имён типа ${$a.func($b)} возможна только при трансляции кода - просто надо отменить кодирование этих переменных. Dagdamor Наконец я понял что Вы имели в виду. Это тоже генерация имени переменной. Но это уже просто издержки метода, а не реализации - если Вы хотите заменить имя перемнной, то надо быть готовым к тому что оно всётаки измениться. Если просто необходимо использовать такое обращение, которое на мой взгляд далеко не самое быстрое и эффективное, нужно просто отключить кодирование переменной hitsToday: Код (Text): <?php function ll1lllll11() { $hitsToday=500; $llllllll11=100; $lll111llll=50; return get_defined_vars(); } $lll1ll11l1=ll1lllll11(); echo $lll1ll11l1["hitsToday"]; // 500
V.Terentev, я бы посоветовал Вам сначала устранить эти 2 случая, а потом продавать. А покупатели найдутся, если довести до ума всё. В большом проекте никто ничего не будет менять, подстраиваясь под обфускатор.
Sergey89 Хередок будет устранён в ближайшее время, а вот генерацию имён просто невозможно выполнить без трансляции. Пример: ${$var_1.func_1($var_2).$var_3}, где func_1($var_2) например читает имя из базы данных по ключу из $var_2.
PHP: <?php $y = array('z'=>1); $x = "$y[z]"; PHP: <?php $lllll1l11l = array(chr(122)=>1); $lll1l1ll1l = "".$lllll1l11l[z] PS Magic quotes-то отключите.
Да, это косяк. Сейчас я это исправлю. Просто учитываются случае вроде ${y}, $y->x, $y->$x, $y->${x}, ... Кто-то здесь говорил о нескольких регулярных выражениях для решения этой задачи...