дине файла; в этом случае программа предупреждает пользователя о невозможности восстановления (если Вас заинтересовал описываемый способ борьбы с вирусами, попробуйте модифицировать программу защиты таКг чтобы она работала и в этом случае);
• если вирус пристыкован в конец файла, то в восстанавливаемый файл переносится эталонный заголовок и незараженная часть, начиная с байта TabIOff + ReIoCnt'4 от начала файла и до байта FileSize — HL. Отмечу следующее обстоятельство. Описанная система защиты дублирует заголовок файла в тело программы. Ничто не мешает вирусу проверить тело программы на наличие дубликата и соответствующим образом изменить его. Я далек от мысли, что Вы, уважаемый читатель, после знакомства с этим разделом захотите создать собственный вирус, учитывающий это обстоятельство. Тем не менее я считаю, что нелишней будет какая—то защита самого ключа. Такая защита реализуется очень просто: для этого достаточно все 16-битные поля эталона заголовка сложить по модулю 2 со случайной константой Key. С этой целью в процедуру Save помещен следующий фрагмент (см. текст модуля в прил.П7):
{Зашифровать ключ:} Randomize;
Head.Key := Random($FFFF);
with Head,Head.HE do for k := 1 to 14 do
Hem[k] := HE.Hem[k] xor Key;
(массив Нет совмещен в памяти с сохраняемым в файле эталонным заголовком, a HE.Hem — с заголовком файла в момент первого запуска).
Инициация генератора случайных чисел с помощью процедуры Randomize гарантирует, что шифр Head.Key не будет повторяться в различных программах В процедуре CheckFile с помощью операторов
{Дешифровать ключ:} with H,H.HE do
for k :" 1 to 14 do
Hem[k] := Hem[k] xor Key;
восстанавливается исходный вид ключа.
Процедура CheckFile, осуществляющая установку или контроль ключа, вызывается в ходе выполнения установочной части модуля F_Anti, поэтому для использования описанного метода защиты достаточно указать имя модуля в предложении Uses. Замечу, что в случае разработки программы с оверлеями модуль F_Anti можно объявить оверлейным, если в установочной части любого неоверлейного модуля инициируется работа администратора оверлея.
В распоряжении программиста имеется глобальная переменная CheckVirusResult, сигнализирующая о результатах проверки программы. Значения этой переменной интепретируются следующим образом:
0; {Не обнаружен факт заражения} 1; <Первый запуск, в программе установлена защита}
-1; {Вирус обезврежен с согласия пользователя}
-2; {Вирус обезврежен автоматически}
-3; {Контроль подавлен ключом /NOANTI}
-<i; {Вирус расположен в начале программы!