Можно утверждать, что практически в любом случае коммерческого распространения программы необходимо защитить прежде всего ее мобильный вариант. Для этого покупатель программы получает как минимум одну ключевую дискету, гарантирующую нормальную работу программы на любом стандартном ПК (именно с этой целью в модуле используется широко распространенный формат дискет емкостью 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 — не выполнялась ни та, ни другая процедура, так как программа