Все же, что нажито непосильным трудом, все пропало!
А.С. Шпак, пострадавший от взлома
.
А может, не взломают? Это единственная мысль, занимающая головы новичков. Взломают. Если программа актуальна и нужна пользователям, ее обязательно взломают — такова печальная статистика.
Конечно, хорошо, если вашим продуктом пользуются многие, но совсем хорошо, когда за его использование еще и платят. Недели и месяцы, проведенные перед монитором за отладкой программы и поиском багов, стоят не только морального удовлетворения от популярности продукта, но и материального вознаграждения.
Собственно, вопрос даже не в том, как защитить программу со стопроцентной гарантией, а в том, как успеть получить прибыль до взлома. Ответ прост: во-первых, усложнить защиту, чтобы на ее взлом ушло больше времени, а во-вторых, не затягивать с выпуском следующей версии.
Хотя на самом деле есть еще один вариант. Можно положиться на честность сограждан и понадеяться на помощь пиратов. То есть никаких особенных механизмов защиты не придумывать, а оставить все как есть. И тогда благодаря пиратам ваш продукт (разумеется, при условии его нужности и полезности людям) станет бешено популярным среди населения. А вам останется лишь собирать дань с наиболее честных пользователей, готовых выложить небольшую сумму за легальный софт.
Но большинство разработчиков предпочитает защититься. Конечно, и вы можете попробовать защитить свое детище, причем самыми современными алгоритмами и программами. Но подумайте, во сколько раз вырастет стоимость продукта и будут ли его за такие деньги покупать? Запомните самое важное правило: стоимость защиты должна быть соизмерима со стоимостью самого продукта!
Поскольку сегодня мы говорим о защите недорогих shareware-продуктов, давайте сразу определим те подходы, которые в этом случае наиболее уместны. Самым рациональным представляется использование программных методов. Судите сами: вы не распространяете продукт на физических носителях (оптических дисках), следовательно, защищаться от их копирования вам не надо. Затем, вряд ли стоимость вашей программы настолько велика, что в нее безболезненно можно включить стоимость электронного ключа. Значит, и этот метод отпадает. Что остается? Только защита программного модуля с помощью лицензионных ключей.
Собственно, в общем случае схема понятна и известна давно — программа работает (или устанавливается) только при указании пользователем регистрационного ключа (серийного номера). Для того чтобы одним ключом мог воспользоваться один пользователь (не будем рассматривать здесь корпоративные лицензии), ключ надо активировать.
Сделать это можно как минимум двумя способами.
- При активации программа собирает уникальные данные пользовательского компьютера (это может быть серийный номер жесткого диска, тактовая частота процессора, серийный номер BIOS и еще многое другое), подсчитывает по этим данным и серийному номеру продукта контрольную сумму и передает ее разработчику. Разработчик генерирует активационный код, который пользователь вводит в программу регистрации. При каждом запуске программа сверяет этот код и в случае несовпадения прекращает работу. То есть программа с этим серийным номером и активационным кодом не сможет работать на другом компьютере. Метод привязки к аппаратной конфигурации считается самым надежным, но для пользователя он не очень удобен. Если вдруг он «проапгрейдил» свой компьютер, вам придется предоставить ему новый активационный код.
- Можно хранить активированные серийные номера на сервере, и при каждой попытке установить ПО проверять соответствующий номер. Скажем, в течение какого-то времени ПО работает без активации, а потом работать перестает. Если продукт приобретен легально, пользователь должен в срок активировать серийный номер. То есть попросту сообщить разработчику об использовании продукта. Попытки повторной активации ключа ни к чему не приводят, и по окончании срока, отведенного на активацию, ПО перестает работать.
В любом случае, как бы вы ни использовали серийные номера продукта и активацию, задача хакера — найти в программе то место, ту функцию, которая отвечает за проверку ключа, и дезактивировать ее, отключить проверку.
А задача любой защиты — не дать хакеру эту функцию обнаружить.
Как же обмануть опытных взломщиков? Для начала выясним, какими инструментами они пользуются.
Инструменты хакера
В арсенале опытного взломщика можно найти самые разные средства — от огромной фомки до миниатюрных отмычек. Хотя основных орудий всего три, и различаются они принципами работы.
Отладчики
Отладчик сродни обычной фомке, ломику, который может найтись у любого, в том числе и у разработчика.
Отладчики входят в состав большинства IDE и пакетов средств разработки и существенно облегчают жизнь программистам. Работающий отладчик создает специальный режим, передавая приложению всю среду выполнения так, как будто оно работает только с операционной системой. На самом же деле приложение выполняется по шагам, а разработчик может отследить ход работы программы и выявить те места, где происходят ошибки.
Хакеры же используют механизмы отладки для определения защиты — отслеживая в приложении шаги, на которых происходит проверка введенного ключа, выдаются сообщения об ошибках и т.д.
Существует множество отладчиков, но, пожалуй, самым легендарным из всех является SoftIce. Защитить приложение от него практически невозможно, так как работает этот отладчик на уровне ядра операционной системы. Несмотря на то что примерно год назад разработчики линейки DriverStudio, в состав которой входил SoftIce, прекратили поддержку этих продуктов, какое-то время многие еще будут им пользоваться.
Дизассемблер
Дизассемблирование — это уже не грубый взлом, а ювелирная работа отмычкой. Пропустив программу через дизассемблер, хакер преобразует исполняемые модули в запись команд на понятном человеку языке — ассемблере. По полученной последовательности действий, выполняемых программой, он определяет точки, в которых происходит проверка ключа. Остальное — дело техники. Остается лишь отключить проверку, и программа будет работать без ключей.
Дампер
Результатом работы дампера также является последовательность команд на ассемблере, однако в отличие от дизассемблера он транслирует не файл на диске, а содержимое оперативной памяти в момент работы приложения. В итоге хакер практически ничего не взламывает. Ему достаточно лишь взять код с того момента, как пройдены все проверки и защиты, и скомпилировать его в приложение, которое будет работать безо всяких ключей.
Используя эти инструменты, хакер может взломать любую защиту программного модуля. Но с этим можно бороться.
Еще раз повторимся: какой бы подход вы ни использовали (не будем сейчас обсуждать их удобство или неудобство для пользователей), основная ваша задача — как можно лучше спрятать проверку ключа от хакера, запутать его и заставить потратить как можно больше времени на поиски. Как говорится, «чтобы никто не догадался». Есть несколько приемов, с помощью которых вы обеспечите взломщика работой на продолжительный срок.
Способ 1. «Сторож легко усыпляется хлороформом...»
Как правило, регистрация программы, активация ключа и прочие действия защиты начинаются после нажатия кнопки ОК. Назовем ее именно так, хотя на самом деле названия у нее могут быть любые: «Активировать», «Зарегистрировать», «Отправить» и т.д. Самый очевидный для хакера путь взлома — «нейтрализовать сторожа», т.е. изменить обработчик нажатия этой кнопки, удалив из него все проверки либо подставив нужные значения. Если сторож — «бабушка — божий одуванчик», ваша программа ломается самое большое за час. Но если вы не будете выставлять напоказ все процедуры защиты, у вас есть время. Максимум того, что можно сделать при нажатии кнопки ОК, — это сохранить введенный пользователем код. Но лучше его еще и зашифровать.
Дальше программа продолжает работу, а вы потихоньку проверяете введенный пользователем код. Лучше разбить проверку на несколько этапов и «раскидать» их по программе. Тогда взломщику придется помучиться. Если стоимость программы невысока, возможно, он не станет искать дальше.
Способ 2. «Ы!»
Да-да! Чтобы никто не догадался. Постарайтесь не давать функциям программы и используемым файлам понятные имена. Если вы назовете функцию проверки ключа, например, KeyValidate, это сразу привлечет внимание хакера.
Точно так же он отреагирует на такие моменты, как неактивные кнопки или окна и, конечно же, сообщения типа «Неверный серийный номер» или «Оставшееся количество запусков программы». Если уж вы собираетесь напомнить пользователю об активации, лучше генерируйте эти строки в процессе работы или шифруйте, но никогда не оставляйте в тексте программы в исходном виде.
Способ 3. «Абыр... абыр... абырвалг!»
Раз уж мы заговорили о шифровании, стоит отметить, что это один из способов противодействия дизассемблерам и дамперам. Если вы зашифруете код приложения или его фрагменты и будете дешифровать его только перед исполнением, хакер не сможет получить распечатку команд на ассемблере и ему придется пользоваться отладчиком, что при наличии шифрования сильно усложнит взлом. А уж если вы будете не только расшифровывать код перед исполнением, но и снова зашифровывать его по окончании выполнения, работы хакеру прибавится вдвойне.
Способ 4. «Кто так строит?»
Противодействовать работе отладчика можно несколькими способами. Самый простой — запутать программу, «замусорить» код функциями и процедурами, выполняющими сложные вычисления, но в действительности ни на что не влияющими. Кстати, здесь можно сколько угодно использовать красноречивые названия типа IsRegistered, ReadSerial-Number и прочие приманки. Конечно, покопавшись в работе этих функций, хакер поймет, что это ложный путь, но какое-то время на него он потратит.
Есть также несколько системных способов. Чтобы определить, запущена ли ваша программа в режиме отладки, можно проверять контрольные суммы отдельных участков: если хакер поставит в каком-то месте контрольную точку, сумма изменится.
Можно проверять и время работы программы. Понятно, что в режиме пошагового выполнения программа будет работать дольше. Для критичных участков, где наиболее вероятна установка хакером контрольных точек, лучше проверять не время выполнения этого участка, а разницу между временем выполнения двух участков или отношение этих периодов.
Ну вот, пожалуй, и все основные приемы, полезные для начинающего разработчика. Для защиты условно-бесплатных продуктов их должно быть достаточно. Ах да! Мы же обещали пять приемов против взлома.
Способ 5. «Аттракцион неслыханной щедрости»
Последний прием — не защищайте свой продукт. Ну подумайте сами, сколько сил и времени вы потратите на создание достойной защиты, зная, что ее все равно сломают? Лучше используйте это время на распространение своей программы. Пусть ее взломают, но тем самым она обретет популярность. Выпускайте почаще новые версии, оказывайте техническую поддержку легальным пользователям, и продукт начнут покупать!
Посмотрите на The Bat! или WinRAR. Защита этих продуктов была многократно взломана, однако разработчики от этого совершенно не обеднели.
Кстати, есть один способ заработать, бесплатно распространяя продукты, работающие только при подключении к Интернету. Вы можете продавать рекламные площади — специально отведенные места в окне своей программы. Успешных примеров множество, взять хотя бы ICQ. Конечно, существуют «патчи», отключающие загрузку баннеров, но ни разработчики, ни рекламодатели от этого не страдают.
Если вы попробуете не защищать хотя бы первые версии программы, есть шанс, что ваш продукт намного быстрее станет известен пользователям. А уж потом, когда его оценят и полюбят, когда вы выпустите несколько версий с новыми возможностями, вот тогда как раз наступит время использовать приемы против взлома.