PHPFuck

JSFuck у нас уже был (это намёк на язык Брейнфак, а не ругательство), почему бы не изобрести PHPFuck?

Часа полтора потратил на скрипт, который выводит слово «Hello!»:

<?
$__=$_[$_[]++].=$_;$_[!_]+=++$_[!_];@$$_=($_[$$_][$_]&$_[$$_][$_[!_]]).$_[$$_][$_];
$_[]=&$$_;@$$_.=$_[!!_][$__]^$__[$_[!_]]|$__[!_];$___=$__[!_]|_&~$__[!!_];
@$$_.=++$___.($__[$_]^_^$__[$_[!_]]).($_[!!_][!$_]^$_[_==_][$_[!_]>>!!_]^_);
$___&=$__[$_[!_]];$___.=${$_}[!_]^${$_}[$_[!_]]|$__[!_].($$$_=$__[!_]^_^$__[!!_]).
$$$_.($_[_]=$__[$_[!_]]^_^${$_}[$_[!_]>>!!_]);$$_($___.
(~${$_}[~-$_[!_]]&$___[$_[!_]]).($_[_]&~$___[!!_]));

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

Что вкратце происходит у меня. Я создаю массив, привожу его к строке, получается слово «Array» (это такая особенность PHP, если кто не знает), потом при помощи бинарных операций над буквами (с буквами можно использовать «~», «&», «|», «^», а так же операцию инкремента, получая другие буквы), собираю из этого слова слово «printf» (точнее «prINTf», функции в PHP регистронезависимые), которое в дальнейшем будет использовано в качестве имени функции. Потом из двух слов — «Array», «prINTf» и знака подчёркивания теми же бинарными преобразованиями получаю «Hello!» с переводом строки.

Например, буква «N» получается операцией «A» | «_» | ~«r» с последующим инкрементом результата, а «l» (латинская «эл») — «A» ^ «r» ^ «_». Подчёркивание можно использовать без кавычек — все незакавыченные идентификаторы PHP рассматривает как строки. Кое-где там используются похожим образом получаемые цифры, но это уж совсем не интересно рассказывать.

В конце просто вызываю функцию, передавая ей полученную строку.

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

extremus (extremus.livejournal.com) № 5
А не спортивнее ли привести число (полученное инкрементом false, как и сейчас) к строке (например, конкатенацией с еще одним нулем)? Тогда не придется полагаться на приведение массива к слову Array.
extremus (extremus.livejournal.com) № 6
P.S. Я неправильно выразился. Не инкрементом, а плюсом, конечно же. Что-то вроде @$_=(+_).(+_); и т.д.
Евгений Степанищев (bolknote.ru) автор № 7

Комментарий для extremus.livejournal.com:

А не спортивнее ли привести число (полученное инкрементом false, как и сейчас) к строке (например, конкатенацией с еще одним нулем)? Тогда не придется полагаться на приведение массива к слову Array.

А что плохого в том, чтобы полагаться на это приведение? Оно документированное.

extremus (extremus.livejournal.com) № 8
Ничего плохого. Разве что слишком произвольная, причудливая особенность. Или она и есть соль фокуса? Тогда выходит я просто упустил шутку.
Евгений Степанищев (bolknote.ru) автор № 9
Комментарий для extremus.livejournal.com:

Можно обойтись из без неё, если не выкидывать подчёркивание. Если и им не пользоваться, то я навскидку не знаю способа как обойтись одними числами.