TURBO PASCAL |
Новости
|
6.3.3. Модуль F_AntiВ этом параграфе описывается модуль F_Anti, в котором осуществляются все необходимые действия по установке ключа во вновь создаваемый ЕХЕ— файл и последующей проверке этого ключа при каждой загрузке программы. Полный текст модуля см. прил.П7. В качестве ключа для контроля факта заражения ЕХЕ— файла в модуле F_Anti используется типизированная константа Head, соответствующая такой структуре данных: type НТуре = record НЕ : HeadExeType; {Эталонный заголовок файла) HL : LongInt; {Эталонная длина файла} HF : Boolean; {Флаг установки ключа} Key: Word {Шифр для защиты ключа} end; При создании этой типизированной константы компилятор в поле HP no — мещает значение False. Запущенная программа анализирует это поле. При первом прогоне HF = False, в результате чего программа вызывает процедуру Save. в ходе выполнения которой в файле сохраняются эталонный' заголовок и начальная длина файла. При этом одновременно в поле HF (в файле программы!) помещается значение True, поэтому при любом последующем запуске программы вместо Save будет вызвана процедура CheckFile, которая осуществит нужный контроль файла. Если в ходе контроля обнаруживается хотя бы малейшее отличие заголовка файла от его эталона, хранящегося в Head, программа сообщает о факте заражения и предлагает восстановить испорченный заголовок и начальную длину файла. При восстановлении зараженного файла осуществляются следующие действия: • зараженный файл копируется в файл с расширением VIR — это позволит Вам в случае неудачной попытки восстановления повторить ее еще раз; кроме того, при желании Вы сможете передать разработчикам антивирусных программ копию вируса для выработки методов его обнаружения и уничтожения; • анализируется адрес запуска зараженной программы: если относительное значение сегмента точки запуска у зараженной программы меньше, чем в эталоне, то это означает, что вирус располагается в начале или в сере— ' Если программа запускается на уже зараженном ПК. не исключено, что заголовок файла будет испорчен вирусом, и тогда система защиты будет ревностно следить за сохранностью вируса! дине файла; в этом случае программа предупреждает пользователя о невозможности восстановления (если Вас заинтересовал описываемый способ борьбы с вирусами, попробуйте модифицировать программу защиты таКг чтобы она работала и в этом случае); • если вирус пристыкован в конец файла, то в восстанавливаемый файл переносится эталонный заголовок и незараженная часть, начиная с байта 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; {Вирус расположен в начале программы! Защита программ от компьютерных вирусов 167 Работа процедуры CheckFile может быть подавлена, если программа запускается с ключом /NOANTI. Ключ /NOQUERY разрешает автоматическое удаление обнаруженного вируса без разрешения пользователя. Ключ /NOALARM также разрешает процедуре автоматически удалить вирус, но запрещает выдавать на экран предупреждающее сообщение. Наконец, ключ /NOCOPY запрещает создание резервной копии зараженного файла (с расширением VIR). Следующая простая программа иллюстрирует технику использования модуля F_Anti. Если Вы скомпилируете эту программу в файл testanti.exe, то после команды testanti на экране появится сообщение Установлена защита файла TESTANTI.EXE. при первом запуске программы и В файле TESTANTI.EXE вирус не обнаружен. при каждом следующем запуске. Если запустить программу командой testanti /noanti на экран будет выведено сообщение Контроль блокирован ключом /NOANTI. Uses F_Anti; begin case CheckVirusResult of 0 WriteLn('B файле ',ParamStr(0),' вирус не обнаружен.'); 1 WriteLn('Установлена защита файла ',aramStr(0),'.'); -1 WriteLn('Вирус удален с разрешения пользователя.'); -2 WriteLn('Вирус удален автоматически.'); -3 WriteLn('Контроль блокирован ключом /NOANTI.')? -4 WriteLn('Вирус расположен в начале '+ 'файла - удаление невозможно.') end end. |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |