Armadillo: защити свою программу от взлома. Часть 1

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

Я не собираюсь посвятить эту статью assembler'у и всяким низкоуровневым хитростям, методикам работы с отладчиком, распаковщиками и прочим специализированным софтом. Я уверен, что, если вы никогда не занимались ничем подобным, то вряд ли, прочитав пяток-другой статей по этой тематике, сможете создать защиту для вашей программы, способную противостоять опытному взломщику более 5 минут. Я полагаю, что, если у вас есть отличная идея, то вы должны сосредоточиться на ее полировке, может быть, ее реализации на каком-то из высокоуровневых языков программирования: visual c++, delphi… Что касается вопроса защиты ПО, то пусть лучше этим занимаются специалисты. Вы не первые, у кого возникает подобная потребность, и рынок давно сориентировался, предоставляя наборы высокоуровневых библиотек или специальных систем, играющих роль "сейфа" для вашей программы. С другой стороны, как раз эти программные комплексы становятся одной из целей всевозможных взломщиков. Верх идиотизма в этой ситуации, когда на пиратских сайтах можно найти кряк для программы, с помощью которой планируется защищать другой софт. Доступны специализированные пиратские утилиты, целью которых является взлом ЛЮБЫХ защищенных с помощью некоторой библиотеки программ. Имеет ли смысл вообще полагаться на такие универсальные защитные системы или стоит разрабатывать что-нибудь свое? Ни то, ни то решение не является идеальным. Большей частью подобные универсальные "взламыватели" срабатывают для программ, разработчики которых не удосужились проштудировать справку и решили, что, нажав одну большую кнопку "защитить", они решат свои проблемы. Грамотная защита должна быть комплексной, существует ряд методик, заточенных под конкретные программы защиты, и эти методики следует применять, комбинируя между собой.

Одна из самых лучших систем защиты, о которой я сегодня и расскажу, — это SoftwarePassport/Armadillo Software Protection System. Последняя версия: 5.0 вышла этим летом. Домашний сайт проекта: сайт Разработчики позиционируют armadillo как средство буквально за пять минут добавить систему защиты/лицензирования для ваших программ. Приятно, что авторы честно признаются в том, что armadillo пару раз уже была взломана, но ведется постоянный мониторинг пиратских сайтов, и оперативно выпускаются исправления. Armadillo может защищать 32-разрядные исполняемые файлы, также файлы dll, ocx, файлы screen saver. Не умеет защищать 16-разрядные приложения (это меня нисколько не огорчило — времена DOS безвозвратно ушли в прошлое), также не умеет защищать файлы office, базы данных (а это уже хуже). Таким образом, если вы написали программу- справочник, например, телефонов, то можете защитить исполняемый файл программы, но файлы с данными, ту же телефонную базу — нет. В этих ситуациях рекомендуется использовать всякие хитрые методики с расшифровкой на лету (в оперативную память) файлов с данными. Также невозможно защитить .net-программы, т.к. они исполняются средой .net framework. В этом случае рекомендуется выделить из вашей программы специальную библиотеку dll, в которой находится набор критически важных функций, и защитить с помощью armadillo именно эту библиотеку, без которой сама программа, естественно, работать не будет. С помощью armadillo можно защитить даже такие приложения, как сервисы.

Выпускается две версии armadillo: basic и professional editions. Различий между ними не так уж много: в версии professional больше возможностей работы с аппаратными ключами, поддержка передачи лицензий, больше возможностей управлять временем работы программы, ключа, количеством запусков по сравнению с basic-версией. В основе своей обе версии armadillo используют одинаковый способ защиты вашей программы. Прежде всего, программа шифруется с помощью некоторого секретного ключа, сам ключ помещается в специальное хранилище, которое и защищается armadillo. Если указать неверный ключ, то после расшифровки программы взломщик получит "мусор". Также файл программы сжимается — это дает еще один уровень защиты от взлома плюс, если вы планируете распространять программу через Internet, это позволит вам экономить немножко денег на трафике. Ключи, которые вы рассылаете клиентам, могут быть похищены и выложены на каком-нибудь пиратском сайте. В таком случае вам необходимо оперативно это отследить и добавить похищенный ключ в специальную базу Stolen Codes Database. Когда вы выпустите новую версию программы, к ней уже не подойдут те ключи, которые вы поместили в черный список. Если пираты не могут похитить ключ для программы, они могут создать для нее "патч" — например, аккуратно вырезав из программы часть кода, которая проверяет корректность введенного ключа. Надо сказать, подобный способ взлома является одним из наиболее популярных. Например, вы решили создать собственную систему защиты, проверяющую введенный в диалоговом окне пользователем ключ доступа, и, если код совпадает с некоторым значением, то программа продолжает работу, иначе же аварийно завершается. Так вот, путем несложной замены пары байт в двоичном коде программы можно изменить условие проверки на противоположное, и любой неправильный код будет принят за верный. Для защиты от этого armadillo контролирует целостность и неизменность кода программы и своей защиты. В случае модификации выводится сообщение, что программа была модифицирована, и ее запуск блокируется. Также популярный способ взлома основан на возврате системных часов назад. Так, если у вас есть лицензия на программу до 1 июня, то после истечения этой даты, вернув часы на месяц назад, вы снова получаете рабочую программу. С armadillo этот фокус не пройдет. Один из наиболее надежных способов защиты — custom build. Его задача — защита от универсальных взломщиков. Идея в том, что после покупки armadillo вы можете запросить для себя ее custom build версию. Возможности ее абсолютно идентичны возможностям "обычной" версии armadillo, но сам код системы защиты расположен немного по-другому, что резко повышает сложность взлома вашей программы. По крайней мере, до тех пор, пока она не станет настолько популярной, что для нее создадут специализированный "взломщик", а не будут пытаться обойтись универсальным. Система защиты armadillo активно использует понятие сертификата. Сертификат служит не только для защиты программы, но и для контроля правил ее использования. Например, вы можете ограничить время использования программы (т.е., по сути, реализовать основную идею shareware: попробуй, и, если понравится, можешь купить). Также можно ограничить максимальное количество раз ее запуска.

Давайте перейдем к практике и попробуем защитить, например, стандартный калькулятор windows. Для этого я сделал его копию и запустил SoftwarePassport (Armadillo Classic Interface). Прежде всего, необходимо создать новый проект: File -> New Project, после чего вы в появившемся диалоговом окне должны указать параметры будущего проекта (см. рис. 1). Прежде всего, укажите название проекта и его версию. Версия нужна для того, чтобы можно было создавать особый вид сертификатов, действующих на протяжении некоторого времени планируемых обновлений программы. Например, сертификат, ключи которого подходят для всего семейства версий, скажем, 4.1, 4.2… 4.10. На следующей закладке настроек проекта вам следует указать, какие файлы должны быть защищены: в дополнение к основному исполняемому файлу проекта вы можете указать еще пять вспомогательных файлов — например, библиотек dll. Закладка language отвечает за возможность добавления функций многоязычной поддержки. Если вы создаете ПО, распространяющееся не в англоязычных странах, возможно выполнить перевод всех сообщений, которые показывает armadillo во время своей работы. Следующая закладка — Splash Screen1 — служит для управления splash-окном, которое выводится во время загрузки программы. После того, как вы запустили защищенную с помощью armadillo программу, выполняется ее дешифровка и распаковка. Во время этого процесса armadillo отображает специальное splash-окно c надписью: "мол, подождите, идет загрузка". Вы можете заменить эту заставку своей и даже создать несколько заставок, отображающихся в зависимости от типа используемой лицензии. Закладка Enter Key Dialog Options служит для того, чтобы указать, как будет визуально выглядеть диалоговое окно для ввода имени пользователя и значения ключа. Интерес предоставляет возможность указать тип диалога html. В этом случае вы можете сами сверстать ту html-страницу, только будьте внимательны: в изначальном шаблоне html присутствуют специальные служебные пометки (обработка нажатия на кнопки "регистрация", "выход", "переход на сайт продавца ПО"). Если вы их измените, то диалог регистрации не будет работать. Следующая закладка Protection Options. Здесь вы должны указать, какие алгоритмы защиты будут использованы. Есть много хитрых методик взлома, позволяющих извлечь вашу программу из-под защиты armadillo, также существуют не менее хитрые способы этому противостоять. Вам следует помнить, что определенные способы защиты имеют побочные эффекты — например, программа может не запуститься под определенной версией windows или скорость ее работы будет катастрофически мала. Так, для того, чтобы противодействовать dumping'у — одному из наиболее популярных методов взлома, заключающемуся в том, что загруженная в память версия программы (после того, как была расшифрована и подготовлена для собственно использования) может быть сохранена на диск уже без всякой защиты — armadillo рекомендует использовать алгоритм CopyMem-II. Так вот, этот алгоритм не позволяет защитить dll-, ocx-файлы и приводит к значительной потере производительности плюс возникает вероятность сбоя программы, работающей под старой Windows 98. Закладка Compression Options служит для того, чтобы указать, следует ли выполнять сжатие программы одновременно с ее защитой. Закладка Soft Ice Detection служит для блокировки специализированных утилит для взлома. Если ваша программа стала целью взломщиков, то они будут использовать такое ПО — например, softice, — с помощью которого можно покопаться в ее внутренностях. Назначение softice — отладка, поиск ошибок в готовой программе, мониторинг утечек ресурсов памяти и других проблем. Поэтому разработчики armadillo поступили очень умно, введя три уровня защиты от softice и ему подобных программ. Первый уровень защиты — когда наличие softice не проверяется — например, если вы разрабатываете специальный софт для программистов, которые могут пользоваться softice в законных целях. Второй уровень — когда запуск защищенной armadillo программы блокируется, если обнаружен запущенный softice. И третий уровень — параноидальный — когда запуск программы невозможен, если softice не только не запущен, а просто установлен на вашем компьютере.

Остальные закладки я пропущу, т.к. планирую рассказать о методиках привязки проекта к аппаратным ключам в следующий раз. Пока же мы переходим на закладку Certificates. На этой закладке перечисляется список сертификатов (воспринимайте сертификат как способ указать, как именно можно использовать программу). Естественно, что сертификаты, а также ключи, служащие для активации сертификата, не возникают из ниоткуда. Так, когда вы создаете очередной сертификат, то должны придумать некоторую фразу: именно эта фраза — ваш самый главный секрет. Если кто-либо узнает эту фразу-секрет, он может выполнить генерацию любого количества ключей/сертификатов. Надо сказать, генерация этих ключей не такая уж простая задача — я имею в виду не технический фактор, а социальный. Например, вы написали программу, которую хотите продавать за деньги как shareware. Вы узнали, что существуют специальные сайты-регистраторы — они выступают в роли посредника между вами — автором программы — и клиентами. Клиент заходит на сайт регистратора, указывает, какую версию программы хочет купить, указывает банковские данные, номер кредитки и т.д. Регистратор берет на себя задачу проверки этих сведений, получает деньги от клиента и по мере накопления некоторой суммы высылает чек, переводит на счет или иным способом доставляет вам деньги. Самое интересное в том, как клиент получит ключ для скачанной с вашего сайта программы. В самом простом случае регистратор пишет вам письмо: "мол, так и так, вашу программу купили — вышлите, пожалуйста, ключик". Но вы не получаете это письмо, потому что оно потерялось в ходе пересылки, его посчитали за спам и удалили, или у вас приступ насморка. В любом случае вы не можете сгенерировать и выслать клиенту этот самый ключ. Как следствие клиент недоволен, а регистратор и вы теряете деньги. Кому это надо? Поэтому регистраторы предоставляют услугу автоматической генерации ключа и ее отправки клиенту. Так, в справке armadillo написано, что они сотрудничают с рядом регистраторов, и вам нужно всего лишь выслать регистратору эту самую секретную фразу, на основании которой при подтверждении оплаты сервер регистратора выполнит генерацию ключа и отправит ее клиенту — все полностью автоматизировано. Особенно полезна эта функция в случае действительно массовых покупок. С другой стороны, если вы потеряете секретную фразу или ее получит недобросовестный регистратор, то вы оказываетесь в очень неприятной ситуации. Вы вынуждены отозвать все ключи, выполненные по скомпрометированной схеме генерации, и выслать новый ключ для всех добросовестных клиентов. Иначе, когда вы выпустите обновление программы и защитите его новой схемой генерации ключа, старые ключи клиентов уже не подойдут. Вы можете создать любое количество сертификатов для вашей программы, но существует особый вид сертификата (он создается всегда по умолчанию) DEFAULT. Этот сертификат используется для запуска программы в режиме demo (ограниченной функциональности) или в режиме shareware (ограниченной по времени работы). В случае, если вы хотите распространять свою программу как коммерческую (здесь под коммерческой схемой распространения подразумевается схема, когда мы не можем предварительно опробовать в течение некоторого времени возможности и решить, будем ли мы покупать программу), то такой сертификат вам не нужен, и его следует удалить из проекта. Давайте разберем один из важнейших параметров сертификата: когда и как будет принято решение о его отзыве. На закладке Certificate Expires возможны следующие варианты:

1. Сертификат станет недействительным по истечении N дней после установки. Для сертификата default отсчет начинается после первого запуска, для остальных видов сертификатов отсчет идет от даты, когда ключ был введен в систему защиты armadillo.
2. Сертификат становится недействительным по достижении заданной даты.
3. Срок истечения сертификата определяется не временем, а количеством раз запуска программы.·Интересна возможность внести параметр количества запусков в процедуру генерации ключа. Т.е., когда клиент у вас запрашивает ключ, вы должны указать, сколько раз эту программу можно запустить.
4. Сертификат, перестающий действовать по достижении некоторой версии программы.
5. И, наконец, комбинированный случай: здесь задается и количество дней использования, и количество попыток запуска.
6. Интересен вариант с указаниеммаксимального промежутка времени, в течение которого программа будет работать. Так, по достижении, скажем, 10 минут после запуска программа будет аварийно закрыта. Причем вы вольны указать, будет ли пользователь извещен об окончании срока действия с тем, чтобы он мог сохранить результаты работы.
7. Возможно управлять временем, в течение которого программа должна быть установлена. Например, вы выпустили ключ "1.04.2007" и хотите, чтобы его установка была проведена до истечения данного года. Такую методику обычно применяют для beta-версий, рассчитывая к концу года выпустить следующую версию продукта, так что устанавливать и тестировать устаревший вариант уже не следует.

После того, как вы определили, как именно будет выполнена защита программы, и указали все виды сертификатов (каждый сертификат определяется набором параметров), вы выполняете генерацию защищенного файла exe программы, затем этот файл скачивает клиент и после оплаты покупки просит вас выслать ему ключ. Вы в среде armadillo используете меню keys -> create keys для того, чтобы сгенерировать ключ. При первом запуске программы вы должны будете указать имя пользователя и тот самый сгенерированный ключ (см. рис. 2).

В следующий раз я продолжу рассказ об armadillo. Мы завершим рассмотрение аппаратных ключей, а также методов программного взаимодействия с armadillo api.

black zorro, black-zorro@tut.by


Компьютерная газета. Статья была опубликована в номере 33 за 2007 год в рубрике soft

©1997-2024 Компьютерная газета