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

V.Terentev

Новичок
Все косяки ИСПРАВЛЕНЫ, кроме "ZZZ::" - это чуть позже.

Файл ТЕСТА на деобфускацию (http://www.pilotstudio.ru/download/index.zip) заменён.

переменные, кстати, можно писать в виде ${'blabla'}
Это да, но такие переменные, имена которых генерируются в процессе пытаться отпарсить бесполезно. Например ${$a.func($b).$c} - до исполнения кода имя не определить. Кодирование таких переменных, если они используются и с именем в явным виде и в неявном (например $abcd; ${"ab"."cd"}) нужно отключить соответствующей галкой.

Ещё раз вопрос к fixxxer о том, что он писал:
Разве можно в скрипте переопределить класс spl?
 

Develar

Новичок
>> Разве можно в скрипте переопределить класс spl?
вы хотя бы годик профессионально попрограммировали бы на PHP, прежде чем писать продукт такого рода... сами подумайте, нах он нужен тогда этот SPL с его ООП и итераторами если нельзя переопределить.
 

fixxxer

К.О.
Партнер клуба
${'blablabla'} - это в явном виде. ;) до тех пор пока нет конкатенации (явной или полученной в результате интерполяции), по крайней мере с точки зрения zend engine.

про spl Develar ответил, ага
 

V.Terentev

Новичок
вы хотя бы годик профессионально попрограммировали бы на PHP, прежде чем писать продукт такого рода
Ну небыло у меня такой задачи по переопределению классов SPL - спасибо за ценное земечание.

Это я учёл - классы из массива spl_classes() исключаются из списка к замене.

${'blablabla'} - это в явном виде
Да... ну пока это не реализовано. Непонятно, кому может понадобиться генерировать имя перемнной без конкатенации. ${'blablabla'} и работать будет дольше чем $blablabla, да и смысла вобщемто не имеет. Только если нужно/хочется нарушить правила именования переменных. В любом случае - если встречается только ${'blablabla'} - оно и не будет закодировано, а если ${'blablabla'} и $blablabla вместе - кодирование $blablabla нужно отключить, что МОЖНО сделать.

Кто-то пытался деобфусцировать тест? - очень интересно, потомучто говорили что очень легко.
 

kode

never knows best
Надеюсь магические методы и конструкторы вы не переименовываете?

-~{}~ 23.01.08 01:04:

http://altseotools.com/php_unreader/

что то ваше demo у меня не работает....
 

V.Terentev

Новичок
Надеюсь магические методы и конструкторы вы не переименовываете
Если классы не кодируются, то их конструкторы тоже не кодируются. Если кодируются только классы но не функции - их конструкторы кодируются. Соответствие имени класса и конструктора при кодировании конечно сохраняется.

Кстати, на сервере где лежит дэмка - PHP4, поэтому функция spl_classes() не работает т.е. SPL-классов нет. Вообще, например, глобальные переменные, которые тоже исключаются из списка к замене получаются динамически и соответствуют той версии PHP, на которой работает сам обфускато (хотя это можно регулировать). Поэтому, модэль замены по умолчанию соответствует модэле классов и глобальных перемнных сервера, где работает сам PHP UnReader.

-~{}~ 23.01.08 01:10:

что то ваше demo у меня не работает
Всё работает прямо сейчас. Это что-то на маршруте.
 

kode

never knows best
нет с маршрутом всё нормально, я имею ввиду не обфусцирует код....

-~{}~ 23.01.08 02:58:

Автор оригинала: V.Terentev
Если классы не кодируются, то их конструкторы тоже не кодируются. Если кодируются только классы но не функции - их конструкторы кодируются. Соответствие имени класса и конструктора при кодировании конечно сохраняется.
А вы знаете чтов PHP5 есть магические методы....предлагаю методы начинающиеся с "__" не переименовывать...
 

zerkms

TDD infected
Команда форума
вы хотя бы годик профессионально попрограммировали бы на PHP, прежде чем писать продукт такого рода... сами подумайте, нах он нужен тогда этот SPL с его ООП и итераторами если нельзя переопределить.
а вот тут можно поподробнее? хотя бы одну причину переопределять уже определённый(ую) в php/ext класс(функцию)?
 

Develar

Новичок
zerkms
Так ведь куча причин, в blitz это заложено в концепцию, в SPL тоже в архитектуру - ряд паттернов так и предполагает расширение (FilterIterator имеет абстрактный метод), PDO не полностью реализует типы определенные в последнем стандарте SQL и т. п.
 

fixxxer

К.О.
Партнер клуба
>>Кто-то пытался деобфусцировать тест?

а нахрена интересно. :)
чей то там говнокод (ну или пусть великолепный и красивый) никого не интересует, а если надо подправить какую-то там защиту итп по мелочи - для этого вовсе не надо разбираться во всем целиком, прогнать beautifier-ом и var_dump в руки.

p.s. когда баловался дезендером на попавшихся под руку на сервере скриптах - там безо всякой обфускации полная белая лисичка. поголовно. "защищают" обычно то, что никому нафиг не нужно, еще и оперируя словами типа "интеллектуальная собственность", и понятно - дорожат говнокодом только те кому его написание дается неимоверными усилиями =) исключения есть, но их на общем фоне можно не считать
 

zerkms

TDD infected
Команда форума
Develar
не путаешь ли ты наследование с переопределением??? как по мне - так это два совершенно разных термина
 

Develar

Новичок
zerkms
Я понял ваш намек выделенный жирным. Чтобы переопределить на уровне PHP нам нужно наследовать - "переопределение позволяет подклассу переопределить код методов, унаследованных им от суперкласса, и таким образом специализировать поведение подкласса." (Java 2 Certification Chapter 6 "OOP and inheritance"), то есть в примере blitz имелось ввиду не концепция пользовательских методов, а переопределение метода parse для реализации макетирования, а в PDO переопределение существующих, а не добавление (то есть расширение) новых методов для полной поддержки SQL. Если можно - киньте ссылку на ваше понимание данных терминов.
 

zerkms

TDD infected
Команда форума
Develar
перечитай внимательно свой пост про SPL и OOP. ты не указал что переопределять будешь метод. из фразы, имхо, вполне явно читается что переопределять ты хотел класс

наследование я понимаю так: http://ru.wikipedia.org/wiki/Наследование_(программирование)
переопределение класса - не понимаю никак, потому что это анормально ;)
 

Develar

Новичок
>> переопределение класса - не понимаю никак, потому что это анормально
это уже буквоедство :) на уровне разговора можно понимать это как показатель того, что ты переопределил ряд методов класса. учту, что за мной следят ;)
 

V.Terentev

Новичок
нет с маршрутом всё нормально, я имею ввиду не обфусцирует код
Всё работает. Может Вы забыли написать "<?php" в начале?

Лично я "переопределение класса" имелл ввиду как запись в виде:
class ArrayObject {...}
Поэтому меня и удивило, что это кому-то нужно и вообще можно ли так сделать без ошибок.
В PHP UnReader находятся все классы, определяемые в проекте с помощью "class" и их имена заменяются, поэтому если класс наследуется от другого, не определённого в проекте, то тот класс, от которого происходит наследование конечно не заменится.

Но теперь имена классов, полученные функцией spl_classes() на всякий случай исключяются из списка к замене если версия PHP выше 5.

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

"защищают" обычно то, что никому нафиг не нужно
Есть много случаев когда защищать не нужно, но есть всёже, когда это делать нужно. Крупные проекты (больше 100000р) часто продаются вообще в полностью открытом виде - там "обфускацией" служит объём кода, да и задачи другие - такой проект никто не будет изменять и перепродавать. Проекты же мелкие, которые стоят мало, но продаются часто (причём это не зависит от "качества" кода, а зависит только от маркетинговой стратегии) лучше защищать. Кроме того, есть проекты, которые малы, но содержат уникальный алгоритм, ставший продуктом длительной разработки (причём объём его кода тоже не корелирует с "качеством") - такой продукт тоже нужно защищать. И т.д. Это уже действительно другой разговор.

предлагаю методы начинающиеся с "__" не переименовывать
Ок. Такие методы теперь удалюятся из списка к замене.
 

Андрейка

Senior pomidor developer
V.Terentev
тебя просили выложить один полностью законченный файлик, разбирацца что значит $1111111/=14 вначале - лень, патамушта переменная undefined
 

StUV

Rotaredom
у меня на этом примере сразу

Parse error: syntax error, unexpected ';' in C:\tmp\index.php on line 1

м.б. все-таки будет рабочий пример?

---
+
непробовали делать сравнение различных параметров производительности выполнения обфусцированных скриптов и их оригинала?

что-то мне подсказывает, что в оригинальном скрипте было гораздо меньше 300Кб кода + намного меньше вызовов стандартных функций
 

V.Terentev

Новичок
м.б. все-таки будет рабочий пример?
Ок. Файл http://www.pilotstudio.ru/download/index.zip обновлён. Формат теста меняется. Теперь скрипт проще, но абсолютно ясно что это за скрипт: http://linkcheck.pilotstudio.ru. Автоматически снимаются все вопросы по работоспособности - у меня обфусцированный скрипт полностью функционален.

Задача минимум: снять ограничения на объём читаемого кода и время чтения. Это, думаю, будет легко потомучто я даже не пытался их прятать - больше того, они вынесены и выделены в блок.

Задача максимум: понять весь алгоритм и разобраться хотябы с половиной переменных.

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

-~{}~ 23.01.08 20:06:

непробовали делать сравнение различных параметров производительности выполнения обфусцированных скриптов и их оригинала
Я писал про это в начале трида. Снижение скорости зависит от наличия в коде строк (заменяемых на CHR(...)) в узких местах, а также ещё от сотни факторов. Тест на коде самого обфускатора дал снижение где-то на 10%. Объём конечно тоже вырос, но это на что-то влияет только по средствам увеличения времени парсинга.

-~{}~ 30.01.08 02:33:

Проведено дополнительное тестирование - исправлены все функциональные несоответствия обфусцированного кода оригиналу.

Добавлена поддержка heredoc-синтаксиса.
 

weregod

unserializer
PHP:
<?php

# here was my comment

echo $a;
превратился в

PHP:
<?php # here was my comment echo $a;
всё-таки автору не с php5 разбираться надо сначала, а с php3 :)
 
Сверху