Невероятный JavaScript
Насколько запутанный JavaScript вы можете написать? Хотя JS-игра, которую мы сокращали на пару с LO, выглядит довольно запутанно, но можно писать куда более непонятно, если ваша цель не сократить объём, а сделать так, чтобы у читающих листинг вашего кода выпали глаза.
В блоге Shadowflux образчик хорошо запутанного кода с объяснением работы:
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+
($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__
[_+~$]+$_[_]+$$](_/_)
Выглядит довольно страшно, но, если разобраться, ничего сложного. Напоминает старый добрый Perl.
Просто восхитительно!
Должно понравиться любителям «закрытого открытого кода» :)
замена всех своих имен на подчеркивания разной длины уже дает хорощий результат
Комментарий для arseny:
Такая обфускация частично обратима, в том смысле, что обратная замена на какие-то буквы даёт вполне читаемый результат, хоть и понимаемый с бо́льшими усилиями.
История (для всех):
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 байтный код, ухлопав неделю другую своей жизни. :) К чему всех и призываю!
Комментарий для LO:
Спасибо за историю :)
Это я вспомнил, но не смог найти.
О, на «Хабре» статья на эту тему появилась: http://habrahabr.ru/blogs/javascript/112530/
Комментарий для LO:
декодер JSFuck не полностью обращает результат кодирования, на самом деле
и в процессе «декодирования» ломается работоспособность кода