Предотвратить перезапись файла в обратном вызове перед созданием / обратном вызове после создания

Я пишу драйвер минифильтра, который предназначен для предотвращения записи в PE-файлы. Я проверяю содержимое файла в обратном вызове после создания. Если формат совпал, я пытаюсь вызвать FltCancelFileOpen и вернуть STATUS_ACCESS_DENIED.

Но это можно взломать, открыв файл с CreateDisposition = FILE_OVERWRITE/FILE_OVERWRITE/FILE_SUPERSEDE. В этом случае файл уже усекается в момент вызова post-create-callback.

Как это преодолеть?


person dc0    schedule 29.01.2013    source источник
comment
Не могли бы вы проверить, существует ли файл, прежде чем позволить файловой системе попытаться его создать, и, если это так, проверить формат файла и, если необходимо, немедленно отклонить запрос?   -  person Harry Johnston    schedule 30.01.2013


Ответы (2)


Лучшим вариантом будет проверка обратного вызова перед созданием и запрет открытия файла с доступом для записи для существующих файлов. Вы можете сделать это, вернув FLT_PREOP_COMPLETE из предварительного создания и установив соответствующую ошибку в CallbackData->IoStatus.Status.

person Rohan    schedule 30.01.2013
comment
Невозможно выполнить еще одну операцию открытия файла в обратном вызове перед созданием. Кроме того, при предварительном создании может произойти сбой при открытии файла из-за туннелирования имен файлов в файловых системах FAT и NTFS. Я думаю, что более уместно заменить FILE_OVERWRITE/FILE_SUPERSEDE на FILE_OPEN, FILE_OVERWRITE_IF на FILE_OPEN_IF (те же диспозиции без усечения) в предварительном создании. Затем проверьте содержимое файла после создания и эмулируйте усечение файла для FILE_OVERWRITE/FILE_SUPERSEDE/FILE_OVERWRITE_IF. - person dc0; 31.01.2013

попробуй это :

 FltCancelFileOpen( FltObjects->Instance, FltObjects->FileObject );
 Data->IoStatus.Status = STATUS_ACCESS_DENIED;
 Data->IoStatus.Information = 0;

и вернуться

FLT_POSTOP_FINISHED_PROCESSING;

полный пример на сканере пример Microsoft на GitHub

person user3272603    schedule 12.12.2017