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

Возвращаемое значение необходимо запомнить, т.к. оно обязательно пригодится в последствии:

mov    [pOldFSHook], eax

Что может делать хук файловой системы? Он получает управление над запросом перед тем, как его выполнит соответствующий драйвер устройства, поэтому он может выполнить одно из следующих действий:

1.  Проигнорировать запрос и передать его предыдущему обработчику (или хуку) – вот для этого и необходимо было запоминать значение, возвращаемое IFSMgr_InstallFileSystemApiHook.

2.  Обработать запрос и вернуть управление менеджеру IFS. В таком случае никакой дополнительной обработки запроса произведено не будет.

3.  Изменить запрос или выполнить несколько дополнительных запросов к файловому менеджеру, после чего вернуть управление IFS.

4.  Передать запрос предыдущему обработчику, а когда тот его выполнит (обработает), выполнить какие-либо операции с результатом и вернуть управление IFS.

Как видите, хук файловой системы может делать абсолютно все с передаваемым ему запросом. Поэтому следует быть особенно внимательными при написании такой процедуры, т.к. малейшая ошибка в коде скорее всего приведет к нестабильной работе всей системы в целом.

Теперь рассмотрим саму процедуру хука, вызываемую менеджером IFS.

FileSystemApiHookFunction(

pIFSFunc FSDFnAddr,

int FunctionNum,

int Drive,

int ResourceFlags,

int CodePage,

pioreq pir

)

Как видно из ее описания, эта функция воспринимает 6 параметров, передаваемых ей менеджером IFS (т.е. ОН ответственен за извлечение их из стека).

Первый параметр (FSDFnAddr) – это адрес функции IFS, выполняющей требуемый запрос.

FunctionNum – номер функции, т.е. число, определяющее тип выполняемой операции (подробнее смотрите в DDK).

Drive – номер дисковода, на котором находится требуемый файл (номер задается в следующем формате: 0FFh (т.е. 255) – отсутствует, 1 – «А», 2 – «В», 3 – «С» и т.д.)

ResourceFlags – определяет тип ресурса, над которым производится операция. Это может быть UNC ресурс, сетевой диск, локальный диск или символьное устройство.

CodePage – кодовая страница, в которой передана строка, содержащая имя требуемого ресурса.

pir – указатель на структуру IOREQ, которая отражает всю необходимую информацию о запросе (см. DDK).

В случае, если хук обрабатывал запрос самостоятельно, он должен вернуть 0 в случае удачной обработки. В противном случае он должен вернуть 1, установить флаг переноса «С» и занести в структуру IOREQ (переданную через параметр pir) код ошибки (в поле «ir_error»).

При выгрузке антивирусного монитора, он должен убрать свой хук, чтобы после удаления кода драйвера из памяти компьютера операционная система смогла нормально функционировать. Для этого служит сервис IFSMgr_RemoveFileSystemApiHook, которому в качестве параметра передается адрес установленного ранее хука:

VxDCall IFSMgr_RemoveFileSystemApiHook, <OFFSET32 FileSysApiHook>

После этого драйвер можно безболезненно выгружать из памяти.

Алгоритм функционирования антивирусного монитора для Windows-9x

Рассмотрим операции, выполняемые хуком файловой системы для обнаружения вируса и его обезвреживания.

Для этого вначале опишем хук-функцию:

VxD_LOCKED_CODE_SEG

...

BeginProc      FileSysApiHook

push ebp

mov  ebp,esp

@@pISF         equ  ebp + 08h

@@FuncNum      equ  ebp + 0Ch

@@Drive        equ  ebp + 10h

@@ResFlag      equ  ebp + 14h

@@CodePage     equ  ebp + 18h

@@PioReq       equ  ebp + 1Ch

...

Здесь @@ определяют локальные переменные, соответствующие параметрам, переданным хук-функции. Для доступа к параметрам создается стековый кадр (строчки push ebp и mov ebp, esp). Теперь опишем алгоритм функционирования функции:

1. Когда IFS менеджер вызвал наш хук для обработки какого-либо запроса, необходимо проверить, является ли это запросом на открытие файла. Это делается проверкой номера функции на код открытия файла:

cmp  dword ptr [@@FuncNum], IFSFN_OPEN

jz   @@OpFile

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