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