Тексты программ 383

Процедура ReadHead открывает ЯХС—файл и читает его заголовок. В ней (как и всюду в фаге) используется метод доступа к файлам с помощью так называемых дескрипторов (описателей) файлов, файл открывается с помощью функции ДОС $3D, а заголовок читается функцией $ЗР.

; Открываем файл с именем в NAMEF

lea dx,NameFE Начало имени

mov ah,3Dh Код операции

mov al,0 Открываем для чтения

int 21h Обращаемся к DOS

jnc LabO Если нет ошибки

jmp Exit Выходим, если ошибка LABO:

mov HandExe,ax Сохраняем описатель файла ; Читаем заголовок файла

mov Ьх,ах ВХ - описатель файла

mov ah,3Fh Код операции

lea dx,Buffer DS:DX - адрес буфера

mov cx,24 Читаем 24 байт (заголовок)

int 21h

jnc п>0

jmp Exit Если ошибка m0: ret

CheckHead PROC NEAR

; Дешифруем ключ и проверяем заголовок файла

Процедура CheckHead расшифровывает эталонный заголовок Head и сравнивает его с только что прочитанным. Если нет отличий (в этом случае при выходе из процедуры флаг ZF=l), фаг закрывает ЯХЕ—фаил и запускает защищаемую программу. Если обнаружено отличие заголовка от эталона [ZF=0], вызывается процедура Dialog. В ней на экран выводится сообщение о факте заражения файла и проверяется расположение вируса в теле файла. Если относительный сегмент точки запуска зараженной программы ReloCS меньше, чем в эталоне, значит вирус пристыкован в начало программы. В этом случае фаг сообщает о невозможности ликвидации вируса и завершает работу. Если ReloCS больше, чем в эталоне, вирус расположен в конце файла и его можно «выкусить». Фаг запрашивает согласие пользователя и, если оно получено, приступает к ликвидации вируса. ; Дешифруем ключ

mov сх,12 ;Счатчик повторений

lea bx,Head »BX - смещение эталонного заголовка LAB2:

mov ах,[Ьх] ?Берем очередное слово

xor ax,Ksy Дешифруем его

mov [Ьх],ах Помещаем назад

add bx,2 Переходим к следующему слову

loop Lab2 Повторяем расшифровку ; Сравниваем заголовок с эталонным

mov сх,12 Длина заголовка в словах

mov es,cs0 ES - сегмент кода

lea si,Head Эталон

lea di,Buffer ;Заголовок

eld ;Направление - вперец repe cmpsb ;Сравниваем

ret

! ~ ———————— —-.———• ———————— ___—~_ ——__•._—_.••-—_—•. —_«.—

Dialog PROC NEAR

; Сообщаем пользователю о наличии вируса

; и запрашиваем его действия ; Сообщаем пользователю lea dx,Txtl