Уроки по Delphi

       

Защита программы от бесплатного использования. Испытательный срок.


Вместо предисловия.

Безопасность и хакинг. Это два разных понятия. Сколько будут существовать компьютерные программы их всегда будут ломать. Чем сильнее защита, тем к ней сильнее интерес, и сколько будет существовать его величество дизассемблер, столько программистам терпеть убытки. Насколько обеднеет всемогущий Билл я не знаю, но по карману обычного программера бьют больно. Виноваты в этом не только хакеры. Как ни странно виноваты в этом мы сами. Покупая нелицензионные программные продукты, бродя по просторам internet в поисках крека мы тем самым поддерживаем пиратские компании, производящие подпольные лазерные диски, увеличиваем спрос на крек, принуждаем отдельных людей заниматься взломом. А государство со своей позиции борьбы с теневой экономикой (а это именно и есть теневая экономика) выглядит не очень. По крайней мере по сравнению с западными странами.

На этом уроке мы рассмотрим немного теории, которая будет полезна как для начинающих, так и для профессиональных программистов. Для вторых этот урок будет наиболее полезен, поскольку считаю, что профессионал начинается там, где его программы стают востребованными. Вам может показаться удивительным, но от начинающего писателя программ до разработчика востребованных приложений - один шаг. В моем случае переход от языка программирования pascal на object pascal занял не больше недели, после чего была написана довольно интересная программа, структура которой и порядок работы  до сих пор загадка :).

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




Автор этой статьи имеет довольно горький опыт работы с заказчиком. Свыше 50% полностью готовых и работоспособных программ до сих пор не оплачены, находятся на стадии "испытания" или отбракованы навсегда. Скорее всего, во всем этом виноват наш постсоветский менталитет, стремление к халяве. Тут вы можете не согласиться, но я у вас спрошу, а ваш интернет браузер, почтовая программа, наконец, операционная система, купленная? Порой, мы даже и не задумываемся над этой проблемой, покупая компакт диск с новой версией программы, с новой версией операционной системы. Труд человека должен быть оплачиваем. Программный продукт этот как и результат производства, например стул, требует затрат как физических, так и умственных сил.

Как бы то ни было, а защищать свои программы от наглого халявного эксплуатирования вы должны самостоятельно. И просто так погрозить пальчиком бывает недостаточно. По уровню вашей квалификации в области программирования пользователь может и судить о возможной угрозе, поэтому может хватить и простого предупреждения. Если ваши программы предназначены для определенного заказчика, то, скорее всего у этой организации, группы людей, или одного пользователя плохо с программированием (если сами не смогли справиться со своей проблемой). Отсюда вывод - поломать вашу защиту им будет настолько же проблематично, насколько самим написать программу от начала и до конца. Я не учитываю тех людей, которые этим занимаются профессионально, так называемых хакеры, но услуга взлома одной средней программы может стоить намного дороже ее самой. Имеет смысл ломать только при глобальном, неоднократном использовании пользователями, например, ломают даже аппаратную защиту HASP, используемую бухгалтерским программным комплексом 1С. Это я веду к тому, что абсолютно 100% защиты от взлома, нелицензионного тиражирования нет. Поэтому вы не должны слишком много сил отдавать организации защиты. Если на то будет большая необходимость, ее сломают все равно. Но иметь защиту от простого чайника надо обязательно. Хватит и нескольких строчек продуманного программного кода.


Так же вы не должны использовать один и тот же алгоритм защиты в программах, поставляемых одному и тому же заказчику. Это усложнит поиск обходных путей "лицензирования".

Теперь поговорим о методах защиты и способах воздействия на сознание бесстыжего пользователя. Это может быть как простое предупреждение с временной блокировкой работы, как приложения, так и всей операционной системы или прекращение работы программы на данном компьютере вообще (с физическим удалением всех компонентов программы - деинсталляция).

Итак, программа написана и установлена на компьютер заказчика. Ей дан испытательный срок. Не дай Бог вам сказать прямо об этом пользователю. Тогда он может искать окружные методы еще до ответных действий программы. При этом его действия могут быть непредсказуемы, например позовет знакомого программиста со стороны и похвастается, что эта программа имеет какую-то хитрую защиту. Если возникнет остановка производства после, например полугодового использования всего программного комплекса, то вас найдут и за кратчайшие сроки, причем тут стоимость программы может и возрасти. Инфляция, знаете ли :). Как кто-то когда-то сказал, стоимость данных может быть большей самого компьютера. Поэтому ставя зеркализацию дисков на компьютеры, в первую очередь думают про сохранение данных на случай выхода из строя дискового накопителя.

Допустим, вы даете пользователю 30 дней испытательного срока. Об этом должно быть обязательно где-нибудь ненавязчиво написано, типа "Незарегистрированная версия. Пожалуйста, зарегистрируйтесь в 30 дневный срок". Желательно в заставке при загрузке программы (урок 8), можно и в окне "О программе". Тогда вы можете во всем обвинить заказчика, что он не придерживался условий эксплуатации программы, если одним прекрасным утром программа исчезает с диска со всеми набранными на месяц данными.

Теперь мы подошли к способам бесплатной работы, предупреждения (и наказания). Я разделю их на три группы:

1. Постоянное предупреждение о том, что программа еще не куплена, и просьба связаться с программистом. Поверьте, такая методика может приносить больше плодов, чем другие известные на сей день. Приведу пример. Мне предлагали для примера моей новой программы одну программу, которая замечательно работает, имеет отличный интерфейс, много удобных дополнительных утилит. Пользователю она не понравилась потому, что каждые три минуты высвечивалось окошко, что ее необходимо зарегистрировать. Это окошко закрывается одним нажатием кнопки мышки, но пользователя это очень бесит. Вы можете в таком окне еще привязать таймер, который будет "вешать" программу на заданное время при OnCloseQuery этого окна. Это будет сильно тормозить нормальную работу с программой, потому, что окно будет закрываться несразу.




procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

Sleep(5000); //Ждать 5 секунд, после чего процедура закрытия окна продолжится

end;

2. Отказ от работы после истечения заданного срока. Довольно большой процент программ, имеющих изначально не тронутую хакерами защиту, имеют такой способ испытательного срока.

Слабым местом для этого вида защиты есть то, где вы храните информацию о первом запуске программы (дата, время, количество запусков и т.п.). Наиболее оптимальным местом хранения такой информации есть реестр windows. Реже - ini файлы, еще реже - другие файлы.

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

Программа с таймером в реестре работает по такому принципу. Первый запуск программы, поиск в реестре вашей специальной записи. Если таковой нет (первый запуск), то она создается. Запись включает в себя дату и время запуска.

ВНИМАНИЕ! Многие хакерские примочки не что иное, как простой запускатель программы с переводом времени (переводится время назад и программа запускается). Поэтому повторяем операцию записи последнего запуска обязательно и при завершении работы программы, возможно даже после определенного времени работы, скажем в 5 минут.

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


Если таких переводов времени слишком много (работает автоматический перевод времени), то срок использования программы закончится уже после 30 запусков.

Если после очередного запуска вы насчитали (ТЕКУЩАЯ_ДАТА - ДАТА_ПРЕДЫДУЩЕГО_ЗАПУСКА + КОЛИЧЕСТВО_ДНЕЙ_РАБОТЫ_ПРОГРАММЫ)>=30, тогда вы знаете что делать :). Можно просто завершать работу, а можно поступить так, как сказано в следующем пункте.

3. По истечению бесплатного использования программы она делает специальную пометку в реестре и полностью удаляется. Если пользователь оставил заначку в виде резервной копии программы, то она тоже сама удалится, как только прочитает эту пометку при запуске. Хотя я и предлагаю вашему вниманию этот метод, все же не советую его использовать т.к. он наиболее конфликтный. 100% гарантии у вас нет, что эта процедура не сработает на уже купленной версии, и вы можете тем самым потерять ценного клиента. Но, тем не менее, вот идея. Перед уничтожением всех данных программы, а обычно они располагаются в каталоге вашей программы, необходимо закрыть все открытые файлы. Далее все файлы по очереди уничтожаются командой:

DeleteFile(НАЗВАНИЕ_ФАЙЛА);

При этом их восстановление возможно специальной утилитой, например UnErase. Сложнее будет восстановить физически затертый файл. Для этого вам надо такой файл создать заново процедурой Rewrite и закрыть. Далее файл нулевого размера можно удалить. Восстановление таких данных без специальных средств дисковых редакторов невозможно. Стандартными средствами восстанавливаются только перезаписанные нами нулевые файлы. Пользователь при этом только напрасно потеряет время. Можно сказать уверенно, что все данные из такого удаленного файла навсегда утеряны.

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

Ваша программа уже очистила все свои рабочие файлы и готова сама удалиться. Но если вы попытаетесь ее удалить, то ничего не выйдет. Программа запущена и пока она работает, ее и с места двинуть нельзя. Удалить ее только после закрытия может внешний процесс. Для этого вы программно создаете BAT файл, в котором пишите:


:povtor

del ВАША_ПРОГРАММА

if exist ВАША_ПРОГРАММА goto povtor

Далее запускаете этот bat файл на выполнение командой WinExec или ShellExecute, после чего закрываете свою программу. Используя преимущества многозадачности системы, вы порождаете внешний процесс, который удалят вашу программу.

Для тех, кто не знаком с командами DOS разъясняю. Первая строчка является меткой, к которой можно перейти из любой строки bat файла командой GOTO. Вторая строка пытается удалить вашу программу с диска. Пока ваша программа запущена, ей это не удастся сделать. Третья строка проверяет наличие файла на диске. Если он еще не удален, то происходит переход на метку з названием POVTOR, где снова производится попытка удалить программу.

Откровенно скажу, что этот цикл повторится не один раз, пока ваша запущенная EXE программа не исчезнет, но я вас уверяю, что пользователь не успеет глазом моргнуть, как для него все будет уже закончено. Единственным следом разрушающей деятельности останется этот BAT файл, а может и не остаться, если вы четвертой строкой укажете:

del ТЕКУЩИЙ_BAT_ФАЙЛ

Я пробовал, BAT файл действительно может удалить сам себя.

А теперь три примера для каждой рассмотренной группы.

Пример первый вы можете скачать по этой ссылке (5КБ). Не буду подробно останавливаться на работе этой программы, можете самостоятельно раскрыть проект и изучить работу как отдельных команд, так и всей программы в целом.

Пример второй немного сложнее.

На уроке 17 мы рассмотрели методы сохранения данных в реестр. Скажу, что такая методика для нашего случая не подходит т.к. все данные записываются в раздел HKEY_CURRENT_USER, и в многопользовательской операционной среде такие данные будут вестись по-разному. Когда время для одного пользователя истечет, то программой может пользоваться другой пользователь. А их может быть неограниченное количество. Нам же надо все данные писать в одно место реестра. Выберем это место HKEY_LOCAL_MACHINE\SOFTWARE с подключом, например LAB. Название подключа можете придумать самостоятельно, а опытные пользователи, имеющие опыт работы с реестром, вообще могут придумать оригинальное место хранения данных своей программы. Вообще, в HKEY_LOCAL_MACHINE\SOFTWARE пишут свои данные различные программы. Перед началом написания такой программы не забудьте добавить в раздел подключаемых модулей Uses модуль Registry для работы с реестром.

Пример можно забрать по этой ссылке
(4КБ).

В третьем примере вы можете узнать, как программа уничтожает себя и все свои данные. Ее вы можете забрать по этой ссылке
(3КБ). Пример удаления запущенной EXE программы был взят мной из моей же программы, в которой есть свойство автоматического обновления по сети.
С уважением, ведущий уроков Semen semen@krovatka.net

Содержание раздела