Архивы: по дате | по разделам | по авторам

Реверс-инжиниринг как стиль жизни

Архив
автор : Андрей Васильков   22.05.2003

Менталитет нации — вещь довольно условная и в то же время легко наблюдаемая. Западным народам ближе процесс созидания, восточным — наоборот, познание уже созданного.

Менталитет нации — вещь довольно условная и в то же время легко наблюдаемая. Западным народам ближе процесс созидания, восточным — наоборот, познание уже созданного. Россия (как всегда) находится на особом положении и в географическом, и в психологическом плане. С одной стороны, среди русских людей много творцов — талантливых программистов. С другой — не меньше исследователей, кодокопателей. Если с первой категорией все предельно понятно, то вторая всегда вызывала жаркие споры.

Обычно их называют крэкерами, гораздо реже — реверсами (соответственно от англ. crack — взлом и reverse engineering — обратная разработка, подразумевающая в данном случае восстановление алгоритма программы путем анализа скомпилированного выполняемого файла). Труду крэкеров посвящено множество статей. Писали обо всем: о моральных аспектах, защите программ и способах ее преодоления, забывая о главном — людях, которые за этим стоят. Если их упоминали, то лишь как источник проблемы, пресловутой «недополученной прибыли», фактор, тормозящий развитие программных продуктов. Между тем все далеко не так однозначно. Чтобы понять это, предлагаю вспомнить историю.

Девяностые годы прошлого столетия — время, когда персональным компьютером в нашей стране стало пользоваться действительно большое количество людей. Постепенно из символа достатка компьютер переходит в разряд повсеместно востребованных универсальных устройств. Народ осваивает относительно немногочисленное программное обеспечение, но, как обычно, в Европе, США и Японии процент умеющих работать на компьютере гораздо выше. Многим из наших соотечественников все равно не хватает денег, и о персоналке они лишь мечтают. Россия вновь пытается догнать Запад. По обе стороны границы полная стоимость владения ПК (Total Cost Ownership) в основном определяется стоимостью аппаратной части и установленного программного обеспечения. Причем «в цивилизованном обществе» последняя зачастую гораздо дороже первой. Догадались, к чему клоню? Благодаря отсутствию представительств иностранных софтверных компаний в РФ (либо их бездеятельности) и, главным образом, усилиям доморощенных кулибиных, народ активно стал пользоваться «альтернативными методами регистрации» ПО. Условно бесплатные программы после небольшой доработки становились просто бесплатными. Ознакомительные версии получали вторую, третью… сто двадцать восьмую жизнь после истечения срока действия. Местные лекари быстро научились избавлять заморский софт от синдромов триальности и баксофилии. Джон купил серийный номер для своей любимой программы, а Вася просто поменял в ней один байт. Если не видно разницы, зачем платить? Такой подход к делу стал общепринятой практикой. Так было и так есть. Нас же все больше пытались убедить в неправильности такого подхода. Дескать, не для того разработчик защиту в свою софтинку встраивал, чтобы крэкеры, потратив вечер на ее снятие, потом неделю смеялись над глупостью создателя программы в своих форумах и раздавали свежее «лекарство от жадности» всем желающим.

Время показало несостоятельность подобных убеждений. Давайте, наконец, признаемся сами себе в том, что отсутствие крэков сильно бы затормозило процесс компьютеризации в России. У нас просто никто не был готов отдавать приличные деньги за то, что нельзя пощупать руками1. Далеко не факт, что вы бы сейчас читали «Компьютерру», пойди события по западному сценарию. Но этого не произошло. День за днем крэкеров-одиночек становилось все больше. Они начали обмениваться опытом, объединять усилия, видеть друг в друге не конкурентов (как принято в кругах shareware-программистов), а партнеров, единомышленников. Возникли первые крэкерские группы. Социальная психология гласит, что возможности группы людей больше, чем просто сумма их усилий. Появились качественно новые свойства, присущие только сообществу: чувство единства, взаимопомощи, командный дух, а также условный рейтинг и стремление оказаться на его вершине. Это придавало группам дополнительные силы.

Все крэки можно разделить на следующие категории:
-  keygen (keymaker) — генератор ключей. Обычно аналогичен тому, что используется самим автором программы.
-  patch — выполняемый файл, результатом применения которого становится любое изменение программы. Вырезание из нее процедур защиты, их инактивация, удаление NAG-screen, принудительной задержки при запуске и т. д.
-  loader — загрузчик программы. Изменяет значения проверяемых параметров (например, текущую дату) на такие, при которых программа соглашается работать.
-  solution (патч-сырец) — описание в специальном формате или произвольном виде адресов заменяемых в программе байтов и их старых/новых значений. Соблюдение определенной структуры записи позволяет при помощи различных программ (solution processors) создавать из таких текстовых файлов готовые com-патчи.
-  комбинированные средства — например, patch и keygen. Как правило, используются для вскрытия хорошо защищенных программ, хотя это и не главное их свойство. Широко известен такой «лекарственный сбор» для почтовой программы TheBat!, в защите которой задействованы RSA-512, DES, MD5, CRC-16.
-  редко используемые виды.
Отдельно стоят файлы регистрации и серийные номера (s/n).

Дальше — больше. Появляются первые стандарты оформления результатов своего труда. Работать с крэками стало проще. Затем вводятся элементы поддержки пользователей и сопроводительная документация. В конце вычурно оформленного псевдографикой файла *.nfo проставляется контрольная сумма крэка, любая уважающая себя группа указывает тот или иной способ связи. Многие остерегаются проблем с законом, поэтому пишут минимум контактной информации. Коллективы крэкеров создают сообщества более высокого порядка, включающие в себя десятки людей, многие из которых никогда не видели друг друга. Они известны, пожалуй, не меньше, чем популярные спортивные сборные. Для многих реверс-инжиниринг стал именно видом спорта, постоянным соревнованием в изощренности ума с авторами платных программ. Что-то вроде шахмат — такое же стремление понять алгоритм противника, но только не ограниченное четкими рамками правил. Есть в нем и доля идеологической борьбы: многие реверсы считают, что, попадая на компьютер, программа становится его частью. Следовательно, владелец ПК имеет право делать с ней абсолютно все, что захочет (точнее — сможет), а не только разрешенные в EULA действия. Да и само лицензионное соглашение в высшей степени странно. Будучи по природе своей договором между конечным пользователем и автором программы, оно, вопреки здравому смыслу, носит директивный характер, не позволяя покупателю внести даже малейшие изменения. Это само по себе некорректно.

Не стоит обвинять крэкеров в нанесении авторам программ материального ущерба. Большинство из них прямо заявляет: «If you really like this program — buy it!» Создаваемые ими средства регистрации можно рассматривать как наглядный пример способов снятия защиты, как необходимый элемент обучения (методы обратной разработки применяются отнюдь не только для взлома чужих программ, но и для совершенствования собственных). И в таком качестве крэки являются законными программными продуктами. Мы же не считаем часы исключительно частью часовой бомбы. От самих реверсов приходилось слышать, что использование чужих серийных номеров аморально: «Ты не приложил никаких усилий. Взял и ввел чужой номер. Это сродни воровству и лишь воспитывает лень. Генераторы ключей, патчи, загрузчики — совсем другое дело. Они — плод чьего-то труда (в идеале — твоего собственного), самостоятельные программные продукты. И ты вправе использовать их, как заблагорассудится».

Обратите внимание: даже законные владельцы ПО, честно его купившие, сами нередко вынуждены пользоваться крэками. Например, из-за того, что автор программы перемудрил с защитой и привязал серийный номер к идентификаторам аппаратной части компьютера, а сам сменил адрес или вообще забросил поддержку своего творения. После апгрейда владелец такой программы вынужден ломать ее. У него просто нет иного выхода.
Непосредственное снятие защиты (применение крэка) обычно является задачей самого пользователя. Однако есть и другой вариант: «вылеченная» программа заново компонуется в инсталляционный пакет. Такой способ стал фирменным стилем, например, группы F.O.S.I.

Название группы часто является аббревиатурой, например: CORE (Challenge Of Reverse Engineering), DSI (DarkSide Incorporated), TBL (The Blue List), TMG (The Millennium Group), TNO (The Nameless Ones), TSRH (The Sabotage Rebellion Hackers). Либо просто запоминающимся словом, как у DAMN, EAGLE, TNT! и других.

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

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


1 (назад)Ситуация сохраняется и по сей день. Недавно наблюдал, как покупатель, увидев цену лицензионного дистрибутива, с удивлением, переходящим в возмущение, спросил: «Он что, на золотой болванке записан что ли?!» Лет десять назад продавца бы молча застрелили.

Несмотря на взаимопомощь, между группами иногда случаются маленькие конфликты. Например, EAGLE выложила в начале марта прошлого года программный файрволл ZoneAlarm.Pro.v.3.0.2.6 с регистрационным ключом, который был создан при помощи кейгена от группы uCF 2000. Причем выдала его за полученный своими силами. Впоследствии MackT из uCF решил поставить коллег на место и сообщил в несколько форумов интересный факт. Все ключи, выдаваемые его генератором, содержат «водяные знаки», созданные при помощи RSA-утилиты, написанной группой TMG. Если расшифровать любой ключ по приведенному им алгоритму, то в нем всегда будут три байта, которые в ASCII соответствуют буквам «FCu». После «реверсирования» получаем «uCF» — название группы. Образец в комплекте от EAGLE тоже содержал эти три байта. К слову сказать, сами сотрудники фирмы Zone Labs — авторы файрволла — не могли тогда отличить свои ключи от созданных при помощи этого кейгена.

Не удержусь от соблазна и напишу еще немного про этот знаменитый образчик реверсивной мысли. Он стал известен не столько благодаря скандальной истории, сколько благодаря дизайну (рис. 1). Окно генератора выполнено в виде ключа, зубцы которого образуют надпись uCF. В верхней части волной движется бегущая строка с благодарностями, а розовые точки попеременно образуют различные фигуры, вращающиеся в трех плоскостях. Все это буйство фантазии сопровождается довольно оригинальной музыкой, умещается в 49,5 Кбайт кода и способно работать в двух режимах (с видео/аудиоэффектами и без них).

Зачастую деятельность группы не ограничивается написанием крэков. Многие из них пишут софт для профессиональных целей и сопутствующие программы. Я уже упоминал об RSA-tool от TMG, теперь расскажу про другое замечательное творение — DAMN Hash Calculator. Не секрет, что файлы одинаковой длины могут содержать абсолютно разные данные. Этим иногда пользуются авторы shareware-программ, чтобы усложнить жизнь взломщикам: немного меняют программу и выкладывают ее на сайте без изменения номера подверсии. В результате крэкеры, обсуждающие обход защиты в программе, могут (сами того не подозревая) работать с разными exe-файлами. Дабы избежать подобных недоразумений, было введено использование hash-функций как обязательной характеристики файла. Хэш-функция — это обработка данных по определенному алгоритму, в результате выполнения которого на выходе получается битовая комбинация фиксированной длины. DAMN Hash Calculator позволяет рассчитывать двенадцать хэш-функций. Для нужд реверс-инжиниринга обычно используется функция MD5. Она выступает одновременно в качестве идентификатора и контрольной суммы файла. На выходе генерируется 32-символьная комбинация, которая уникально определяет файл (насколько я помню, вероятность совпадения оценивается как 264). Поскольку функция MD5 однонаправленная, ее подделка — практически неосуществимая задача.

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

Первый путь самый очевидный: принять вызов и сделать защиту так, чтобы проще было купить программу, чем ломать. Адекватная ценовая политика и специальная стоимость лицензии для жителей бывшего СССР еще больше будут способствовать коммерческому успеху программы. Насчет усложнения задачи, IMHO, стоит поучиться у фирмы ABBYY. Создав более трехсот билдов пятого FineReader’а, она внесла путаницу и усложнила процесс совместного взлома. Вопреки общепринятой практике в главном exe-файле оказалась только общая часть GUI, а все системные и прочие функции были реализованы через dll. Красивое решение — универсальная процедура вывода MessageBox’а. Если ее убрать, то ликвидируются все сообщения в программе. Дизассемблерный листинг получается размером около 50 Мбайт, так что желание его анализировать сразу пропадает. Плюс для нужд регистрации из реестра реально читается только один ключ. Все остальные — мусор для отвода глаз2. Но самая оригинальная, на мой взгляд, идея — отсроченная смерть взломанной программы. После взлома внешне все работает, а через N дней программа внезапно перестает делать сущий пустяк — сохранять распознанные документы. Получается демо-версия чистой воды. К этому времени «лекарством» вовсю пользуются другие, не подозревая, что их счастье тоже мимолетно. Именно поэтому для FR созданы десятки разных крэков и большая часть из них действует лишь ограниченное время.

Другой путь — постоянная перепроверка программы на наличие изменений. Например, можно внедрить в модули обновления процедуру сравнения текущей контрольной суммы главного exe-файла с эталонной. Близко к этому стоит проверка легальности копии при обращении за техподдержкой. Нечто подобное реализовано в системе «Консультант». Без обновлений электронный справочник быстро теряет свою актуальность, а со взломанными версиями программ апдейты не дружат.

Еще один перспективный способ — предоставление программы как услуги, а не продукта. Например, платные онлайновые переводы с одного языка на другой, а не продажа программ-переводчиков. «Если программа запускается, она может быть взломана» — гласит аксиома. Почему бы не убрать (на стороне клиента) саму программу? Тогда ломать будет нечего.

Помимо shareware есть еще множество вариантов распространения своего продукта. Например, donationware. Суть в том, что пользователю предоставляется возможность (а не обязанность!) отблагодарить автора программы, если она ему понравилась. Насчет России ничего лестного сказать не могу, но во многих странах, по словам самих программистов, идея прижилась. Люди осознали, что если не поощрять создателя проекта, то последний рано или поздно исчезнет. Не будет никаких сервис-паков и следующих версий, поддержки новых форматов и т. п. Расставаться с милой сердцу софтинкой хочется меньше, чем платить. Поэтому приходится перечислять автору энную сумму. Причем, чему равно N, пользователь решает сам. Хочется верить, что и у нас такая методика окажется жизнеспособной. Носим же мы друг другу пиво за услуги, не обговаривая заранее объем и сорт напитка.

Если же коснуться законодательства, то оно всегда было несовершенным. Расплывчатые формулировки, медлительность принятия законов, противоречия одних актов другим часто приводили в замешательство при попытке разобраться с юридическими аспектами в вопросах реверс-инжиниринга. И все же обращу ваше внимание на одно обстоятельство: дизассемблирование (aka декомпилирование) программы по отечественному законодательству не носит противоправный характер, если осуществляется в соответствии с п. 2 ст. 25 Закона РФ «Об авторском праве и смежных правах». В соответствии с ним лицо, правомерно владеющее экземпляром программы для ЭВМ, вправе без согласия автора или иного обладателя исключительных прав и без выплаты дополнительного вознаграждения воспроизвести и преобразовать объектный код в исходный текст3. К слову, во время trial-периода пользователь правомерно владеет экземпляром программы… дальнейшие выводы сделайте сами4.

«Вы не задумывались, почему под Linux почти все программы бесплатны? Конечно, все дело в принципах Open Source, но не столько философского, сколько технического характера. Главное отличие Linux от прочих OS — в доступности исходного кода. Это делает написание защиты под Linux просто кошмаром. Будучи автором программы, вы не можете быть уверены, что функция strcmp из стандартной C run-time library — это действительно strcmp, а не ее измененный эмулятор. Вы не можете доверять ничему в такой операционной системе, так как из-за доступности исходного кода любая ее часть может быть модифицирована крэкером для взлома программы, включая такие важнейшие компоненты, как ядро и run-time library. Ваше творение будет работать в самой агрессивной среде, какую только можно себе представить».
Red Plait (redplait@usa.net), «Обзор защит программного обеспечения под Linux»

В заключение хотелось бы отметить одну современную тенденцию в мире реверсов — обучение. Стремительно набирают обороты специализированные сайты, форумы, мэйл-листы, IRC-каналы, в которых опытные профессионалы готовы без насмешек, терпеливо объяснить новичкам основы своего дела. Это удивляет, потому что крэкеры постоянно страдают от недостатка времени. В тоже время — радует, ведь обучаемому приходится познать ассемблер, понять структуру программ и т. п. В результате значительно повышается общий уровень, то есть решается задача, с которой не справляются школьная и вузовская информатика и специализированные курсы.

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

Благодарю всех, кто так или иначе помогал мне в написании статьи. Отдельное спасибо Сергею Близнюкову за присланный материал.


2 (назад) W&Z: «ABBYY Fine Reader — protect & crack».
3 (назад) Серго А.Г. «Хакер и Закон» © Hackzone.
4 (назад) Тут автор несколько передергивает, публикуя только малую часть статьи из закона, и опуская части, кардинально меняющие смысл статьи. Обеспечение работы программы после истечения срока действия trial-периода, снятие защиты с целью избежания авторских выплат и т. п. — все эти цели совершенно не подходят под случаи, описанные в законе. И уж явно противоречат ч. 3 ст. 25, очевидно ущемляя законные интересы автора. Это обсуждалось уже неоднократно, в том числе и в «КТ», например, во время шумного скандала «Macromedia vs. Иванопуло» (см. «КТ» #293). Подобная ситуация наблюдается в авторском законодательстве большинства стран. — Михаил Генин.

© ООО "Компьютерра-Онлайн", 1997-2022
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.