Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Невероятный JavaScript

Насколько запутанный JavaScript вы можете написать? Хотя JS-игра, которую мы сокращали на пару с LO, выглядит довольно запутанно, но можно писать куда более непонятно, если ваша цель не сократить объём, а сделать так, чтобы у читающих листинг вашего кода выпали глаза.

В блоге Shadowflux образчик хорошо запутанного кода с объяснением работы:

($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+
($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__
[_+~$]+$_[_]+$$](_/_)

Выглядит довольно страшно, но, если разобраться, ничего сложного. Напоминает старый добрый Perl.

7 комментариев
astur (astur.net.ru) 2011

Просто восхитительно!

Должно понравиться любителям «закрытого открытого кода» :)

arseny 2011

замена всех своих имен на подчеркивания разной длины уже дает хорощий результат

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

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

Такая обфускация частично обратима, в том смысле, что обратная замена на какие-то буквы даёт вполне читаемый результат, хоть и понимаемый с бо́льшими усилиями.

LO 2011

История (для всех):
1) Идею первым предложил Йосуке Хасегава в этом посте http://sla.ckers.org/forum/read.php?2%2C15812%2Cpage=14 (1.06.2009)
2) Потом был организован первый конкурс по небуквенноцифровому JS: http://sla.ckers.org/forum/read.php?24%2C28687 .Его целью ставилась задача сделать то же, что и Хасегава, но только КАК МОЖНО МЕНЬШЕ. В качестве браузера был взят FF как наиболее продвинутый.
3) Ещё позже был организован второй конкурс, впоследствии получивший название «Великая стена Javascript». Вопрос ставился так: сколько РАЗЛИЧНЫХ символов нужно использовать, чтобы добиться выполнения удаленного JS. Этот конкурс здесь: http://sla.ckers.org/forum/read.php?24%2C32930
4) Были ещё несколько интересных конкурсов, посвященных этому — ссылки на них в том же разделе того же форума.
5) Потом начали появляться соответствующие обфускаторы и деобфускаторы. Там, где используются переменные, для деобфускации можно использовать уже созданные JS-песочницы (типа JSReg от Г.Хейеса, но с оговорками, поскольку они, по своему предназначению подменяют ссылки на объекты, из-за чего некоторые способы получения тех или иных букв могут оказаться невозможными). Для деобфускации кода, который не использует переменных (сейчас такой код создают два обфускатора: один от Хасегавы, другой — от SW) также создан деобфускатор: http://code.google.com/p/jsfuck-decoder/ Там же ссылки на их обфускаторы. Это «наречие» JS названо JSFuck.
6) В этом блоге уже появлялись ссылки на эту технику http://bolknote.ru/all/2534 Там ты привёл 92 байтный код Э.Велы, здесь ты приводишь уже 106 байтный код М.Хайдериха, потому что его разбирает указанный автор, сам взявший его из презентации Р.Барнета 2011 г. (который, кстати, не указал источники) http://www.modsecurity.org/documentation/XSS_Street_Fight-Ryan_Barnett-BlackhatDC-2011.pdf И та, и другая форма кода значится в том самом первом небуквенноцифровом JS-конкурсе.
7) Я видел в наших интернетах неоднократные восхищения по поводу того, как и почему этот наркотик работает, но не видел упоминания, в чем состоит главная идея: в выявлении минимальной формы этого кода или в преодолении Великой JS-стены. Ну, в рамках первого конкурса вряд ли удастся что-либо сделать и преодолеть мой барьер в 63 байта. А вот в рамках «Стены» можно попытаться сократить мой 460 байтный код, ухлопав неделю другую своей жизни. :) К чему всех и призываю!

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

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

Спасибо за историю :)

В этом блоге уже появлялись ссылки на эту технику

Это я вспомнил, но не смог найти.

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

О, на «Хабре» статья на эту тему появилась: http://habrahabr.ru/blogs/javascript/112530/

пека 2014

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

декодер JSFuck не полностью обращает результат кодирования, на самом деле
и в процессе «декодирования» ломается работоспособность кода