Кодирование скриптов ala Zend-Encoder

Crazy

Developer
Я одного не понимаю: если код оптимизирован, то нафига его еще и криптовать? Что-то тут правило тринадцатого удара вспоминается...
 

SeregaP

Guest
2) теперь о приятном
с месяц назад, не найдя (видимо не очень старался) большинства вышеперечисленных ссылок, я начал титанический труд по созданию своего php-кодировщика.
На сегодняшний момент прототип работает, но работы еще осталось довольно много.
Програма представляет собой модуль расширения к php, и по функциональности аналогична zend encoder-decoder, то есть может обрабатывать (пропускать сквозь себя) как обычные php файлы, так и расшифровывать и выполнять зашифрованные (своим кодировщиком) файлы.

Потому - внимание - заманчивое, на мой взгляд, предложение.

Я приглашаю к совместной работе всех, чувствующих в себе силы справиться с этой задачей. Особенно нужны люди, хорошо знакомые с тонкостями криптографии, а также программированием и отладкой на MS VC++

Программу предполагается сделать или полностью некоммерческой, или продавать кодировщик по цене, скажем, 50 уе. Естественно, все участники проекта, получают права на бесплатное использование данного модуля.

По всем вопросам писать [email protected], Парфенов Сергей
 

SeregaP

Guest
Даже если код оптимизирован, то все равно он хранится в байт-код представлении, так что его при желании (при большом желании) можно воссановить. Благо формат этого байт кода известен всем желающим покопаться в исходниках php.
 

Crazy

Developer
Если код оптимизирован, то его перевести обратно в исходник много сложнее, чем однократно пройтись отладчиком по коду исполняющего модуля и просечь алгоритм раскодирования. :)
 

SeregaP

Guest
После нахождения алгоритма раскодирования мы все равно получим с к о м п и л и р о в а н н ы й байт-код, а не исходник.
А разница между оптимизированным и неоптимизированным байт-кодом для его восстановления в исходник, я думаю... нет никакой.
Какая человеку разница, получит ли он оригинальный исходный код или немного другой (оптимизированный), но делающий то же самое.
 

Crazy

Developer
Оптимизированный код тем и отличаетсяч в плане восстановления, что для него практически невозможно построить правила восстановления кода. Для неоптимизированного кода как правило существуют достаточно несложные правила обратного преобразования.

Я уже приводил пример с декомпилятором для третьего турбо паскаля, который полностью восстанавливал программный код.

Но уже самая примитивная оптимизация кода лишает возможность использовать для распознавания статические шаблоны и, следовательно, на порядки усложняет восстановление кода. Соответственно, если в обсуждаемом случае действительно проводится серьезная оптимизация, то в дополнительном кодировани я смысла не вижу. Ну как в анекдоте -- подстелить на стол еще и газетку -- чтоб выше было...
 

SeregaP

Guest
Мы что имеем в виду под оптимизацией?
Я, говоря "оптимизация", подразумеваю то, что делает zend optimizer, других оптимизаторов я не видел.
По той скудной информации о ZO я пришел к выводу, что вся оптимизация сводится к изменению кода на другой, аналогичный по функциональности, но более быстро выполняющийся. НО! меняется код, код и только код. Не меняется сам php-движок, обрабатывающий этот код.

О каких шаблонах идет речь, я к сожалению не понял. Но восстановление байт-кода, оптимизированного с помощью ZO, ничуть не сложнее чем обычного байт-кода. В zend_compile.c, zend_language_xxx.c однозначно прописано какая конструкция языка php в какой байт-код переводится. И соответсвенно можно написать программу для обратного восстановления (и не за $200.000 как кто то предлагал, а за более прозаические $1000, я думаю за это возьмется любой начинающий программист и сделает это за 2 недели)

Если же под "оптимизацией" мы подразумеваем что то иное, то я очень хотел бы узнать о ней подробнее.
 

Crazy

Developer
Это значит, что в данном случае никакой оптимизации нет.

Под оптимизацией я имел в виду преобразование полученного байткода, приводящее к увеличению скорости его работы.
 

SeregaP

Guest
Так преобразование кода, приводящее к ускорению работы - это как раз и происходит в том случае что я описывал.

Проведем такую аналогию:
php -- pascal
php-byte-code -- assembler (тут имею в виду команды для выполнения на микропроцессоре, машинный код)

Мы откомпилировали программу на паскале - получили машинный код. Откомпилировали оптимизированную программу на паскале - получили тоже машинный код. Другой код. Но набор инструкций один и тот же, другие инструкции наш микропроцессор не умеет исполнять.

Откомпилировали программу на php - получили байт-код. Откомпилировали и соптимизировали программу на php - тоже получили байт код. В том же наборе байт-код-инструкций (аналог машинных кодов для микропроцессора, тут роль микропроцессора играет движок php, а роль машинных кодов - байт-код).
Новых байт-код-инструкций мы не получим, движок наш умеет испольнять только то что умеет.
А оптимизация достигается, как и в случае с паскалем, не засчет введения новых инструкций взамен старых, а засчет использования более оптимальных конструкций, анализа кода, убирание незначащих и никогда не выполняемых частей кода и пр.
 

Crazy

Developer
Автор оригинала: SeregaP
Так преобразование кода, приводящее к ускорению работы - это как раз и происходит в том случае что я описывал.
Которое из своих писем ты имееш в виду?

Проведем такую аналогию:
В твоих рассуждениях была логическая ошибка, но результат правилен. :)
 

SeregaP

Guest
так поясни, что за ошибка? А то, я чувствую, мы всё о разном говорим :)
 

Crazy

Developer
Логическая ошибка (или опечатка) вот здесь:

Откомпилировали оптимизированную программу на паскале - получили тоже машинный код.
Но, как я уже сказал, вывод верный. Переставляя команды байткода часто можно получить программу, выполнящую те же действия, но быстрее.

При этом по "переставленному" байткоду получить исходник куда сложнее, чем по обычному. Грубое приближение: если у нас есть набор правил, однозначно отображающих команды PHP на цепочки байткодов, то можно построить и набор правил, отображающих цепочки байткодов в команды PHP. :)

С оптимизированным кодом такого простого соответствия мы уже не получим. Хотя бы потому, что несколько посоедовательных команд исходного кода могут в результате использовать общие команды байткода. :)
 

SeregaP

Guest
нет, это уже слишком хитро, переставлять части байт-кода. Например в машинных кодах, у нас есть 1, 2-х, 3-х байтовые команды (например код операции и птом список аргументов)
и переставлять мы можем тоже только кусками - целыми командами. Если мы перенесем в машинном коде один отдельно взятый байт из многобайтовой команды, то у нас код не только не станет быстрее, он превратится во что-то совсем другое :)
Так и с байт-кодом. Даже при перестановке кусков байт-кода у нас никогда не возникнет никаких новых конструкций. Получится просто другой набор команд из языка байт-кода. И следовательно он так же сможет отобразиться в исходный код.

Еще пример: у нас есть байт-код. Он подается на вход php-движку. Тот умеет распознавать и обрабатывать строго определенные выражения. А теперь представьте, что мы взяли и переписали движок пхп, так что он не выполняет нам байт-код, а скажем формирует описание этого байт-кода и выводит на экран, скажем так
( операция: условие; переменная a < переменная b
операция: присвоение, переменной a; выражение
операция: выражение, 5 * 3 + переменная c
и т.д
при небольших усилиях мы можем привести это обратно к php-виду

Кстати, одна из вышеприведенных ссылок, программа, претендующая на кодирование php файлов, называется bytecode, вот она как раз и записывает файл в байткод представление. И потом позволяет выпонять его как обычный php файл.
Ради интереса можете поэкспериментировать с ней, поменять наудачу выбранные байтики в этом файле и посмотреть на результат.
 

AnToXa

prodigy-одаренный ребенок
SeregaP: опитимизированный код невозможно __точно__ восстановить именно потому, что при оптимизации могут меняться последовательности исполнения инструкций, убирание незначащих и никогда не выполняемых частей кода, например, вынесение условий из цикла или сворачивание констант или замена массивов просто на отдельные переменные, если они ищутся все время по константным индексам и т.п.
 

Crazy

Developer
Автор оригинала: SeregaP
нет, это уже слишком хитро, переставлять части байт-кода.
Под частью байт-кода я понимаю отдельную команду. :) Понятно, что при перестановке она может замениться на несколько других. :)

при небольших усилиях мы можем привести это обратно к php-виду
При отсутствии оптимизации. :)

Тупой пример (иллюстрирующий сам принцип, но не разумное использование):

PHP:
$foo = 1;
$bar = $foo;
$foo = 2;
Пусть вариант без оптимизации описывается таким псевдокодом:

Код:
LOCATION R1, #FOO
STORE R1, 1
LOCATION R1, #FOO
LOAD R2, R1
LOCATION R1, #BAR
STORE R1, R2
LOCATION R1, #FOO
STORE R1, 1
Отслеживаем значения регистров и стараемся повторно использовать их значения:

Код:
LOCATION R3, #FOO
STORE R3, 1
LOAD R2, R3
LOCATION R1, #BAR
STORE R1, R2
STORE R3, 1
Анализируем код и удаляем операторы, не влияющие на результат:

Код:
LOCATION R1, #BAR
STORE R1, 1
LOCATION R1, #FOO
STORE R1, 1
 

AnToXa

prodigy-одаренный ребенок
и самое главное, говоря математическим языков, компиляция - взаимно-однозначное преобразование, а оптимизация - нет
 

AnToXa

prodigy-одаренный ребенок
короче у неоднозначного преобразования матрица обратного преобразования не существует или находится неоднозначно
 

SeregaP

Guest
Математики :)
Стоит ли цель получение ОРИГИНАЛЬНОГО исходного php текста? Если да, то вы правы, оригинальный исходный мы не получим из оптимизированного файла.
Но в 99% случаев достаточно получить исходный текст программы, по функционированию аналогичной оригинальной.
(Если что-то выглядит как утка, плавает как утка, крякает как утка, то я называю это уткой)

А какой-то исходный текст, пусть и с изменениями, мы все равно получим. Главное он делает то же самое. И притом быстрее работает!
 
Сверху