По мотивам #ozohht
Вот забавно понаблюдать за эволюцией методов защиты кода. Вначале разработчики вообще не заморачивались этим, и довольствовались банальными проверками серийного номера, или комбинации имени и серийного номера. Потом стали появляться различные вариации на ту же тему (возможно, кто-то из олдфагов еще помнит штуки вроде "для перехода на следующий уровень введите третье слово из пятой строки сверху с семнадцатой страницы бумажного мануала"). Хотя, гм, олдфаги на пстаче... Wait...
Очевидно, что несостоятельность подобного подхода была доказана сразу же, когда толпы кулхацкеров, вооруженные сочинениями своих более зрелых собратьев на тему "как быстро поставить брейкпойнт на MessageBox и пропатчить джамп, ничего не зная об ассемблере", кинулись отбирать кровно заработанные деньги у авторов. Но даже сейчас можно встретить наивных любителей изобретать велосипеды, не слышавших слова дизассемблер, и считающих, что их минет чаша сия. Иногда они задерживались надолго даже в крупных конторах — j3qq4-h7h2v, евпочя.
Такая ситуация, конечно, пришлась разработчикам не по нраву, и они на время закрылись в своих лабораториях, родив очередное гениальное решение — привязку к железу. Казалось бы — отличное решение: программа генерирует на базе неких параметров пользовательского компьютера ключ, из которого девелопер генерирует серийный номер. Все довольны, ведь теперь Вася не сможет передать свой номер Пете — для него он будет бесполезен. Но и тут свою роль сыграла природная лень большинства авторов прикладного софта — они не хотели глубоко копаться в этих страшных непонятных системных штуках, и выбирали для привязки наиболее доступные их пониманию параметры. Чаще всего таковыми становились дата bios (не вздумай обновить прошивку, юзер!); серийный номер раздела жесткого диска (что?! после форматирования он меняется?! мы не зна-а-али); объем памяти, размер диска (ведь вам не нужно так уж часто делать апгрейд, правда?).
Пользователи начали замечать что-то неладное, а потом взвыли — ведь теперь после любого изменения конфигурации какая-то из программ могла перестать работать. И плевать бы на этих юзеров, кому они нужны, но не сладко пришлось и самим разработчикам — им приходилось теперь постоянно генерировать новые серийные номера. Да и хацкеры не дремали, ведь отламывать подобные защитные механизмы было хоть и сложнее, чем править джампы, но не намного.
И тогда сумрачный гений копирастии, подстегнутый достаточной мотивацией, смог родить принципиально новое решение — аппаратные защитные ключи. На них переносили некоторые критичные данные — от нескольких нужных для работы программы байт до важных защитных кусков кода. Младшее поколение кулхацкеров недоуменно покачало головами и ушло учить уроки; старшее же с энтузиазмом взялось за решение новой задачки.
Как обычно, минусы нового подхода не заставили себя долго ждать. Производство ключей ведь тоже стоило денег, и для пятидолларовых shareware-поделок Васи Пупкина не годилось совсем. Да и для взлома было достаточно заполучить в руки (скардить, купить, украсть) один рабочий экземпляр, и все усилия по защите шли прахом. Потому сейчас очень редко где можно встретить такое — я видел только на паре юридических баз данных и одной узкоспециализированной медицинской софтине, например.
Тут разработчики наконец-то подошли к осознанию Первой Важной Истины — "не стоит усложнять взаимодействие пользователя и защиты, это тупиковый путь; нужно затруднить понимание работы защитного механизма взломщиком". А что для этого нужно сделать? Правильно, как-то зашифровать код. И тысячи обезьянок принялись думать...
Но даже здесь ленивые прикладники решили схалтурить. "Шифрование? это ведь так сложно, нужно понимать, как работает загрузчик, во что превращает код компилятор"... И воспользовались они тем, что уже было создано немного для других целей — упаковщиками исполняемых файлов. Брали они какой-то мейнстримовый upx, паковали им программу, и считали дело сделанным — хацкер открывал файл в дизассемблере, не находил их код, разводил руками и уходил ни с чем.
Идиллия закончилась быстро. Однажды кто-то из хацкеров, придя из школы, случайно набрал upx /?, и научился распаковывать их программы совсем без усилий. Такова печальная судьба ленивых.
Но копирасты не сдавались, и начали запиливать специализированные пакеры без встроенной функции распаковки, одним из самых популярных на просторах снг стал aspack. И тогда старшее поколение хацкеров, еще не забывших, что такое ассемблер, придумали новое секретное оружие — дамперы. Программа запускалась, распаковывала себя в памяти, и тут же дампер ловил ее и сохранял рабочий образ на диск.
И лишь тогда некоторые разработчики осознали Вторую Важную Истину — изобретение велосипедов без знаний в механике до добра не доведет; и поручили разработку защитных систем специальным людям, которые не шарахались от слов "секция данных", "самомодифицирующийся код" и тд. А они в свою очередь сразу поняли, что код распаковщика нужно сделать недоступным для понимания среднестатистического хацкера. С этого момента игра началась всерьез.
Развитие защитных механизмов пошло в двух направлениях — противодействие статическому и динамическому анализу.
Первое предназначалось, очевидно, для того чтобы открывший файл в дизассемблере хацкер испугался и тут же его закрыл. Начинали они с простых штук типа перекрывающихся инструкций, вставки в код мусора и тд. Но добились исключительно отсева "неусидчивых", остальным же не составляло труда пролистать такие штуки. Или написать скрипт, который за них это сделает.
А вторые были нацелены против тех хацкеров, которые умели ставить брейкпойнты в отладчике, находили oep и дампили расшифрованную программу на диск, не парясь по поводу анти-статических механизмов. И заполнились все тематические форумы описаниями "анти-анти-анти-антиотладочных приемов". Чего только не придумывали — и контроль времени выполнения по rdtsc, и попытки вводить отладчик в ступор киданиями эксепшнов, игрой с флагом трассировки... Но на каждый хитрый прием всегда находился "анти-прием с винтом".
А тем временем антистатические механизмы тоже не стояли на месте — начались робкие попытки впиливания виртуальной машины в код протектора; все чаще и чаще звучало на тематических конференциях страшное слово "обфускация". Копаться в таком мало кому нравилось, потому это осталось уделом единиц энтузиастов; остальные же бросили все усилия на динамический анализ.
Уловив этот тренд, разработчики защит сфокусировали внимание на противодействии дамперам. Сначала придумали просто стирать из памяти данные, нужные для загрузки программы, но уже не нужные на этапе выполнения — секцию импортов, например; хацкеры ответили на это простой в своей гениальности софтиной под названием IMPort REConstructor. Копирасты начали расшифровывать код кусками, храня одномоментно в памяти лишь часть программы, чтобы сдампить ее целиком было нельзя — хацкеры научились отлавливать эти куски и дампить по частям...
Это было "золотым веком" защитных систем. Asprotect, невероятно популярный на территории снг; armadillo, дырка в ключевом алгоритме которого долгое время была известна только одной команде; execryptor, в котором впервые была реализована действительно оригинальная и качественная виртуальная машина и которым пугали детей...
А закономерной вершиной этой эволюционной лестницы стала идея переносить в виртуальную машину не только код протектора, а программу целиком. Так убивались сразу оба зайца — достаточно хорошо обфусцированный код виртуальной машины изучать "статически" становилось нетривиальной задачей, а без этого понять принцип работы алгоритмов защиты невозможно; а дамп образа распакованной программы из памяти тоже не помогал — внутри ведь не оставалось ни байта оригинального кода, сгенерированного компилятором, был лишь параноидальный выхлоп виртуальной машины.
Так вот, к чему я все это написал. После прочтения указанной в верхушке поста статьи я задумался о будущем программирования. Уже сейчас код, грамотно накрытый тем же vmprotect, например, автоматически проанализировать практически невозможно, как бы нас в этом ни пытались убедить разработчики антивирусов. Да и ручной анализ на поток поставить совсем не просто. И с каждым годом эта тенденция усиливается.
К чему это приведет в итоге? Во-первых практически исчезнет reverse engineering, как явление. С ним исчезнет куча возможностей — нельзя будет проводить аудит кода, проверять его на наличие бекдоров, писать швабодные реализации для разных проприетарных штук, жизнь антивирусов невероятно усложнится etc. Во-вторых бОльшая часть ресурсов компьютера будет расходоваться вхолостую на работу этих защитных механизмов. Попробуйте представить себе фаерфокс, помещенный в обфусцированную виртуальную машину типа вмпротектовской. Мне страшно, а вам?
Cthulhu
03.11.2011 21:45 Miranda
Do you really want to delete ?
а мне не страшно, мне опенсорсного софта хватает.
ну а для остальных уже выпилили говорят хром с нативной песочницей.
Ты воистину очень неприхотлив, если тебе на самом деле хватает опенсорсного софта.
Наркоман штоле фурифокс в виртуальной машине исполнять?!
А вообще, при желании и разламывание виртуальных машин можно при желании на поток поставить. Тот же execryptor, если мне не изменяет память, сейчас может "взломать" любой школьник, скачав с какого-нибудь кулхацкерского сайта распаковщик.
Я сам года 4 назад ковырял подобного класса защиты. В принципе, ничего особо трудного в них нет (ну или тогда не было), просто требуется больше усидчивости и соображалки для расковыривания сего ужаса.
Так что RE никуда не исчезнет.
А вот жизнь антивирусов усложнится, да. Похоже, разработчикам операционных систем и прикладного софта придётся начинать писать грамотный код с разделениием привелегий и прочими обвязками и ограничениями... И в результате будут все программы исполняться в отдельных виртуальных машинах.
В общем, да. Пичяльное будущее нас ждёт.
Ненене, в execryptor виртуальной машиной накрыт только код протектора. И там можно теоретически запилить распаковщик, конечно, потому что есть что распаковывать. Я же писал про защиты типа vmprotect, в которых распаковывать собсна нечего — от оригинального кода программы ничего не осталось, все транслировано в наркоманскую vm с контролем целостности байткода, кучей избыточной фигни для отвлечения внимания etc. Могу скинуть пример, если интересно. И вот там тоже, конечно, можно собраться толпой и сделать обратный транслятор, но это уже совсем другого уровня задача. А потом PolyTech (или кто там щас главный у них) сделает новую версию, и все начнется сначала.
Я понял о чём ты. Я execryptor не сильно копал: так, однажды тыкнулся, понял, что оно того не стоит и забил.
vmprotect не видел, но наслышан.
А вообще, грамотная защита с аппаратным ключом почти не подлежит взлому: например, засовываем десяток не очень часто используемых и не очень медленных алгоритмов на аппаратное устройство, заливаем ему внутренности эпоксидкой и 99,9999999% кулхацкеров будут сосать различные части тела всё это сделавшего и никакой RE не поможет в случае нетривиальных алгоритмов.
Если это, например, сделать для игрушек, то можно достаточно легко поставить на поток.
Вот буквально не так давно видел нечто подобное: крайне порадовало. Чуваки запихали аппаратную реализацию AES-256 на флешку и гоняли через неё запросы на сервер. Спасло только то, что они поленились и не закрыли доступ к ROM, в результате удалось вытащить код и ключ. А если бы не эта дырка, то потребовалось бы оборудование на очень дохуя денег, чтобы разобраться что оно там делает.
Ну да, тогда придется вытащить протокол связи с ключом, погонять его как "черный ящик", собрать статистику запросов-ответов и посадить хорошего криптоаналитика подумать. Но все равно такое годится только для достаточно дорогих продуктов.
Это вполне годится для массовых продуктов со стомостью 500+ рублей.
Не буду спорить, я слабо представляю точную цифру, во сколько щас обойдется такой "залитый эбокситкой" ключ.
Но опять же. Разрабатывать защиту отдельно для каждой игрушки — всяко не окупится; разработать один раз и юзать для всех своих продуктов — окупится, но ее так же раз и навсегда сломают.
Вот потому так практически никто и не делает сейчас, собсна.
В розницу я их видел около 300 рублей.
А раз и навсегда сломать криптографическую защиту с разными ключами, ИМХО, задача крайне непростая.
Годно.
> для перехода на следующий уровень введите третье слово из пятой строки сверху с семнадцатой страницы бумажного мануала
Sierra же.
Олсо, вывод — хуита.
ты и Cthulhu с античатов — одно лицо или разные люди?
разные.
а, ок. больно ж у вас стиль изложения похожий
Историю описал хорошо, на уровне, даже почти добираясь до обобщённого рассмотрения действующих социальных групп. А вот в выводе прогноза скатился к какому-то неосиляторскому частному случаю и нарисовал из него какие-то печальные предсказания. Куда делись копирасты, стремящиеся защитить код? Никуда. Куда делись либерасты, вскрывающие эти защиты? Тоже никуда. Соотношение сил остаётся тем же; почему это вдруг вторые начнут проигрывать? То, что у первых на время появился некий технический козырь — ничего не значит, именно этому нас учат многочисленные примеры из истории. Найдут лазейку, взломают, обойдут. Здесь вопрос только в соотношении сил — а поводов измениться ему не видно.
В общем: не убедил, но за историю спасибо.
Угу, именно так.
ППКС
А вообще не переживай, квантовые компы на подходе ;)
Меня твои истории уже просто доебали, я не могу их слушать. Одна история охуительней другой, просто. Про защиту кода. Про какую-то хуйню, шифрование. Чё ты несешь вообще? Ты можешь заткнуться? Реверс, блядь, инженеринг. Чего, блядь? Про что несешь? Вообще охуеть.
ебать, межик. Да ты не осилил. Надо было курить перед этим, а не на чистую голову читать
да и не читал, лол. смотрю кто-то не осилил микроблоги и черезчур срет пастой мне в жаберки
Шел бы ты отсюда.
NO U
нет, вы оба
откуда ты знаеш что нас двое?
я умею считать, да