На днях мне попалась на глаза статья про обфускацию и деобфускацию апплетов JavaScript. Тема эта хоть и малоперспективная, но достаточно актуальная: я и сам когда‑то касался ее в своем материале «Патчим JSXBIN. Как править бинарные скрипты Adobe без перекомпиляции» применительно к адобовской реализации JavaScript в ExtendScript Toolkit. Так вот, статья напомнила мне про старенькое, но незаслуженно забытое решение в этой области народного хозяйства под неприличным названием JSFuck.
В «Хакере» это тоже пару раз упоминалось лет восемь назад применительно к уязвимости eBay и обфусцированному коду.
Справедливости ради надо заметить, что JSFuck тогда вспомнили исключительно за хайповое название, поскольку хакеры для атаки на eBay пользовались самыми разнообразными обфускаторами и JSFuck там был отнюдь не самым распространенным. Как‑то так получилось, что никто особо не описывал принцип работы этого чудесного алгоритма, отсылая к авторскому ресурсу jsfuck.com. В сегодняшней статье попробую хоть и поздно, но исправить данное упущение.
Началось все с того, что в далеком 2009 году Ёсукэ Хасэгава (Yosuke Hasegawa, не знаю, как этих японских любителей странного и специфичного правильно называть ;)) создал веб‑приложение jjencode, перекодирующее любой код JavaScript в равноценную исполняемую форму, в которой используется только 18 спецсимволов: []()!
.
На первый взгляд подобное кажется чем‑то невероятным — процедурный объектно ориентированный язык высокого уровня ужать до подмножества из 18 спецсимволов, да еще и с сохранением всех исходных имен переменных, классов, методов и так далее...
Представь себе, например, программу на C, состоящую только из спецсимволов, но при этом прекрасно компилирующуюся и корректно работающую. Честно говоря, лично я, когда первый раз услышал про такое, тоже сперва не поверил, думал, речь идет о какой‑то надстройке над интерпретатором, шифрующей и перекодирующей исходный текст или даже подкомпилирующей его в байт‑код. Как, например, в моей статье про PHP «В обход стражи. Отлаживаем код на PHP, упакованный SourceGuardian». Или даже о кастомной реализации JS по типу адобовской.
Однако нет, полученный текст, в котором отсутствуют буквы, цифры и куча других символов, прекрасно и самодостаточно запускается, например, в браузерной строке. В этом легко убедиться самостоятельно, и это действительно выглядит каким‑то колдунством. Подробнее почитать об описанном явлении можно в статье, опубликованной на портале BusinessInfo, но мы не будем углубляться в данную тему, поскольку, оказывается, и это не предел.
В те времена эта идея настолько всех впечатлила, что буквально через полгода на форуме обфускаторов sla.
был проведен конкурс, цель которого — еще значительнее минимизировать подмножество используемых символов. И действительно, это самое подмножество удалось сократить более чем в два раза, до восьми символов: []()!
, а в марте 2010 года из него были исключены и символы ,
.
Полученное минимальное подмножество из шести оставшихся символов использовалось в онлайн‑кодировщике JS-NoAlnum, на базе которого Хасегава в конце этого же года создал кодировщик JSFuck. А чуть позже Мартин Клеппе (Martin Kleppe) опубликовал на гитхабе проект и сделал сайт jsfuck.com с описанием алгоритма.
Самые нетерпеливые читатели могут сразу перейти туда, чтобы ознакомиться с алгоритмом, так сказать, непосредственно из первых уст, для остальных я продолжу свое повествование. Надо отдать должное Хасегаве: он так хулигански назвал свой проект не из каких‑то извращенных побуждений. Название происходит от Brainfuck (переводится как «вынос мозга»), эзотерического языка программирования, на котором программы кодируются схожим набором спецсимволов. Аллюзию добавляет и то, что предшественник языка Brainfuck — эзотерический язык P'' тоже использует в своей семантике шесть спецсимволов.
Однако эти необычные языки программирования требовали для своего исполнения компиляторы или интерпретаторы, написанные на других языках, а JSFuck превосходно интерпретирует себя сам при помощи встроенного интерпретатора браузерного движка JavaScript. Начнем же сеанс разоблачения черной магии.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее