Защита shareware-программ
АрхивИтак, долгие часы отладки остались позади, вы умудрились пересилить свою лень и написали приличную документацию, зарегистрировали свой Web-сервер для распространения программы, оплатили несколько "хвалебных" статей в популярных компьютерных журналах, установили конкурентоспособную цену, нашли способ принимать платежи с кредитных карточек через Internet и… Вы думаете, успех у вас в кармане? Как бы не так. Главная работа еще впереди.
Что и как закрывать
Если вы решили распространять свой продукт как shareware, то наверняка уже продумали различия между незарегистрированной и зарегистрированной версией. Если еще нет, то могу подсказать: в принципе, можно использовать три подхода - демо-версия, time limited-версия и ограниченная версия (вообще-то, можно еще делать упор на совесть и просто просить прислать вам деньги, если программа понравилась, но это, к сожалению, работает далеко не всегда: по моему опыту, у пользователя должен быть стимул, побуждающий к регистрации, причем реальный, а не просто условия лицензионного соглашения).
С демо-версиями все просто. В двух словах, принцип такой: вы сильно урезаете возможности программы, попросту "выкидывая" части кода из исходного текста, перекомпилируете и выкладываете результат как демо-версию. (Тем же, кто изъявляет желание поощрить вас материально, вы просто посылаете полную версию программы, или сообщаете, где ее можно взять, - указав, например, "скрытую" ссылку на вашей странице.) Оговорюсь сразу, что этот способ - худший из всех. Во-первых, по демо-версии пользователь не всегда может понять, насколько программа ему подходит. Во-вторых, один из оплативших может подложить вам свинью и рассказать другим, где можно поживиться полной версией "на халяву" (или просто начать раздавать ее всем своим знакомым), - все равно у вас нет способа узнать, кто же сделал "доброе" дело… А если вы будете посылать полную версию обычной (или даже электронной) почтой, то у вас резко увеличатся накладные расходы.
Второй способ более приемлем, но труднее реализуем (почему - объясню позже). Принцип состоит в том, что вы предоставляете пользователю право тестировать ваше творение "по полной программе", но только в течение некоторого ограниченного срока: скажем, тридцати дней с момента установки на компьютер или с момента первого запуска. Или как вариант: ограничение на число запусков. По истечении отведенного срока (или после заданного числа запусков) программа просто перестает работать или переходит в демо-режим.
Третий, самый распространенный способ: некоторые функции в вашей программе остаются "закрытыми", пока она не будет оплачена. Можно, например, ограничить размер файлов, с которыми приложение может работать (установив некую "верхнюю планку"), или не давать сохранять результаты работы, или отключить некоторые "продвинутые" возможности - тут уж кому как нравится. После оплаты вы посылаете пользователю некий пароль (ключ, регистрационный номер и т. п.), который, будучи введенным, разблокирует ранее недоступные функции.
Да, кстати, не помешает еще и такая вещь, как reminder (или "nag screen", как угодно). Это совсем просто: при запуске программа определяет, зарегистрирована она или нет; в последнем случае пользователю ненавязчиво напоминают, что не худо бы и честь знать, то есть заплатить.
Как это сделать
Можно, конечно, воспользоваться услугами третьих фирм - просто купить программный пакет, обеспечивающий переход от незарегистрированной версии к зарегистрированной после оплаты и ввода некоторого пароля (см., например, www.timelock.com/product/ или www.dataet.com/products/isr2/). Проблема в том, что если эту систему купило хотя бы несколько разработчиков и защищенные таким способом продукты уже имеются, то можете быть уверены, что в этой защите уже кто-нибудь "поковырялся" и используемые в ней трюки давно всем известны. Так что придется вам потрудиться самому.
Демо-версии я рассматривать здесь не буду - и так все ясно (см. выше). Можно, конечно, распространять и их, но только как дополнение к "оценочной" версии, - например, раздавать на выставках, договориться о включении на различные CD-ROM и т. п. - исключительно в целях рекламы.
С ограничением по времени немного сложнее. При инсталляции (или при первом запуске) программа должна где-то запомнить текущую дату (или проинициализировать счетчик запусков), а при последующих запусках - сверять даты (не кончился ли "испытательный срок") или увеличивать счетчик и проверять его значение. Если вы действительно знаете это место (куда писать дату/счетчик) - возьмите с полки пирожок (подробнее о ваших супертайниках - см. ниже).
Частично работоспособная версия - по моему мнению, наиболее правильный выбор. Наверняка в вашей программе есть возможности, которые можно назвать "профессиональными" (для продвинутых пользователей). Или просто приятные мелочи, которые можно описать коротким и звучным словом "cool", то есть те, жить без которых можно, но неудобно. Кстати, это еще и очень хороший стимул к покупке: хочешь сделать свою работу более приятной и легкой - покупай!
Теперь о том, что должно происходить после оплаты. Здесь опять же есть две дороги: "статические" пароли и генератор ключей.
В первом случае программа "разблокируется" при вводе пароля, соответствующего некоторым критериям. При этом сам пароль не является индивидуальным. Я думаю, что уже ни для кого не является секретом, как это сделала компания Microsoft со своими CD-keys: сумма цифр должна делиться на 7. Проще некуда. Естественно, вы можете придумать что-нибудь посложнее, например, делать некие вычисления, которые должны приводить к определенному результату. Как вариант - можно хранить все правильные ключи внутри самой программы.
Поскольку каждому пользователю вы будете посылать свой пароль (хотя и не связанный с его данными), то в случае, если один из них будет опубликован для "широкого использования", вам нетрудно будет вычислить обидчика.
Что касается генератора ключей, то это более элегантный способ: зная имя пользователя, вы можете путем каких-либо преобразований сгенерировать из него некий ключ. Тут уж включайте свою фантазию: лучше всего, если преобразование будет односторонним и достаточно запутанным.
Нельзя не упомянуть и еще об одном способе защиты - с помощью аппаратных ключей, подключаемых к параллельному порту компьютера (типа HASP). Конечно, для программы стоимостью пять долларов это не очень подходит (слишком дорого; не все любят; с некоторыми устройствами не достигается полная совместимость и т. д.), но тем не менее… Можете попробовать.
Маленький сюрприз
Если ваша программа действительно хороша, то через два-три дня после ее выпуска вас ждет сюрприз: в Интернете появится "халявный" регистрационный код, или crack, или patch, или взломанная версия. Кстати, если вам не знакомы эти термины, то вот как их можно определить (взято из news:alt.cracks): "Crack: Any method used to defeat protection applied to a software program to allow its full unencumbered use without paying the author for it. Patch: An executable software program that, when aimed at another software program, modifies the target program for some specific purpose". В общем, идея ясна: вашей программой теперь могут пользоваться все желающие, причем платить для этого совсем не обязательно.
Конечно, вы можете об этом и не узнать, если привыкли экономить на доступе к Интернету и/или если не знаете, где искать, но я вас уверяю - если программа интересна не только вам и вашим друзьям, то ее обязательно сломают. Сто процентов.
Должен вас огорчить (или обрадовать?): 99% процентов защит, применяемых в shareware-программах, ломаются за 10-15 минут. Для этого даже не надо быть хакером. Все, что требуется, - это несколько программ: мощный отладчик типа SoftICE, дизассемблер типа IDA плюс пара утилит типа FileMon, RegMon, VxdMon. Иногда даже этого много. Ну и еще, конечно, хотя бы базовое знание ассемблера.
Я не буду здесь углубляться в детали "взлома" - в Интернете существует множество прекрасно написанных пособий как для "начинающих", так и для "продвинутых" хакеров. Остановлюсь лишь на самых общих принципах (должен сразу оговориться, что сам я взломом никогда не занимался и заниматься не собираюсь - кроме как для развлечения; если программа мне нравится, я регистрирую ее легальным способом). Очень надеюсь, что борцы с пиратством не расценят это как "курс молодого бойца" для желающих попробовать свои силы…
Итак… Обычно регистрация выглядит следующим образом: пользователь нажимает на кнопку "Зарегистрировать!" (или обращается к соответствующему пункту меню), и перед ним появляется окошко с предложением ввести регистрационный ключ. При закрытии этого окошка (после ввода ключа) происходит верификация. Верификация может быть ужасно сложной и запутанной, но в конце концов она приходит к закономерному результату, а именно операции сравнения (введенного ключа с правильным или вычисленного значения с некоторым образцом) или записи в стек (или регистр) результата верификации.
Все до гениальности просто: все операции работы со строками (если вы пишете на языке высокого уровня) используют вызовы соответствующих функций (API) ядра Windows (kernel) или обращения к Run-Time Library. И те и другие легко отслеживаются отладчиком, а зачастую и распознаются дизассемблером… Если же вы использовали генератор ключей, то рано или поздно в памяти появится "правильная" строка - то есть та, которая должна быть, если пользователь честно оплатил нелегкий труд программиста. Поэтому чаще всего хакер имеет возможность зарегистрировать программу "на себя" и раздать пароль всем желающим (так, например, было сделано с прекрасным антивирусом AVP от очень уважаемого мною Евгения Касперского).
Кто такой (точнее, такие) PhrozenCrew, вы, наверное, знаете, а если (пока) не знаете, то в двух словах: это самая большая (хотя и не самая старая) "крэкерская" группа, занимающаяся взломом shareware-программ (на их счету более трех тысяч "пострадавших" авторов); насчитывает около сорока активных членов, включая основателя (The Keyboard Caper, родом из Южной Африки), президента и вице-президента (Archimede и TeRaPhY, соответственно), собственно "крэкеров", курьеров, тестировщиков и пр. Впрочем, это уже тема для отдельной статьи…
В случае, если подобрать пароль невозможно ("шароварщики" все-таки тоже не лыком шиты и обычно имеют понятие об ассемблере), используется другой подход: возвращаемое проверочной функцией значение просто заменяется на противоположное (и всего делов-то - заменить безусловный переход на условный или наоборот). А дальше пишется малюсенькая программа, которая делает то же самое, но уже не в памяти, а напрямую в EXE-файле вашей любимой программы…
Если ваша программа - time-limited, то здесь все еще проще (ну прямо как в старом анекдоте про невезучего еврея - или акула попадется глухая, или свисток для отпугивания будет сломанный :). Дело в том, что время первого запуска надо где-то хранить (при этом оставляя неизменным при переинсталляциях). Хранить можно только в двух местах: в Registry или в файле на диске (варианты типа неиспользуемых дорожек я с негодованием отметаю - ребята, это же вам не DOS, сами же намучаетесь, а то и конечному пользователю диск испоганите). С помощью упомянутых выше программ (некоторые из которых совершенно бесплатны) любой желающий с легкостью может увидеть, какие именно ключи Registry вы пишете или читаете и к каким файлам обращаетесь. Далее, найти соответствующие вызовы в самой программе - дело техники, на то отладчики/дизассемблеры и существуют. Все известные мне shareware-программы с защитой этого класса (например, Bounds Checker Professional) уже давно вскрыты…
Даже при использовании аппаратных ключей успех не гарантирован. Идея сама по себе неплохая, но все проверки происходят все-таки в самой программе (или в библиотеках, поставляемых с этими ключами), а значит, от неприятностей вы не застрахованы - вышеупомянутые способы взлома могут быть с успехом применены и здесь.
"Джентльменский набор" хакера
На первом месте стоит, естественно, дизассемблер. Он значительно проще в обращении, чем отладчик, и часто его бывает более чем достаточно, чтобы "расколоть" программу среднего уровня защиты.
Из всех известных мне дизассемблеров самым мощным является IDA (Interactive DisAssembler), см. www.datarescue.com/ida.htm; он далеко не бесплатный (149 долларов), но, поверьте, вложенные в него деньги окупятся с лихвой. Кстати, эта программа написана нашими соотечественниками. Одной из ее отличительных черт является "многоплатформность" - он "понимает" множество форматов файлов, включая DOS COM/EXE, NE (New Executable), LE (Linear Executable, PE (Portable Executable), COFF (Common Object File Format), NLM (NetWare Loadable Modules), LIB, AR и даже Java-классы. Спектр поддерживаемых процессоров тоже весьма широк: Intel (от 8080 - помните такой? - до Pentium Pro и Pentium MMX, и даже i860), а также Motorola 68xxx, ARM, TMS и многие другие. Причем пользователи могут расширять этот список, добавляя поддержку других процессоров самостоятельно.
Есть у IDA и много других замечательных возможностей, часть из которых действительно уникальны. Например, FLIRT (Fast Library Identification and Recognition Technology); с помощью этой технологии дизассемблер способен распознавать вызовы библиотечных функций (например, для языка C - printf, strcmp и т. д.), включая те, которые вы написали сами. Мало того, IDA еще и умеет идентифицировать обращения к массивам и структурам, делая ассемблерный текст значительно более читаемым. Не могу не упомянуть и об "autocommenting" - результирующий текст получается хорошо закомментированным! И последняя маленькая, но важная деталь: в IDA вы можете "подправить" текст программы (заменяя исходные инструкции ассемблера на свои собственные) и сохранить результирующий EXE-файл, так что даже patch делать не придется.
Если все же IDA вас чем-нибудь не устраивает, сходите по адресу www.csee.uq.edu.au/csm/decompilation/disasm.html, - там собрана целая коллекция ссылок на различные дизассемблеры. Рекомендую также посетить www.eccentrica.org/Mammon/disasm.html, где помимо дизассемблеров есть еще и ссылки на утилиты для редактирования бинарных файлов - тоже пригодятся.
Далее - хороший отладчик. Забудьте о Borland Turbo Debugger и Microsoft WinDbg! Эти программы хороши только для "ловли блох", то есть ошибок. Лучший выбор - SoftICE от NuMega (www.numega.com/products/sys/sys.htm). С его помощью вы можете делать буквально все! Собственно, главное его предназначение - это все-таки поиск ошибок, но и как хакерский инструмент он просто незаменим.
Не обойтись и без уже упомянутых утилит FileMon, RegMon и (возможно) VxDMon, написанных Марком Руссиновичем, известным экспертом в области низкоуровневого программирования для Windows (именно он рассказал всему миру о том, что разница между Windows NT Workstation и Windows NT Server - это всего лишь несколько дополнительных программ и значение одного ключа в Registry). FileMon показывает детальную информацию обо всех обращениях к файловой системе; имеется возможность устанавливать различные фильтры и даже отслеживать работу со swap-файлом.
RegMon (как вы уже, наверное, догадались) делает примерно то же самое, но не с файловой системой, а с Registry.
VxDMon, соответственно, осуществляет мониторинг вызовов различных сервисов VxD, что в некоторых случаях тоже может оказаться полезным.
FileMon и RegMon существуют в версиях для Windows 95 и Windows NT (в том числе и для процессора Alpha); VxDMon, естественно, работает только под Windows 95. Все три утилиты можно загрузить с узла "NT Internals" (www.ntinternals.com), причем вместе с исходными текстами на C.
Если вам вдруг понадобится что-то еще или просто станет интересно, какими другими инструментами пользуются хакеры, заходите на www.nettaxi.com/citizens/caligo/cracking.htm - там собрана большая коллекция ссылок на всяческие полезные (не только для вскрытия) программы.
Как не надо делать
Одна из самых примитивных и ненадежных защит - привязка к компьютеру. Любой программист знает, как получить некие уникальные для данного компьютера характеристики - например, серийный номер винчестера, и (казалось бы) - вот оно! Даже если зарегистрировавшийся пользователь передаст свой ключ кому-то другому, работать программа не будет. Если вы когда-нибудь устанавливали "Лексикон", то знаете, о чем идет речь…
Схема, например, может быть следующей: программа вычисляет упомянутые уникальные данные и показывает их пользователю; он посылает их автору, который (при подтверждении оплаты) вычисляет на их основе соответствующий пароль и посылает его обратно. В программе "прошит" тот же самый алгоритм, и делается сверка ключей - введенного с правильным.
Рекомендую отказаться от этой идеи. Ничего, кроме неудобств для легальных пользователей, она вам не принесет. Что, если пользователь поменяет компьютер? Или хотя бы жесткий диск? В наше время повальной модернизации такое случается сплошь и рядом. Сломать-то такую защиту - как два байта переслать, а вот у вас головной боли будет на порядок больше.
Если вы используете статические ключи, то хотя бы постарайтесь, чтобы их не было видно "невооруженным" взглядом при просмотре EXE-файла. Не надо делать таких "подарков"… Даже если вы будете хранить коды "задом наперед" и/или "зашифруете" их "мощной" функцией XOR (особенно на C или Паскале), то это не поможет. Ассемблер - лучший язык! Как говорится, "заграница нам поможет" - читайте документацию по процессорам Intel (причем не только на сервере Intel - www.intel.com; не поленитесь зайти также на сайт "Intel Secrets": www.x86.org). Один из законов Мерфи гласит: "Если ничего не получается - прочтите, наконец, инструкцию"… Алгоритмов шифрования в природе много, и вы даже можете придумать свой собственный (естественно, вряд ли вы скажете новое слово в математике, но такая цель и не ставится).
Если же вас привлек кодогенератор, то сделать его надо как можно сложнее, чтобы любителям "халявы" жизнь медом не казалась. Большинство виденных мною защит, построенных на подобном принципе, "колются" в два счета - можно просто "вырезать" часть кода из защищенной программы (сам алгоритм генерации ключей) и сделать программку, которая будет работать по тому же принципу, но уже как отдельное приложение, давая таким образом не очень честным пользователям возможность сгенерировать правильный код совершенно бесплатно.
Кстати, если/когда вы (в программе) определили, что она работает из-под отладчика или что кто-то уже натравил на нее patch (так, что файл изменился, - подробнее об этом см. ниже), то не стоит кричать об этом на всю Ивановскую: поймал, поймал! Это самое глупое, что вы можете сделать, - данная проверка тут же будет локализована и уничтожена.
А как надо?
Конечная цель - сделать абсолютно "непробиваемую" защиту - увы, недостижима, но вы должны к этому стремиться. Программа-минимум - это обеспечить невозможность подбора пароля (регистрационного ключа). Если у хакеров не будет другого выхода, кроме как написать crack (patch), то это уже весьма неплохо: с выпуском очередной версии им снова придется напрягаться. Скажем, к почтовой программе The Bat! (www.ritlabs.com/the_bat/) crack имеется, а вот кодогенератор сделать не удалось.
Повторюсь еще раз: изучите, наконец, ассемблер. Все эти новомодные RAD-средства хороши только для рисования окошек, кнопочек и прочих "фенечек", но никак не для мощной защиты. Поверьте, знание ассемблера не мешало еще никому.
Хорошая идея - использование сильных средств шифрования с открытым ключом. Алгоритмов можно найти множество, и даже свободно распространяемые исходные тексты в сети имеются. Не поленитесь, проведите денек в Интернете и изучите литературу по этой тематике, - даже если не пригодится для защиты, то уж, в любом случае, кругозор расширите.
Кстати, рекомендую вам попробовать сжать свою программу каким-нибудь упаковщиком. Помните старый добрый PkLite? Так вот, подобных программ для Win32 уже довольно много. Почти для всех из них существуют "распаковщики", но тем не менее применение этого способа несколько затруднит взлом.
Появились и "интеллектуальные" упаковщики, которые серьезно могут помочь вам защитить вашу программу. Например, Shrinker (www.blickinc.com) - для него (пока) распаковщика не существует, и я не уверен, что таковой может быть написан вообще (упакованный эти пакетом EXE-файл распаковывается динамически небольшими блоками, причем используемый алгоритм достаточно сложен; кроме того, используются и некоторые методы защиты от прохождения кода отладчиком).
Не лишним будет и код, распознающий активность отладчика, причем делать это надо на "ранней" стадии, а не непосредственно перед проверкой введенного пароля. Пустите вашу программу по "ложному пути", совершая действия, отличные от тех, которые выполняются при нормальной работе. Или установите какой-нибудь флажок, который может быть использован позднее (конечно, используя hardware breakpoints, его рано или поздно отловят, но это в любом случае еще одно очко в вашу пользу).
Если у вас есть опыт программирования драйверов, то можно "зашить" защиту и в виртуальный драйвер. Копаться в драйвере намного сложнее, чем в обычном исполняемом файле, и далеко не каждый хакер на это способен. Отлаживать драйвер под Windows NT - вообще сущая морока (для этого нужен второй компьютер с debug-версией NT, или хотя бы второй монитор, или навороченный отладчик типа SoftICE, не говоря уж о высокой квалификации).
Впрочем, все это ерунда. Главное - подходите к делу творчески! Включите свою фантазию, бейте хакеров их же оружием! В конце концов, если вы целый год писали программу и относитесь к ней как к своему ребенку - не поленитесь потратить пару недель на изучение всевозможных систем защиты и, главное, методов их взлома.
"Вредные советы", или Как испортить жизнь хакеру
Итак, почему ваша защита настолько примитивна и может быть легко вскрыта? Обычно по двум простым причинам: во-первых, вы не знаете, как защиты "ломаются" (после прочтения этого материала, надеюсь, знаете). И во-вторых: вы не умеете программировать на ассемблере; практически все защиты, написанные на языках высокого уровня, можно обойти в два счета. Чаще всего достаточно бывает поменять всего пару байт…
Вот несколько советов, которые, надеюсь, позволят вам хоть немного обезопасить свою программу от взлома (по меньшей мере, начинающими и/или не слишком квалифицированными хакерами).
- Пишите защиту на ассемблере.
- Никогда не давайте осмысленные имена важным функциям, типа IsValidSerialNum.
- Не предупреждайте (сразу) пользователя о том, что защита нарушена. Лучше сделайте это через два-три дня - хакеры это ненавидят… Пустячок, а приятно.
- Используйте "перекрестные" проверки CRC-кодов ваших EXE- и DLL-файлов.
- Делайте паузу (одной-двух секунд будет вполне достаточно) после ввода пароля (серийного номере) перед возвратом результата. При этом подобрать правильный пароль путем прямого перебора (с помощью специально написанной программы) будет совершенно невозможно.
- Сохраняйте пароли в каком-нибудь "необычном" месте, например, в свойствах поля базы данных.
- Не привязывайтесь к системной дате. Вычисляйте текущую дату из времени создания каких-нибудь системных файлов, например SYSTEM.DAT или USER.DAT (Windows Registry).
- Сохраняйте пароль в нескольких местах одновременно.
- Не используйте "статические" (то есть жестко прошитые в вашу программу) строчки текста для уведомления пользователя о том, что пароль правильный (или неправильный). Это первое, на что смотрит хакер. Генерируйте эти строчки динамически, или используйте шифрование, хотя бы самое простенькое.
- Используйте "мелкие хитрости" для защиты от дизассемблирования и отладки.
- Наконец, никому никогда не рассказывайте о том, как построена ваша защита :)
Все эти рекомендации взяты с Web-сайта "Fravia's Page of Reverse Engineering" (fravia.org). Очень рекомендую, обязательно зайдите: здесь есть чему поучиться. Помимо описания стратегий взлома различных защит, вы найдете немало советов для shareware-программистов, которые помогут вам написать действительно хорошую защиту. И еще: посмотрите, кому и за что там присудили "Most Stupid Protection Award" - получите массу удовольствия. Я надеюсь, что сами в этом списке вы никогда не окажетесь… Кстати, сайт довольно хорошо оформлен и легок в навигации; само по себе это не заслуживало бы внимания, но обратите внимание на логотип "Created with MS-DOS EDIT.COM" (вот тебе, бабушка, и Юрьев день - читай: FrontPage).
Некоторые пункты, возможно, требуют пояснения… Более детальные рекомендации вы сможете найти все на том же сайте, но от вас опять-таки потребуется хорошее знание ассемблера. Остановлюсь лишь на пункте 4. Что такое CRC, я думаю, вы знаете, не правда ли? Сразу предупреждаю, при вычислении CRC-кода исполняемого файла вы столкнетесь с некоторыми трудностями: если "правильный" CRC хранится в самом файле (а именно так и стоит делать - если он лежит во внешнем файле или в Registry, то его обнаружат в момент), то его придется каким-то образом учитывать при вычислениях. Выход следующий: просто исключите сам CRC-код из вычислений. Как это сделать, подробно описано в книге Лу Гринзоу "Философия программирования для Windows 95/NT" (издательство "Символ", 1997 год). Кстати, там же вы найдете и множество других полезных советов, так что рекомендую…
Что касается защиты от дизассемблеров и отладчиков, то это, честно говоря, помогает не сильно, - квалифицированный хакер все равно вас перехитрит. Как бы ни был высок ваш профессиональный уровень, все равно найдется кто-нибудь сильнее вас. Тем не менее, чем больше подобных "примочек" вы используете, тем меньше будет круг хакеров, способных взломать защиту. На самом деле, специалистов "высшего пилотажа" в области взлома не так уж и много - во всяком случае, меньше, чем вы предполагаете (большинство считающих себя таковыми на самом деле ими не являются, как бы им этого ни хотелось). Когда человек начинает разбираться в ассемблере как Бог, ему становится не до таких глупостей, как взлом чужих программ, - за это, в конце концов, денег не платят. Ломать shareware-программы - занятие неблагодарное, и специалист высокого класса без проблем найдет себе высокооплачиваемую и интересную работу по душе.
Как не надо делать никогда
Некоторые авторы shareware-программ пытаются вести с хакерами не очень честную игру. Они просто пишут маленькую програмульку, которая, например, стирает все файлы (или даже не все, а несколько достаточно важных) на компьютере у человека, ее запустившего, - эдакий "троянский конь". При этом они распространяют ее как crack к своему продукту (естественно, анонимно).
Мой вам совет: никогда так не делайте! Если, конечно, вы дорожите своей репутацией. Последствия могут быть любыми: несмотря на вашу "анонимность", пострадавший поймет, кто именно это сделал (автор, естественно), и может запросто забросать вас большими письмами (mail bombs), так что вам придется менять провайдера. Или вас могут подписать на листы рассылки для людей с определенной сексуальной направленностью… Словом, способов отомстить существует немало, и будьте уверены - вас накажут, и очень больно. И это не голословное утверждение - я могу привести примеры, если потребуется.
Или еще один пример: кто-то подобрал пароль к вашему приложению; при выпуске следующей версии вы это учли, и при вводе этого номера пользователем делаете что-нибудь нехорошее…
Этот способ еще хуже. Как известно, раз в год даже палка стреляет, и ваша "защита" может сработать на компьютере у вполне невинного пользователя (должен признаться, я тоже пытался так делать - правда, без вредных последствий, просто предупреждая пользователя, что он "редиска" и работать для него моя программа не будет). Кроме того, если кто-то смог подобрать один пароль, то запросто подберет и другой, а вы будете публично осмеяны.
Кстати, последнее время хакеры успешно борются с подобными попытками их обмануть: они "подписывают" свои сообщения (в которых содержится crack или пароль) с помощью RSA или PGP, чтобы можно было убедиться в их подлинности. Вот до чего дошло - хакеры защищаются от разработчиков, можете вы в это поверить?!
Не имеет смысла и пытаться "настучать" на Web-мастера Интернет-сайта, предоставившего место для взломанной версии или подобранного пароля. Warez-сайты плодятся в сети, как грибы после дождя… Всех не перевешаете. "Уберете" один сайт - возникнет другой, благо бесплатное Web-пространство сейчас получить не проблема, и все попытки ввести любой контроль (цензуру) позорно проваливаются. Кроме того, остается еще UseNet, который вы в любом случае контролировать не в состоянии. Как говорится, расслабьтесь и попытайтесь получить удовольствие…
Словом, это игра. У нее есть определенные правила, и изменить их вы не в состоянии, как бы ни пытались. Помните Жюля Верна - "Из пушки на Луну"? Броня, которую не сможет пробить никакой снаряд; снаряд, способный пробить любую броню… Это может продолжаться бесконечно, но не стоит думать, что вы самый хитрый.
Собственный опыт
Свою первую shareware-программу я написал около года назад, и, можете не сомневаться, вскрывали ее недолго. Вот ведь жизнь-индейка: работал, напрягался, ночами (можно сказать) не спал, а тут пришел Мальчиш-Плохиш и все испортил… И в суд на него не подашь - пес его знает, где он и кто он на самом деле. Если интересно, как ломали, - загляните по адресу fravia.org/aesc_adc.htm; мне даже самому понравилось…
Ну, думаю, ладно - вы сами этого хотели… У меня в программе использовались статические ключи с довольно примитивной проверкой (чуть посложнее, чем у Microsoft, но все-таки) - думаю, надо усилить. Написал супер-пупер-алгоритм, куча длинных переходов, запутанные ссылки, многомерные массивы… Круто! "Правильные" ключи генерировались, кстати, на компьютере с процессором Alpha (533 МГц) в течение двух суток. К тому времени, к слову, набралось несколько сотен пользователей предыдущих версий, так что вдобавок пришлось еще и письма всем рассылать - с новыми паролями. В общем, убил на все это целую неделю. Ну и что вы думаете? На следующий день захожу в news:alt.binaries.cracks - а там парочка "свежевыпеченных" серийных номеров лежит. Вот выдержки из приложенного к ним письма (привожу в оригинале; в конце концов, если вы программист, то язык знать должны):
This program is still topnotch. […] To Vladimir, […] author of ADC: Thanks for the great program, the good attitude, and the interesting protection. Stepping through that rules-based key code was quite exhausting, but very interesting. I'm sure [the next version] will be much more difficult […].
После этого я попытался "закрыть" опубликованные номера; естественно, это не помогло (см. выше), и на следующий же день были подобраны новые. Эх, обидно было…
Впрочем, все это в прошлом. Последние версии моих программ (Advanced Disk Catalog и Advanced ZIP Password Recovery) защищены получше. Во всяком случае, одна лежит уже целый месяц, другая - почти три, и пока никто до них не добрался. Попытки, впрочем, были, но довольно плачевные. Я был приятно удивлен, когда перед Рождеством получил следующее письмо от одного из "элитных" хакеров (из все той же группы PhRoZen CReW):
You don't know me (well, maybe you do), but I am Saltine, the person that has released serials for your excellent ADC program, versions 1.16 and 1.16a. I have had a chance to look at the new 1.20 beta and I must say - the protection is VERY good. I have not been able to crack this new version yet. I think that I can patch it […], but that will require many bytes for the functions […] and I don't like that. The only real solution to me is to obtain a serial number, and that will be very difficult because of the way you coded it. Anyway, I just wanted to say you did a great job with the protection this time, and thanks for writing this very nice utility. I think you may be getting my $20 very soon…. :)
Happy holidays Vladimir, to you and your family.
Ну и последнее письмо, пришедшее буквально несколько дней назад, - от другого хакера, тоже из разряда профессионалов:
[…] I tell you openly: I stopped "working" on your prog because I saw the protection is "what I call perfect". Believe me: I dont give that ranking to many progs ;-) But if I am convienced it is so - fine, I accept and respect. I only kept you prog as one of the few samples "how a protection should be".
Кстати, после того как я выложил сильно защищенные версии своих программ и несколько сильных хакеров публично признались в том, что они не могут их сломать (в UseNet), я получил несколько предложений устроиться на работу в encryption-related-компаниях. Так что не брезгуйте общением в хакерских группах новостей - кто знает, как все повернется…
Следуя собственной рекомендации, я не буду рассказывать, как именно я защищал свою программу, но могу сказать, что ничего особенно "навороченного" там нет. Ее все-таки можно сломать (в принципе, то есть чисто теоретически), но повозиться придется изрядно, и затраченные на это усилия уж точно превысят стоимость регистрации… А правильный пароль (серийный номер) подобрать, по-моему, совсем невозможно - если, конечно, у вас нет в загашнике суперкомпьютера с производительностью в несколько сотен teraflops (кстати, вы не участвовали в последней компании по взлому DES? Если нет, загляните на www.distributed.net, - во всяком случае, сможете оценить стойкость некоторых алгоритмов шифрования). Впрочем, если читающий эти строки считает себя крутым хакером - добро пожаловать, желаю попытать счастья. Только одна просьба: когда/если вы решите, что у вас есть работающий crack, не раскидывайте его по Интернету, не протестировав как следует, - уж больно надоело мне отвечать на письма с претензиями типа "я зарегистрировал вашу программу, но она неправильно работает"… Сейчас я отвечаю на подобные запросы по несколько раз в день, и мне это порядком надоело.
Я подозреваю, что после выхода этого материала появится много желающих самоутвердиться путем взлома моих программ, - ради Бога, дерзайте! Господа, покажите, на что вы способны! Не все же вам в FIDO смайликами обмениваться, МГТС поругивать и "must die!" на митингах кричать… Может быть, мне еще и награду какую-нибудь учредить - в качестве стимула?
А стоит ли игра свеч?
Знаете, временами меня охватывает ощущение, что программы не стоит защищать вообще. Нет, я не говорю о freeware (или cardware - это когда вы просите пользователя прислать вам открытку с места его проживания, и тому подобных "почти-freeware" методов распространения программ). Я же не альтруист…
Дело в том, что если ваша программа достаточно сложна (не в смысле пользовательского интерфейса, а в плане предоставляемых возможностей) и если вы будете предоставлять реальную техническую поддержку зарегистрированным пользователям, то вам вряд ли придется защищать программу вообще… Очень многие, на самом деле, платят именно за поддержку. Недавно я получил несколько писем от пользователей, зарегистрировавшихся год назад: не пора ли, мол, заплатить за maintenance на следующий год (очевидно, у них был опыт общения с крупными корпорациями типа Microsoft :)… Да нет, отвечаю, ребята, все нормально, не суетитесь - обещал бесплатную пожизненную поддержку и обновления версий, так пользуйтесь! И что вы думаете? Отвечают: спасибо огромное, не ожидали, будем рекомендовать вашу программу всем друзьям и знакомым… По-моему, неплохо - бесплатная реклама, не так ли?
И еще один момент. Есть категория пользователей, которые не платят за программное обеспечение никогда. Ну менталитет у них такой (нет, это не российские безденежные "юзеры", если вы об этом подумали)… Так вот, если вашу программу никто не сломает, они все равно ее не купят (даже если имеют такую возможность - я имею в виду финансовую, - дело в принципе).
Кстати, многие хорошие shareware-программы не защищены вообще; тот же WinZip, например (www.winzip.com), только напоминает о необходимости зарегистрироваться, но никаких ограничений, кроме лицензии, не имеет. Тем не менее, продается очень и очень неплохо - любой автор позавидует.
Так, может быть, не стоит защищать вообще? Вы можете не верить, но люди делают большие деньги даже на продуктах класса freeware (каким образом - об этом поговорим как-нибудь потом). Взять хотя бы Netscape - не просто же так они исходные тексты решили раздавать! Советую над этим призадуматься.