Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

PHPFuck

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

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

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

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

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

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

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

12 комментариев
PastorGL 2013

Лайк! :-)

Евгений Степанищев (bolknote.ru) 2013

Комментарий для PastorGL:

По вашим многочисленным просьбам ;)

Рамиль К (ramil1017.ya.ru) 2013

Скрипт радостен. В нём три раза встречается смайл ^_^

Евгений Степанищев (bolknote.ru) 2013

Комментарий для ramil1017.ya.ru:

Ага, я специально подчерк в центр ставил :)

extremus (extremus.livejournal.com) 2013

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

extremus (extremus.livejournal.com) 2013

P.S. Я неправильно выразился. Не инкрементом, а плюсом, конечно же. Что-то вроде @$_=(+_).(+_); и т. д.

Евгений Степанищев (bolknote.ru) 2013

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

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

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

extremus (extremus.livejournal.com) 2013

Ничего плохого. Разве что слишком произвольная, причудливая особенность. Или она и есть соль фокуса? Тогда выходит я просто упустил шутку.

Евгений Степанищев (bolknote.ru) 2013

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

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

dionys.myopenid.com 2013

Это ж JAPH ( http://en.wikipedia.org/wiki/JAPH ), только на PHP.

Игорь 2014

Круто! И очень интересно.

aktuba 2014

В 5.5 уже не работает?