Как стать автором
Обновить

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

Автор bolknote.ru/2010/05/28/~2534#05 имел ввиду, что в первоначальном виде это очень похоже на perl, точнее, на регекспы.
ТС проделал, безусловно, титаническую работу (без иронии), приводя код в «человеческий» вид.
Я бы сказал это похоже на перл скорее идеей записи кода в 1 строку, а не регекспами.
Перевод в человеческий вид — действительно впечатляет!!!
Где здесь С++?
Действительно, просто и понятно
Профессор читает лекцию по математике.
Выписывает на доске длиннющую, совершенно необозримую формулу и заявив:
«Отсюда с очевидностью следует...» выписывает еще более громоздкую формулу.
На минуту задумывается, потом, извинившись, выходит из аудитории.
Примерно через полчаса возвращается и, небрежно бросив на кафедру кипу исписанной бумаги, заявляет:
— Да, это действительно очевидно, — и продолжает лекцию.
что-то нифига не работает или автор о чём-то умолчал
<html>
<body>
<script>(E=[A=[],µ=!A+A][µ[E=-~-~++A]+({}+A) [C=!!A+µ,?=C[A]+C[+!A],A]+?])() [µ[A]+µ[A+A]+C[E]+?](A)</script>
</body>
</html>
У Вас явно проблемы с юникодными символами…
в адресной строке javascript:copypaste попробуйте
Круто! Надо написать запаковщик кода! Это ж jquery можно будет в несколько килобайт уместить.
Наоборот — сравните длину «alert(1)» и обфусцированной конструкции.
Учитывая что alert(1) — 8 байт превратили в 250 байт, то такой запаковщик с лёгкостью уместит jQuery в несколько мегабайт
Я думаю использую подобную технику можно и сжать тоже. Надо будет проверить.
Проверьте. Напишите статью. Получится — будет очень интересно.
попробуйте md5 — еще лучше сжимает :)
Это из разряда «Я написал архиватор, который сжимает файлы в 100 раз! Помогите написать распаковщик...».
НЛО прилетело и опубликовало эту надпись здесь
Вы не поверите, но запаковщик уже написаны до Вас :)
Этот небольшой Javascript Йосуке Хасегава выполняет alert(1):

Небольшой о_О? То есть window.alet(1) — это длинно, а скрипт, он короткий? :)
Осталось еще убрать переносы строк и добавить букв с закорючками.
dpaste.org/PyOq/
укороченная без выкрутасов (отдельная переменная для текста).
dpaste.org/OUpy/
с выкрутасами (всего 2 переменных). в 2 строки.
dpaste.org/AUtD/
одна строка. вместе с eval. :)
Я подумал, что под катом будет три слова: «Хер его знает!»
Забавно. так можно прятать код он любителей поковырять
С помощью подсказок автора смог восстановить последовательность действий, но несколько моментов остались загадкой. Помогите разобраться, люди добрые.

1. Что за оператор ~?
2.1. Каков механизм действия конструкции []['sort'], возвращающей функцию sort()? // Собственно как и аналогичных window['alert'], 'string'['replace'] например…
2.2. Почему (f = Array.sort)(); возвращает объект Window?
1. ~ — это побитовое отрицание (побитовое инвертирование, bitwise not), которое заменяет все нулевые биты на единицы и наоборот.
2.1. Конструкции obj['something'] и obj.something работают одинаково и возвращают соответствующее свойство объекта. Метод — тоже свойство (типа Function). У объекта класса Array есть метод sort, т.е. есть свойство sort типа Function. Оно и возвращается.
1. ~ — Bitwise Not
2.1 Конструкция Object['field'] идентична Object.field, []['sort'] -> (new Array()).sort(), window['alert'] -> window.alert
2.2 Тут вызывается функция из прототипа от имени текущего скопа, (f = Array.sort)() -> sort.call() -> sort.call(Window)
2.2. …и, так как метод sort возвращает this, то, будучи вызванным от имени window, возвращает window.
Спасибо большое! Хотел было написать, что 2.2. до сих пор не понял, но не стал спешить и таки разобрался.
В такие моменты жалею, что мое программирование на Javascript зачастую сводится к jQuery('selector').click(function(){...}) и тому подобным. Фундаментальные понятия языка либо читались ознакомительно вскользь, либо до сих пор неизвестны по причине отсутствия задач, требующих их знания и применения.
да, теперь выявить их будет сложнее…
почему?
в любом случае эту конструкцию нужно в < script > вставить — а его как-раз большинство парсеров не пропустит
Спасибо, это было великолепно!
… и закурил.
Уважаемые знатоки, скажите, почему выражение "{} + 1" интерпретируется как сложение, а то же выражение, но взятое в скобки, — как конкатенация строк (на выходе "[object Object]1")?
Потому что как сложение оно никогда не интерпретируется. Если первый аргумент — не число, то он приводится к строке, и "+" рассматривается как конкатенация.
Немного развлекся и написал eval:

(È=[][(!(A=!!(Å=-~[])+[])+A)[-~Å+Å]+({}+A)[Å]+A[Å]+A[~~[]]]||A)()[({}[A]+A)[-~Å+Å]+(È+A)[-~Å+[]+((-~Å+Å)*-~Å+Å)]+(!A+A)[Å]+(!A+A)[++Å]](' alert(«Aleko») ')

// аналог eval(' alert(«Aleko») ')
Можно ещё немного сократить:

(È=[][(!(A=!!(Å=-~[])+[])+A)[E=(µ=-~Å)+Å]+({}+A)[Å]+A[Å]+A[~~[]]]||A)()[({}[A]+A)[E]+(È+A)[µ+[]+(E*µ+Å)]+(Ç=!A+A)[Å]+Ç[++Å]](' alert(«Aleko») ')
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации