Создание антивирусного программного обеспечения с применением языка программирования низкого уровня: Методические указания по выполнению лабораторных работ по курсу «Информационная безопасность», страница 10

;этот сервис установит флаг переноса, если

;открытие файла произошло неудачно

;(это возможно, если исходный запрос содержал

;неверное имя файла или из-за чего-то еще)

jc   @@E1 ;error

;в случае ошибки вернем управление

;предыдущему обработчику (только не

;забыв вернуть флажок MyReq в исходное состояние)

;в противном случае IFSMgr_Ring0_FileIO вернет

;в регистре EAX хендл на открытый файл,

;поместим его в EBX, т.к. EBX используется для

;указания хэндла файла при вызове

;IFSMgr_Ring0_FileIO

mov  ebx, eax

Теперь прочитаем начало файла в буфер для проверки его на вирус:

mov  eax, R0_READFILE

;В ECX помещается количество читаемых байт

;возьмем 32768. Если даже файл будет иметь меньший

;размер, то прочитается только начальная его часть

mov  ecx, 8000h

xor  edx, edx

mov  esi, [FileBuf]

VxDCall IFSMgr_Ring0_FileIO

После вызова этого сервиса в буфер файла (адрес которого хранится в переменной [FileBuf]) будет прочитано первые 32768 байт файла (или меньше, если файл меньше).

Теперь ничего не стоит проверить наличие в нем вируса каким-либо способом. Также можно дополнительно вызывать IFSMgr_Ring0_FileIO для чтения дополнительной информации из файла, если по логике заражения файлов вирусами тело вируса может находиться в конце файла или где-нибудь еще.

После проверки на вирус возможны две ситуации:

1.  Вирус был обнаружен.

2.  Вирус не был обнаружен.

В первом случае необходимо запретить доступ к файлу:

@@VirusFound:

;Вначале закроем файл, чтобы операционная система

;не теряла файловых ресурсов

mov  eax, R0_CLOSEFILE

VxDCall IFSMgr_Ring0_FileIO

;сбросим флажок запроса

dec  [MyReq]

;покажем пользователю сообщение о том, что

;найден вирус в таком-то файле.

;для этого используем сервис

;SHELL_SYSMODAL_Message

;использовать сервис SHELL_Message здесь

;нельзя, т.к. он требует, чтобы на протяжении

;всего нахождения окна с сообщением на экране

;компьютера строчки, содержащие текст сообщения

;оставались достоверными, а это невозможно, т.к.

;могут прийти другие файловые запросы и имя файла

;в буфере будет заменено на другое

VMMCall Get_Sys_VM_Handle

xor  eax, eax

mov  ecx, [FileNameBuf]

mov  edi, OFFSET32 VirusFoundTxt

VxDCall SHELL_SYSMODAL_Message

;Запретим доступ к файлу через ir_error

;структуры IOREQ

mov  eax, [@@PioReq]

mov  word ptr [eax + 01Ah], 5h

;вернем ошибку

popad

mov  eax, 1

pop  ebp

ret

Если же файл не содержит вируса, необходимо разрешить к нему доступ, т.е. передать управление предыдущему обработчику.

@@E2:

;закроем файл для избежания потери ресурсов

mov  eax, R0_CLOSEFILE

VxDCall IFSMgr_Ring0_FileIO

@@E1:

;сбросим флажок запроса

dec  [MyReq]

@@1:

;передадим управление предыдущему обработчику

popad

jmp  @@def

EndProc   FileSysApiHook

На этом процесс создания простейшего антивирусного монитора можно считать завершенным.

Теперь необходимо написать какую-либо Win-32 программу, которая осуществит загрузку драйвера. Это вполне можно сделать с помощью Delphi, добавив в нужное место следующую строчку кода:

h := CreateFile ('\\.\av.vxd', 0, 0, 0, 0,

FILE_FLAG_DELETE_ON_CLOSE, 0);

Где h – переменная типа HANDLE (DWORD), которая получает хэндл на файл драйвера.

Для выгрузки из памяти можно просто закрыть этот хэндл:

CloseHandle (h);

Также необходимо иметь ввиду, что при завершении выполнения Win-32 программы, система автоматически закрывает все открытые этой программой файлы, в том числе и хэндлы на файлы драйверов, т.е. при закрытии программы автоматически произойдет выгрузка динамически загруженного ею драйвера.

Для того, чтобы драйвер существовал в системе независимо от каких-либо приложений, необходимо прописать этот драйвер в реестре или в стандартных конфигурационных файлах Windows, например, «System.ini».

В заключении рассмотрим еще два очень полезных сервиса операционной системы.

_HeapAllocate – позволяет выделить память под нужны драйвера из системной «кучи».