На днях мне попалась на глаза статья про обфускацию и деобфускацию апплетов 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. Начнем же сеанс разоблачения черной магии.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»