Что-то не вижу — быть или не быть?
Так выглядит программа, выводящая монолог Гамлета |
Слово «выглядит» в подписи ко скриншоту выше упомянуто неслучайно — программа написана так, что видимое — только надводная часть айсберга.
Уже в те далёкие времена, когда я только ещё начинал писать на ДжаваСкрипте, программисты на форумах задавались вопросом можно ли как-то защитить свои программы на этом языке от обратной разработки. Помню «Микрософта» в своём браузере позволяла шифровать исходный код, но эту «защиту» довольно быстро поломали, очень уж она была простая.
Позже, когда производительность интерпретаторов ДжаваСкрипта стала стремительно повышаться, появились всяческие обсуфкаторы, сильно запутывающие программу за счёт удаления форматирования, внесения шума, замены имён переменных и функций и сжатия по словарю поверх всех замен.
С тех пор эти инструменты застыли примерно в том же состоянии, но теперь, мне кажется, в этом деле наметился прорыв.
Некто ФейкЮникод, разместил скрытое послание внутри суррогатных пар Юникода. Я когда-то делал что-то похожее на пробелах нулевой длины, но моим способом сильно не разбежишься — алфавит маленький.
Что такое суррогатные пары расписывать не буду, статей на эту тему предостаточно, главное, что их не видно и они могу быть частью (кроме первого символа) любого идентификатора ДжаваСкрипта.
Я попробовал использовать способ с суррогатными парами, чтобы скрыть монолог Гамлета внутри программы на ДжеЭсФаке (способ написания программ на ДжаваСкрипте, когда не используются алфавитно-цифровые знаки), плюс этими же парами закодировал имена переменных.
Получилась адская обфускация, глядя на которую и не заподозришь, что она после запуска выведет в консоль полтора килобайта английского текста.
в чём заключается прорыв?
Комментарий для zg.livejournal.com:
Я думал это очевидно. В том, что код можно прятать так, что подавляющее большинство людей и не догадаются поискать.
Комментарий для Евгения Степанищева:
а что, те кто реверсят джаваскрипт, делают это вручную? я предполагаю, что как минимум для начальной обработки используется какой-то инструмент, который форматирует, идентификаторы переименовывает и т. д.
Комментарий для zg.livejournal.com:
Так и есть :) Но в данном случае обфускацию можно устроить так, что она и заметна-то не не будет. Вот у меня в примере (в монологе «Гамлета») все переменные как будто бы называются одинаково, а значимый текст спрятан «между строк».
Теперь уберите факджээс, представьте себе обычную программу, где на первый взгляд всё нормально — никакой обфускации. Никто же в таком случае деобфускаторы не запускает. Но на деле часть программы спрятана, а некоторые переменные называются так же. Если не вглядываться, то ничего не заметно, если вглядываться, то неясно как работает. Думаю большинство вглядываться не будет.
Впрочем, все эту уловки, скорее всего, не нужны будут, когда в бразузеры строят средства для защиты контента. Думаю защищать можно будет не только аудио и видео, но и код.
Комментарий для Евгения Степанищева:
один раз анализ займёт больше времени, возможно. типичное security through obscurity. в чём прорыв-то?
Есть на свете другие браузеры, кроме Хрома и ФФ.
В Эдже весь этот мусор из кусков суррогатных пар вполне заметен. Особенно в оригинальном твите (его там разносит в полную порнографию).
Комментарий для zg.livejournal.com:
Для меня любое движение после застоя — прорыв. Тут как раз движение после застоя.
Комментарий для PastorGL:
А вот это уже гораздо печальнее :(
Комментарий для zg.livejournal.com:
Давайте пофантазируем. Предположим вы никогда не знали о такой возможности. Смотрите на скрипт, который откуда-то скопирован и вам надо кое-что в нём поправить, но вы в упор не видите в нём того места, которое надо править. Какая следующая мысль — «о, тут зашифровано что-то в суррогатных парах» или «чёрт, наверное не всё скопировал, но что-то не вижу где остальное»?
Вкупе с остальными методами этот мог бы серьёзно поднять стоимость обратной разработки. Мог бы, если бы не Эдж.
Комментарий для Евгения Степанищева:
я бы посмотрел содержимое в хексе.
Комментарий для zg.livejournal.com:
Вспоминается случай, когда я как-то в середине нулевых сунул в код фреймворка, который мы тогда писали, юзерпик, раскиданный в виде кодированных строк (никаких суррогатных пар, просто комментарии в base64, раскиданные тут и там в коде) и максимально запутанный (не обсусцированный, а просто использующий всё редкое и неочевидное, что есть в ПХП) код, который его собирает и выводит по определённому урлу. Так его несколько лет в коде не замечали, пока я не выдержал и сам не показал.
Где-то в блоге я об этом рассказывал немного, не смог найти, к сожалению.
Комментарий для Евгения Степанищева:
Вот по-честноку, если мне в коммерческом коде попадаются подобные приколы, я ставлю шутника к стенке. С вызовом к начальству, выговором, и всем, что полагается. Потому что ну ни разу не смешно поддерживать код с дополнительным пэйлоадом, насколько бы безобидным он ни был. Потому что рано или поздно любая закладка проявит себя, и это обязательно будет неудобный момент.
Вообще, при поддержке кодовых баз жирных коммерческих проектов любое отклонение от конвенций воспринимается однозначно как жуткое неуважение к коллегам, даже саботаж. Не в интеллектуальные игры играемся, а деньги зарабатываем. В хобби-проекте ты, конечно, хоть на голове ходи, но в отчуждаемом коде будь добр, следуй конвенциям.
Комментарий для PastorGL:
Какой-то странный комментарий. Ну спасибо что поделились что ли.
Комментарий для Евгения Степанищева:
«Странный комментарий», говорите. Ну-ну.
Мне однажды похожая «шутка» стоила срыва крупного milestone. Ревьюеры со стороны заказчика нашли в коде хитро упрятанную песенку, и завернули весь проект. Полный аудит кода за неделю до сдачи обошёлся очень дорого.
А кодер-то позабавился, да. В полный рост. И, действительно, крайне странно, что заказчик не оценил такой шикарный юмор.
Комментарий для PastorGL:
Интересная история, конечно, но мне по-прежнему непонятно что она делает у меня блоге. Вам стоила, а мне не стоила, там такая ситуация была невозможно. А сейчас у вас история из разряда «не ковыряй в носу, у меня брат от этого умер».
Странный ваш коммент ещё и потому, что кажется, что вы считаете я не понимал что делаю или никогда не видел «кодовых баз жирных коммерческих проектов».
А уж то, что вы шутников сразу к стенке ставите с вызовом к начальству, чести вам не делает. Потому, что проблему надо хотя бы попытаться решить на своём уровне и начать с того, чтобы человек понял проблему. Если бы такой руководитель попался мне, ему либо пришлось измениться, либо я бы его уволил.
Комментарий для PastorGL:
Пока редактировал, испортил фразу. Должно быть «начать с разговора, чтобы человек понял проблему».