Защита баз mdeИсточник: sgml
Статья в основном посвящена методам защиты баз данных от незаконного копирования, то есть попросту - от воровства. Общий подход, изложенный в статье, применим к базам данных различного формата, а не только к базам Access. Но изложение ведется именно для баз Access, что может несколько затруднить понимание для читателей, не знакомых с ним. Вступление. Если вы противник формата mde, или вы не знаете, где его применять, и, тем более, зачем его защищать, то у вас еще нет проблем с продажей вашей программы. И для вас статья носит чисто теоретический характер. Для упрощения изложения рассмотрим модельную ситуацию. Но не спешите разделить радость шефа. Может он не знает, что: "Разработка готового продукта стоит примерно в три раза дороже программы для собственных нужд (см. "Мифический человеко-месяц" Фредерика Брукса)". http://www.ashmanov.com/pap/obspro.phtml И что для вас это означает работу, примерно вдвое большую, чем начальная разработка программы. Работу, которая включает в себя многое, не только доработку программы. Но и ее тоже. В частности, в программе надо сделать: В целом статья посвящена второму вопросу, но немного ниже будет сказано и о первом. Принимаясь за придание программе товарного вида, вы вливаетесь в обширные ряды шароварщиков, у которых так много общих проблем, что для их обсуждения они создали свои клубы. Например, http://www.softshape.com/swrus/ Режим демоверсии. Для создания режима демоверсии обычно применяется один из двух методов: В обоих случаях следует где-то хранить данные, задающие режим демо. И написать программу перевода вашей базы из состояния демо в рабочее. Если вы предоставите потенциальному покупателю демоверсию в формате mdb, то, вполне возможно, этим все и закончится. Или ваша первая продажа окажется последней. Причина изложена в статье "Защита баз mdb". База легко вскрывается опытным акцессистом, ваш режим демо снимается и база переводится в рабочее состояние. Так же не исключено, что, по заказу приятеля-конкурента, другой программист, слегка поменяв внешнее оформление вашей программы, может приступить к ее распространению. Такие случаи были. Например, с программой TurWin. (http://www.arimsoft.ru/soft/turwin.shtml) Так что, забудьте о продажах в формате mdb. Без формата mde в Shareware базах вам не обойтись. Но так ли он надежен, этот формат mde? Нельзя ли его перевести в формат mdb? Этот вопрос настолько часто повторяется на форумах по Access, что это уже есть предложения - повесить на входе в форум ответ: "Нельзя!". Но многие интересуются подробностями - "А почему, собственно, нельзя?". О переводе формата mde в формат mdb. Microsoft разработал формат mde именно как средство защиты объектов базы данных. Идея - дать формат базы, лишенный исходных кодов и быстрее исполняемый. Вроде формата exe по сравнению с программой в исходных кодах, написанной на С++. Но пароль владельца базы mde получить также легко, как и для формата mdb. То есть таблицы, макро, запросы можете считать полностью доступными кому угодно. Защита форм и отчетов построена на значении одного(!) байта в файле (А-1997, А-2000). Если его обнулить, то и они полностью доступны для редактирования. Итак, формат mde защитит вашу базу от наглого воровства и не даст перевести ее в рабочий режим из состоянии демоверсии. Второе - только в том случае, если вы хорошо спрятали данные, задающие режим демо. О том, как их хорошо спрятать - ниже. Как привязать программу к компьютеру. Первое, что приходит в голову - это пометить как-нибудь компьютер и проверять при старте эту отметку. Однако все методы пометки либо преодолеваются известными способами, либо создают много осложнений. Перечислим их с краткими характеристиками. 1.Внести запись о программе и ее состоянии в реестр. 2.Создать в запрятанных местах файл(ы), выполняющие ту же роль, что и запись в реестр. 3.Внести запись в нестандартное место (флеш-память, запасные треки на диске, пустые кластеры на диске, пометив из как испорченные, дописать свою информацию к стандартным программам и т.д). 4. Добавить к компьютеру уникальное устройство. Другое направление - не помечать компьютер, а найти и запомнить его уникальные характеристики. Это направление изложено в статье Сергея Литовского "Система регистрации копий программы". http://nsa.chat.ru/Secur_RegProg.html. По-моему, оно значительно лучше. Список доступных характеристик компьютера, данный в этой статье, можно еще увеличить. Однако и приведенный там список слишком велик. Дело в том, что любое изменение контрольных характеристик приводит к тому, что ваша программа прекращает работу. Дальше покупатель обращается к вам, и вы должны принимать меры для разбора сложившийся ситуации, решая вопрос: "Воруют или нет?", и выходить из нее. Остановимся на SerialNumber диска С. Будем запоминать и проверять его. Тем более, что избежать ситуации изменения характеристик компьютера невозможно в принципе. Например, фирма купила новый компьютер и желает переставить на него вашу программу. Для программы это и есть принципиальное изменение всех характеристик компьютера. Это должно быть обязательно допустимо. Так что надо подумать о логической схеме работы с SerialNumber. Замечание. Литовский в свой статье рекомендует использовать SerialNumber диска, на котором установлена программа. Это снижает гибкость системы, так как запрещает свободный перенос программы с диска на диск даже в пределах одного компьютера. Основная схема работы системы регистрации копий. Основная схема придумана давно: Но это основная схема. Различных вариантов ее реализации можно сделать очень много. Ниже будет сделано еще несколько замечаний по предложениям С. Литовского. Поэтому, если вы еще не прочитали его статью, то сделайте это сейчас. Сначала мелочь. Сосем не обязательно при выдаче кода компьютера шифровать его SerialNumber. Никакой уникальной информации он не несет. Поэтому код компьютера может быть просто ему равен. Теперь основное замечание. Из текста "Пример процедуры для стартовой формы" следует, что каждая клиентская часть по Литовскому имеет свой регистрационный номер. И каждая привязана к своему компьютеру. Назовем это статической привязкой. В этом случае вам придется запрашивать код и высылать ключ для каждого компьютера в отдельности. При этой привязке перенос клиентской части с компьютера на компьютер без вас тоже обойтись не может. Ниже излагается другая схема, которую можно назвать схемой динамической привязки программы к компьютерам. Суть состоит в следующем. Вместо запроса кодов всех компьютеров следует получить код одного (любого) компьютера из сети. Затем сгенерировать ключ перевода программы в рабочее состояние, включив в него следующую информацию: Программа обработки ключа должна: Название организации - покупателя можно выводить в форме - заставке и в форме "О программе". Далее, при старте любая клиентская часть должна прочитать SerialNumber своего компьютера и найти его в защищенной области. Если он есть, то программа молча работает дальше. Иначе она сравнивает количество записанных SerialNumber и количество лицензий. Если количество лицензий не исчерпано, то, после вопроса о правильности данной инсталляции, записывает новый SerialNumber и имя компьютера в защищенную область. Теперь нужно решить проблему переноса программы с компьютера на компьютер. Как указанно выше, она эквивалентна изменению SerialNumber какого-либо компьютера. Для этого дополним нашу программу системой деинсталляции. В программу включим форму, показывающую список имен компьютеров, на которых инсталлирована ваша программа. Список формируется, естественно, из данных, взятых из защищенной области. В форме сделаем кнопку "Деинсталлировать указанный компьютер". При ее нажатии из защищенной области удаляем указанный компьютер и его SerialNumber. Теперь, когда лицензия освободилась, покупатель может скопировать вашу программу на другой компьютер и запустить ее там. Программа проведет инсталляцию, чем и будет завершен процесс переноса. Таким образом, все перемещения покупатель может сделать сам, не обращаясь к вам. В том числе может сам бороться с последствиями изменения SerialNumber какого-либо компьютера. Он его деинсталлирует и установит заново. Забот у вас при применении динамической привязки станет несколько меньше. При динамической привязке незаметно оказалась решена еще одна, ранее не указанная проблема: регистрация докупки лицензий. Если покупатель введет ключ с увеличенным количеством лицензий, то программа заменит содержимое защищенной области и будет заново инсталлировать компьютеры. Хотя здесь возможно иное решение: использование ключа другого формата, отрабатывая который, программа просто увеличит количество лицензий, допуская новые инсталляции. Теперь вы готовы вести динамический учет компьютеров в сети. И программу, кажется, можно ставить покупателю. Однако, что будет, если он решит подарить ее дружественной фирме? Для этого он деинсталлирует все компьютеры, кроме одного, и в этом виде передаст базу другой фирме. Далее инсталлирует свои компьютеры снова и будет работать как прежде. А дружественная фирма проведет инсталляцию своих компьютеров. То есть эта схема не защищена от незаконного копирования с разрешения законного владельца. Проблему надо решать. Отметим, что и в случае статической привязки она существует, только переносится на ваше усмотрение при обращении владельца за новыми ключами взамен старых. А ваше решение, как это не печально, в случае удаленности от фирмы-покупателя может быть только одно: дать ей новые ключи. То есть, в статической схеме от этой ситуации по существу защиты нет. Защита от незаконного копирования с разрешения законного владельца. Хочу отметить, что такая задача обычно шароварщиками не ставится и не решается. Принципиальное решение этой задачи заключается в том, чтобы считать и запомнить уникальную характеристику сети в целом. К сожалению, я не знаю такой устойчивой характеристики и буду рад о любой информации о ней. Реально применяю схему, которая тоже дает защиту, но с небольшой дырой. Логика схемы: если все в порядке, то программа обязательно запускается со стартового (начального) компьютера, что приводит к "вечной" установке всех компьютеров и делает их равнозначными. Если ваш покупатель передал программу в другую организацию, деинсталлировав все компьютеры, кроме одного, то в другой организации запуска с этого единственного "вечного" компьютера никогда не будет. А все другие компьютеры, инсталлированные в другой организации получат ненулевую дату. Далее сработает защита от незаконного копирования по дате инсталляции. Защита от хакера. Вся система защиты построена на использовании SerialNumber. А ведь можно определить и перехватить обращение к чтению этого номера, и подсунуть программе известный правильный номер, имея лицензию хотя бы на один компьютер. Далее программу можно свободно распространять вместе с примочкой, подсовывающей правильный номер. Для программы это будет выглядеть как работа на одном компьютере при реальной работе многих. Не обманывайтесь мыслью, что увеличив число считываемых характеристик, вы защититесь от подмены. Можно перехватить и подменить чтение любых характеристик. Но есть защита и от подмены. При запуске ваша программа получает номер процесса, который изменить нельзя, не нарушив работу Windows. Давайте запомним и его при старте программы, дополнив текущие характеристики компьютера. И будем его проверять, скажем, через каждые две минуты. Если он изменится, то для программы это будет означать, что на одном компьютере ваша программа запущена дважды. Осталось запретить такой запуск, предупредив об этом покупателя. Тем самым вы защититесь и от хакера. Хранение учетной информации (защищенная область). Хранить ее надо, как было сказано выше, в общей базе с данными. Можно использовать естественное место хранения - таблицу, а можно хранить в своих специально созданных Properties. Причем можно создать такие Properties, которые будут недоступны для программ печати свойств, построенных на их переборе. Например, Properties системной таблицы MSysQueries. Забавное свойство Access: распечатать нельзя, а напрямую читать и писать можно. Можно пойти еще дальше, используя Properties поля Expression системной таблицы MSysQueries. Так я вначале и сделал. Но оказалось, что это не здорово. Базы Access имеют свойство портиться. А один из методов восстановления - импорт данных. Но при импорте эти Properties не переписываются. Приходится установочную информацию либо вводить заново, либо переписывать спецпрограммой. То и другое осложняет жизнь. Лучшим выходом оказалось хранение информации просто в таблице, но в зашифрованном виде. Именно в шифрации и в контрольных суммах, учитывающих каждый байт хранимой информации, состоит защита установочной информации. Особое внимание следует уделить алгоритму шифрации. Типичные ошибки демонстрирует статья Новикова и комментарий к ней Крамарева. http://nsa.chat.ru/Secur_Crypt.html. Если шифрация вскрыта, то все ваши усилия пойдут прахом. Рекомендую обратиться к алгоритму RSA : http://www.leadersoft.ru/subscribe/sub/sub32.htm. Хотя сам использую другой алгоритм. Но он пусть останется в тени. Заключение. Защита баз mde от незаконного копирования - необходимая, но не самая трудоемкая часть превращения вашей программы в товарный продукт. Вот еще некоторые другие: восстановление упавших баз ваших клиентов, решение проблем работы на мониторах с разным разрешением, Upgrade не только клиентской части, но и самой структуры данных и обеспечение работы со старыми структурами, автоматизация Upgrade в больших сетях, система настройки внешнего вида форм под вкусы разных пользователей, и, наконец, самая нелюбимая программистами часть - подробный контекстный хелп программы, учитывающий невысокую квалификацию ваших будущих пользователей. |