Да­вай отло­жим в сто­рону сухую тех­ничес­кую праг­матику и погово­рим о прек­расном. Ты спро­сишь: что может быть прек­расно­го в обфуска­ции кода? Я отве­чу: некото­рые решения в этой области обла­дают пря­мо‑таки эсте­тичес­ки чару­ющей кра­сотой, дос­тупной толь­ко истинным цените­лям. Прав­да, называ­ются порой не осо­бен­но бла­гоз­вучно. Сегод­ня мы погово­рим о JSFuck — инс­тру­мен­те для обфуска­ции и деоб­фуска­ции JavaScript.

На днях мне попалась на гла­за статья про обфуска­цию и деоб­фуска­цию аппле­тов 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.ckers.org был про­веден кон­курс, цель которо­го — еще зна­читель­нее миними­зиро­вать под­мно­жес­тво исполь­зуемых сим­волов. И дей­стви­тель­но, это самое под­мно­жес­тво уда­лось сок­ратить более чем в два раза, до вось­ми сим­волов: []()!+,/, а в мар­те 2010 года из него были исклю­чены и сим­волы ,/.

По­лучен­ное минималь­ное под­мно­жес­тво из шес­ти оставших­ся сим­волов исполь­зовалось в онлайн‑кодиров­щике JS-NoAlnum, на базе которо­го Хасега­ва в кон­це это­го же года соз­дал кодиров­щик JSFuck. А чуть поз­же Мар­тин Клеп­пе (Martin Kleppe) опуб­ликовал на гит­хабе про­ект и сде­лал сайт jsfuck.com с опи­сани­ем алго­рит­ма.

Са­мые нетер­пеливые читате­ли могут сра­зу перей­ти туда, что­бы озна­комить­ся с алго­рит­мом, так ска­зать, непос­редс­твен­но из пер­вых уст, для осталь­ных я про­дол­жу свое повес­тво­вание. Надо отдать дол­жное Хасега­ве: он так хулиган­ски наз­вал свой про­ект не из каких‑то извра­щен­ных побуж­дений. Наз­вание про­исхо­дит от Brainfuck (перево­дит­ся как «вынос моз­га»), эзо­тери­чес­кого язы­ка прог­рамми­рова­ния, на котором прог­раммы кодиру­ются схо­жим набором спец­симво­лов. Аллю­зию добав­ляет и то, что пред­шес­твен­ник язы­ка Brainfuck — эзо­тери­чес­кий язык P'' тоже исполь­зует в сво­ей семан­тике шесть спец­симво­лов.

Од­нако эти необыч­ные язы­ки прог­рамми­рова­ния тре­бова­ли для сво­его исполне­ния ком­пилято­ры или интер­пре­тато­ры, написан­ные на дру­гих язы­ках, а JSFuck пре­вос­ходно интер­пре­тиру­ет себя сам при помощи встро­енно­го интер­пре­тато­ра бра­узер­ного движ­ка JavaScript. Нач­нем же сеанс разоб­лачения чер­ной магии.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии