Тексты программ 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