;этот сервис установит флаг переноса, если
;открытие файла произошло неудачно
;(это возможно, если исходный запрос содержал
;неверное имя файла или из-за чего-то еще)
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 – позволяет выделить память под нужны драйвера из системной «кучи».
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.