TURBO PASCAL |
Новости
|
7.4.1. Описание модуляМодуль рассчитан на защиту как мобильных, так и стационарных программ. Основной процедурой модуля является процедура ProtCheck, осуществляющая контроль копии. Легальность мобильного варианта программы устанавливается за счет контроля скрытого сектора на ключевой дискете, в случае стационарного варианта проверяется дата создания ПЗУ. Две другие подпрограммы модуля позволяют установить защиту файла на жестком диске (подпрограмма SetOnHD) и снять защиту со стационарного варианта программы (подпрограмма RemoveFromHD). Поскольку до сих пор мы почти не касались разницы в способах защиты мобильного и стационарного вариантов программы, имеет смысл рассмотреть эту проблему более подробно. Как уже говорилось, стационарная программа учитывает индивидуальные характеристики компьютера и может исполняться только на одном конкретном ПК. Защита таких программ обычно не вызывает серьезных проблем, во всяком случае для этого программист может использовать очень большой набор индивидуальных признаков (см. n.7.2J. Наоборот, мобильная программа не может связываться с конкретным ПК и должна учитывать какие—то привносимые признаки, т.е. признаки, которые относительно просто создать на любом ПК на время работы программы. Здесь выбор признаков намного беднее: чаще всего для этих целей используются дополнительные аппаратные устройства (ключевая дискета или аппаратный ключ), которые придаются каждой легальной копии и без которых программа не может работать нормальным образом. Если отбросить достаточно экзотичный для отечественного рынка способ защиты с помощью аппаратного ключа, в распоряжении программиста остается единственный вариант защиты мобильной программы — с помощью эталонной (ключевой) дискеты. Именно этот вариант и реализуется в модуле F_Prot. Для создания легальной копии программы должна использоваться особая технология подготовки дискеты. Эта особенность в данном случае заключается в том, что на стандартной дискете диаметром 5'/4 дюймов, рассчитанной на емкость 360 Кбайт, создается дополнительная дорожка из нестандартных 256—байтных секторов. Один из секторов этой дорожки используется для записи ключевой информации. В процессе проверки легальности копии программы процедура ProtCheck считывает этот сектор и контролирует его содержимое. Для создания ключа можно использовать программу Diskette, описанную в п.7.2,5. Можно утверждать, что практически в любом случае коммерческого распространения программы необходимо защитить прежде всего ее мобильный вариант. Для этого покупатель программы получает как минимум одну ключевую дискету, гарантирующую нормальную работу программы на любом стандартном ПК (именно с этой целью в модуле используется широко распространенный формат дискет емкостью 360 Кбайт). В то же время жесткая привязка программы к дискете создает вполне понятные неудобства пользователю. Эти неудобства можно устранить, если разрешить пользователю осуществлять самостоятельную установку программы на жесткий диск, т.е. создавать легальные стационарные варианты программы. Чтобы процесс тиражирования был контролируем, каждая установка программы на ЖД осуществляется только при наличии ключевой дискеты, при этом программа ведет подсчет общего количества созданных с ее помощью стационарных копий. Как показывает практика, ограничение количества установок программы на ЖД является очень важным психологическим фактором, заставляющим покупателя крайне бережно относиться к ключевой дискете и не тиражировать программу без действительной надобности. В модуле F_Prot реализована несложная защита программы от трассировки. С этой целью в ключевых местах проверки легальности используются простенькие ловушки TrassBlockl и TrassBIock2, обеспечивающие зацикливание программы в случае ее трассировки. Замечу, что процедура TrassBlockl использует модификацию кода программы с последующим восстановлением кода в случае, если трассировка не обнаружена. Таким образом, Вы можете многократно повторять выполнение этой процедуры без «зависания» программы. Однако она реализована в виде INLINE—макроса, поэтому взломщику придется бороться с ней всякий раз, когда она вызывается (чем чаще вызывается эта процедура, тем больше ее копий' используется в коде программы и тем труднее трассировка программы и ее взлом). Процедура TrassBIock2 контролирует скорость выполнения эталонного участка программы. Процедура ProtCheck вызывается из защищаемой программы всякий раз, когда требуется установить легальность копии. Ее заголовок имеет следующий вид: Procedure ProtCheck(var Norma,Alarm; var Res: Integer) В теле процедуры параметры—переменные Norma и Alarm трактуются как параметры процедурного типа type ProcType = Procedure; т.е. являются адресами двух процедур без параметров. Процедура Alarm вызывается в случае, если программа обнаружила признаки нелегального копирования, а Norma — если эти признаки отсутствуют. В переменной Res возвращается результат работы ProtCheck: 0 — если выполнялась процедура Norma (легальная копия), 1 — выполнялась Alarm (нелегальная копия), 2 — не выполнялась ни та, ни другая процедура, так как программа не обнаружила дискету в приводе ГД и не смогла проверить легальность КОПИИ. Процедура ProtCheck начинает работу с проверки поля Hard в глобальной типизированной константе Key. Это поле используется для анализа стационарности программы: если поле имеет значение 0, реализуется контроль мобильного варианта, в противном случае — стационарного варианта (установка поля Hard и всей константы Key осуществляется с помощью функции SetOnHD, см. ниже). При контроле мобильного варианта программа пытается прочитать сначала на диске А, а если это не удается — на диске В ключевой сектор (первый сектор на нулевой поверхности дорожки номер 40) размером 256 байт. Этот сектор должен содержать следующую информацию:
Если поле Hard константы Key содержит ненулевое значение, осуществляется контроль стационарного варианта. В этом случае поле Dat содержит эталон даты создания ПЗУ, а поле Hard используется как ключ для шифровки этого поля с помощью операции XOR. Важно заметить, что если контроль стационарного варианта дает отрицательный результат (нелегальная копия), автоматически осуществляется анализ мобильного варианта (контроль дискеты). Таким образом, любая копия программы гарантированно работает, если в распоряжении пользователя есть ключевая дискета. Однако после правильной установки программы на жесткий диск с помощью процедуры SetOnHD программа может работать и без этой дискеты до тех пор, пока она не будет перенесена на новый компьютер, дата создания ПЗУ которого отличается от эталонной. Для правильного создания стационарной копии программы используется функция SetOnHD, имеющая следующий заголовок: Function SetOnHD: Integer; Перед использованием функции SetOnHD необходимо любыми стандартными для ДОС средствами скопировать программу в один из каталогов жесткого диска. Эта функция вызывается в такой «нелегальной» копии, перед этим в любой привод ГД необходимо вставить ключевую дискету со снятой защитой от записи (с незаклеенной прорезью). Результат, возвращаемый функцией, имеет следующий смысл: — 1 — в привод ГД не вставлена дискета; — 2 — в привод вставлена дискета не эталонного типа (не 360 Кбайт или нет скрытого сектора); —3 — дискета защищена от записи или при записи на нее возникла ошибка; —4 — данный вариант программы не скопирован предварительно на жесткий диск; —5 — ошибка доступа к жесткому диску (программа не может прочитать собственный файл или не может записать в него новое значение константы Key); — 6 — исчерпан лимит стационарных копий; — 7 — данная программа уже представляет собой стационарный вариант программы, т.е. константа Key в ней уже определена. Любое неотрицательное значение результата свидетельствует об успешном создании стационарной копии и равно количеству еще не использованных установок программы на жесткий диск. В ходе установки программа контролирует ключевую дискету, затем определяет характерные признаки данного ПК и заносит эти признаки в константу Key. Поскольку защищается только тот экземпляр программы, в котором вызвана функция SetOnHD, программист должен предусмотреть соответствующий вариант запуска программы. Например, он может проанализировать ключи команды запуска с целью проверки специального ключа создания стационарного варианта или предусмотреть соответствующую опцию в диалоговом меню, создаваемом программой в ходе работы. Функция RemoveFromHD осуществляет обратные действия: уничтожает текущую стационарную копию и соответствующим образом увеличивает запас неизрасходованных установок программы. Она возвращает одно из следующих значений: — 1 — в привод ГД не вставлена дискета; — 2 — в привод вставлена дискета неэталонного типа (емкостью не 360 Кбайт или нет скрытого сектора); —3 — дискета защищена от записи или при записи на нее возникла ошибка; —4 — данный вариант программы не скопирован предварительно на жесткий диск; —5 — ошибка доступа к жесткому диску (программа не может прочитать собственный файл или не может записать в него новое значение константы Key). Любое неотрицательное значение свидетельствует об успешном удалении стационарной копии и равно количеству еще не использованных установок программы на жесткий диск. |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |