Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Что-то не вижу — быть или не быть?

Программа, выводящая монолог Гамлета (19.86КиБ)
Так выглядит программа, выводящая монолог Гамлета

Слово «выглядит» в подписи ко скриншоту выше упомянуто неслучайно — программа написана так, что видимое — только надводная часть айсберга.

Уже в те далёкие времена, когда я только ещё начинал писать на ДжаваСкрипте, программисты на форумах задавались вопросом можно ли как-то защитить свои программы на этом языке от обратной разработки. Помню «Микрософта» в своём браузере позволяла шифровать исходный код, но эту «защиту» довольно быстро поломали, очень уж она была простая.

Позже, когда производительность интерпретаторов ДжаваСкрипта стала стремительно повышаться, появились всяческие обсуфкаторы, сильно запутывающие программу за счёт удаления форматирования, внесения шума, замены имён переменных и функций и сжатия по словарю поверх всех замен.

С тех пор эти инструменты застыли примерно в том же состоянии, но теперь, мне кажется, в этом деле наметился прорыв.

Некто ФейкЮникод, разместил скрытое послание внутри суррогатных пар Юникода. Я когда-то делал что-то похожее на пробелах нулевой длины, но моим способом сильно не разбежишься — алфавит маленький.

Что такое суррогатные пары расписывать не буду, статей на эту тему предостаточно, главное, что их не видно и они могу быть частью (кроме первого символа) любого идентификатора ДжаваСкрипта.

Я попробовал использовать способ с суррогатными парами, чтобы скрыть монолог Гамлета внутри программы на ДжеЭсФаке (способ написания программ на ДжаваСкрипте, когда не используются алфавитно-цифровые знаки), плюс этими же парами закодировал имена переменных.

Получилась адская обфускация, глядя на которую и не заподозришь, что она после запуска выведет в консоль полтора килобайта английского текста.

16 комментариев
zg (zg.livejournal.com) 2017

в чём заключается прорыв?

Евгений Степанищев (bolknote.ru) 2017

Комментарий для zg.livejournal.com:

Я думал это очевидно. В том, что код можно прятать так, что подавляющее большинство людей и не догадаются поискать.

zg (zg.livejournal.com) 2017

Комментарий для Евгения Степанищева:

а что, те кто реверсят джаваскрипт, делают это вручную? я предполагаю, что как минимум для начальной обработки используется какой-то инструмент, который форматирует, идентификаторы переименовывает и т. д.

Евгений Степанищев (bolknote.ru) 2017

Комментарий для zg.livejournal.com:

Так и есть :) Но в данном случае обфускацию можно устроить так, что она и заметна-то не не будет. Вот у меня в примере (в монологе «Гамлета») все переменные как будто бы называются одинаково, а значимый текст спрятан «между строк».

Теперь уберите факджээс, представьте себе обычную программу, где на первый взгляд всё нормально — никакой обфускации. Никто же в таком случае деобфускаторы не запускает. Но на деле часть программы спрятана, а некоторые переменные называются так же. Если не вглядываться, то ничего не заметно, если вглядываться, то неясно как работает. Думаю большинство вглядываться не будет.

Впрочем, все эту уловки, скорее всего, не нужны будут, когда в бразузеры строят средства для защиты контента. Думаю защищать можно будет не только аудио и видео, но и код.

zg (zg.livejournal.com) 2017

Комментарий для Евгения Степанищева:

один раз анализ займёт больше времени, возможно. типичное security through obscurity. в чём прорыв-то?

PastorGL 2017

Есть на свете другие браузеры, кроме Хрома и ФФ.

В Эдже весь этот мусор из кусков суррогатных пар вполне заметен. Особенно в оригинальном твите (его там разносит в полную порнографию).

Евгений Степанищев (bolknote.ru) 2017

Комментарий для zg.livejournal.com:

один раз анализ займёт больше времени, возможно. типичное security through obscurity. в чём прорыв-то?

Для меня любое движение после застоя — прорыв. Тут как раз движение после застоя.

Евгений Степанищев (bolknote.ru) 2017

Комментарий для PastorGL:

В Эдже весь этот мусор из кусков суррогатных пар вполне заметен.

А вот это уже гораздо печальнее :(

Евгений Степанищев (bolknote.ru) 2017

Комментарий для zg.livejournal.com:

один раз анализ займёт больше времени, возможно.

Давайте пофантазируем. Предположим вы никогда не знали о такой возможности. Смотрите на скрипт, который откуда-то скопирован и вам надо кое-что в нём поправить, но вы в упор не видите в нём того места, которое надо править. Какая следующая мысль — «о, тут зашифровано что-то в суррогатных парах» или «чёрт, наверное не всё скопировал, но что-то не вижу где остальное»?

Вкупе с остальными методами этот мог бы серьёзно поднять стоимость обратной разработки. Мог бы, если бы не Эдж.

zg (zg.livejournal.com) 2017

Комментарий для Евгения Степанищева:

я бы посмотрел содержимое в хексе.

Евгений Степанищев (bolknote.ru) 2017

Комментарий для zg.livejournal.com:

Вспоминается случай, когда я как-то в середине нулевых сунул в код фреймворка, который мы тогда писали, юзерпик, раскиданный в виде кодированных строк (никаких суррогатных пар, просто комментарии в base64, раскиданные тут и там в коде) и максимально запутанный (не обсусцированный, а просто использующий всё редкое и неочевидное, что есть в ПХП) код, который его собирает и выводит по определённому урлу. Так его несколько лет в коде не замечали, пока я не выдержал и сам не показал.

Где-то в блоге я об этом рассказывал немного, не смог найти, к сожалению.

PastorGL 2017

Комментарий для Евгения Степанищева:

Вот по-честноку, если мне в коммерческом коде попадаются подобные приколы, я ставлю шутника к стенке. С вызовом к начальству, выговором, и всем, что полагается. Потому что ну ни разу не смешно поддерживать код с дополнительным пэйлоадом, насколько бы безобидным он ни был. Потому что рано или поздно любая закладка проявит себя, и это обязательно будет неудобный момент.

Вообще, при поддержке кодовых баз жирных коммерческих проектов любое отклонение от конвенций воспринимается однозначно как жуткое неуважение к коллегам, даже саботаж. Не в интеллектуальные игры играемся, а деньги зарабатываем. В хобби-проекте ты, конечно, хоть на голове ходи, но в отчуждаемом коде будь добр, следуй конвенциям.

Евгений Степанищев (bolknote.ru) 2017

Комментарий для PastorGL:

Какой-то странный комментарий. Ну спасибо что поделились что ли.

PastorGL 2017

Комментарий для Евгения Степанищева:

«Странный комментарий», говорите. Ну-ну.

когда я как-то в середине нулевых сунул в код фреймворка, который мы тогда писали, юзерпик, раскиданный в виде кодированных строк
... и максимально запутанный код

Мне однажды похожая «шутка» стоила срыва крупного milestone. Ревьюеры со стороны заказчика нашли в коде хитро упрятанную песенку, и завернули весь проект. Полный аудит кода за неделю до сдачи обошёлся очень дорого.

А кодер-то позабавился, да. В полный рост. И, действительно, крайне странно, что заказчик не оценил такой шикарный юмор.

Евгений Степанищев (bolknote.ru) 2017

Комментарий для PastorGL:

Интересная история, конечно, но мне по-прежнему непонятно что она делает у меня блоге. Вам стоила, а мне не стоила, там такая ситуация была невозможно. А сейчас у вас история из разряда «не ковыряй в носу, у меня брат от этого умер».

Странный ваш коммент ещё и потому, что кажется, что вы считаете я не понимал что делаю или никогда не видел «кодовых баз жирных коммерческих проектов».

А уж то, что вы шутников сразу к стенке ставите с вызовом к начальству, чести вам не делает. Потому, что проблему надо хотя бы попытаться решить на своём уровне и начать с того, чтобы человек понял проблему. Если бы такой руководитель попался мне, ему либо пришлось измениться, либо я бы его уволил.

Евгений Степанищев (bolknote.ru) 2017

Комментарий для PastorGL:

и начать с того, чтобы человек понял проблему.

Пока редактировал, испортил фразу. Должно быть «начать с разговора, чтобы человек понял проблему».