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

Vir db 'VIR',0

Ext$ db '$V$',0

HandVir dw 0

Txt3 db 'Ошибка доступа к файлу',

db 13,10,'$'

Txt4 db 'Вирус удален. Проверьте '

db 'другие файлы!',13,10,'$'

Mem dw ? ;Размер буфера

MemS dw ? ;Сегмент буфера

MemF dw 0 ;Признак распределения памяти

Основная программа

START:

push ax Спасаем AX mov ax,ds Запоминаем сегмент PSP mov bx,sp и указатель стека push cs Назначаем сегмент данных pop ds равным сегменту кода mov CSO,ds Сохраняем CS mov PSP,ax Спасаем DS = PSP mov SPO,bx Спасаем SP add ax,10h Сегмент начала программы add ax,Starts Сегмент точки запуска mov Starts,ax Готовим выход call GetExeName Получаем имя ЕХЕ-файла call ReadHead Читаем е^о заголовок call CheckHead Проверяем заголовок je Exit Кончаем, если норма call Dialog Сообщаем и запрашиваем je Exit Пользователь запретил удаление call NewFile Создаем $У$-файл call WriteHead Пишем в него эталонный заголовок call CopyFile Копируем незараженную часть call Rename Переименовываем файлы

Выход EXIT:

Выход из фага и передача управления защищаемой программе (метка EXIT) осуществляется следующим образом. Вначале фаг вызывает процедуру ClosePUes, чтобы закрыть все открытые файлы (файл считается открытым, если соответствующий ему дескриптор не равен 0). Затем вызывается процедура FreeMem, в которой контролируется размер MemF памяти, зарезервированной под буфер перезаписи с помощью функции ДОС $48. Если MemF не равна 0, фаг возвращает ДОС блок памяти длиной MemF байт. Перед завершением работы из стека извлекается значение регистра AX, a в регистры D5 и ?5 помещается значение сегмента PSP. Собственно передача управления осуществляется стандартным для ДОС образом: в стек заталкивается сегмент и смещение точки запуска программы, затем выполняется команда дальнего выхода из подпрограммы RETF. Эта команда извлекает два слова из вершины стека и помещает их в регистры IP и CS.

call CloseFiles Закрываем открытые файлы

call FreeMem Возвращаем зарезервированную память

mov sp,SPO Восстанавливаем SP

mov bx,Starts Готовим сегмент

mov cx,3tart0 и смещение точки запуска

mov es,PSP Восстанавливаем ES

mov ds,PSP Воссганавливаем DS

pop ax Восстанавливаем AX

push bx

push ex