Драйвер минифильтра не блокирует редактирование файлов

Я пытаюсь создать драйвер фильтра файловой системы (минифильтр). Для этого я следую инструкциям, приведенным здесь: https://www.youtube.com/watch?v=ukUf3kSSTOU

Вкратце, в руководстве вы создадите драйвер минифильтра, который не позволит вам записывать в файл с именем OPENME.txt.

Вот код, который у меня есть:

#include <fltKernel.h>
#include <dontuse.h>
#include <suppress.h>

PFLT_FILTER FilterHandle = NULL;
NTSTATUS MiniUnload(FLT_FILTER_UNLOAD_FLAGS Flags);
FLT_POSTOP_CALLBACK_STATUS MiniPostCreate(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContec, FLT_POST_OPERATION_FLAGS Flags);
FLT_PREOP_CALLBACK_STATUS MiniPreCreate(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContec);
FLT_PREOP_CALLBACK_STATUS MiniPreWrite(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContec);

const FLT_OPERATION_REGISTRATION Callbacks[] =
{
{ IRP_MJ_CREATE,0,MiniPreCreate, MiniPostCreate },
{ IRP_MJ_WRITE,0,MiniPreWrite, NULL },
{ IRP_MJ_OPERATION_END }
};

const FLT_REGISTRATION FilterRegistration =
{
sizeof(FLT_REGISTRATION),
FLT_REGISTRATION_VERSION,
0,
NULL,
Callbacks,
MiniUnload,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
};

NTSTATUS MiniUnload(FLT_FILTER_UNLOAD_FLAGS Flags)
{
KdPrint(("driver unload \r\n"));
FltUnregisterFilter(FilterHandle);

return STATUS_SUCCESS;
}

FLT_POSTOP_CALLBACK_STATUS MiniPostCreate(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContec, FLT_POST_OPERATION_FLAGS Flags)
{
KdPrint(("post create running \r\n"));

return FLT_POSTOP_FINISHED_PROCESSING;
}

FLT_PREOP_CALLBACK_STATUS MiniPreCreate(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContec)
{
PFLT_FILE_NAME_INFORMATION FileNameInfo;
NTSTATUS status;
WCHAR Name[200] = { 0 };

status = FltGetFileNameInformation(Data, FLT_FILE_NAME_NORMALIZED | FLT_FILE_NAME_QUERY_DEFAULT, &FileNameInfo);

if (NT_SUCCESS(status))
{
status = FltParseFileNameInformation(FileNameInfo);

if (NT_SUCCESS(status))
{
if (FileNameInfo->Name.MaximumLength < 260)
{
RtlCopyMemory(Name, FileNameInfo->Name.Buffer, FileNameInfo->Name.MaximumLength);

KdPrint(("create file: %wa \r\n", Name));
}
}

FltReleaseFileNameInformation(FileNameInfo);
}

return FLT_PREOP_SUCCESS_WITH_CALLBACK;
}

FLT_PREOP_CALLBACK_STATUS MiniPreWrite(PFLT_CALLBACK_DATA Data, PCFLT_RELATED_OBJECTS FltObjects, PVOID* CompletionContec)
{
PFLT_FILE_NAME_INFORMATION FileNameInfo;
NTSTATUS status;
WCHAR Name[200] = { 0 };

status = FltGetFileNameInformation(Data, FLT_FILE_NAME_NORMALIZED | FLT_FILE_NAME_QUERY_DEFAULT, &FileNameInfo);

if (NT_SUCCESS(status))
{
status = FltParseFileNameInformation(FileNameInfo);

if (NT_SUCCESS(status))
{
if (FileNameInfo->Name.MaximumLength < 260)
{
RtlCopyMemory(Name, FileNameInfo->Name.Buffer, FileNameInfo->Name.MaximumLength);

_wcsupr(Name);

if (wcsstr(Name, L"OPENME.txt") != NULL)
{
KdPrint(("write file %ws blocked \r\n", Name));

Data->IoStatus.Status = STATUS_INVALID_PARAMETER;
Data->IoStatus.Information = 0;

FltReleaseFileNameInformation(FileNameInfo);

return FLT_PREOP_COMPLETE;
}

KdPrint(("create file: %wa \r\n", Name));
}
}

FltReleaseFileNameInformation(FileNameInfo);
}

return FLT_PREOP_SUCCESS_NO_CALLBACK;
}

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
NTSTATUS status;

status = FltRegisterFilter(DriverObject, &FilterRegistration, &FilterHandle);

if (NT_SUCCESS(status))
{
status = FltStartFiltering(FilterHandle);

if (!NT_SUCCESS(status))
{
FltUnregisterFilter(FilterHandle);
}
}

return status;
}

а также

;;;
;;; FsFilter2
;;;

[Version]
Signature   = "$Windows NT$"; TODO - Change the Class and ClassGuid to match the Load Order Group value, see https://msdn.microsoft.com/en-us/windows/hardware/gg462963
; Class       = "ActivityMonitor"                         ;This is determined by the work this filter driver does
; ClassGuid   = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2}    ;This value is determined by the Load Order Group value
Class = "ActivityMonitor"ClassGuid = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2}
Provider    = %ManufacturerName%
DriverVer = 01/26/2018,16.49.59.238
CatalogFile = FsFilter2.cat

[DestinationDirs]
DefaultDestDir          = 12
MiniFilter.DriverFiles  = 12            ;%windir%\system32\drivers

;;
;; Default install sections
;;

[DefaultInstall]
OptionDesc          = %ServiceDescription%
CopyFiles           = MiniFilter.DriverFiles

[DefaultInstall.Services]
AddService          = %ServiceName%,,MiniFilter.Service

;;
;; Default uninstall sections
;;

[DefaultUninstall]
DelFiles   = MiniFilter.DriverFiles

[DefaultUninstall.Services]
DelService = %ServiceName%,0x200      ;Ensure service is stopped before deleting

;
; Services Section
;

[MiniFilter.Service]
DisplayName      = %ServiceName%
Description      = %ServiceDescription%
ServiceBinary    = %12%\%DriverName%.sys        ;%windir%\system32\drivers\
Dependencies     = "FltMgr"ServiceType      = 2                            ;SERVICE_FILE_SYSTEM_DRIVER
StartType        = 3                            ;SERVICE_DEMAND_START
ErrorControl     = 1                            ;SERVICE_ERROR_NORMAL
; TODO - Change the Load Order Group value
; LoadOrderGroup = "FSFilter Activity Monitor"LoadOrderGroup = "FSFilter Activity Monitor"AddReg           = MiniFilter.AddRegistry

;
; Registry Modifications
;

[MiniFilter.AddRegistry]
HKR,,"DebugFlags",0x00010001 ,0x0
HKR,,"SupportedFeatures",0x00010001,0x3
HKR,"Instances","DefaultInstance",0x00000000,%DefaultInstance%
HKR,"Instances\"%Instance1.Name%,"Altitude",0x00000000,%Instance1.Altitude%
HKR,"Instances\"%Instance1.Name%,"Flags",0x00010001,%Instance1.Flags%

;
; Copy Files
;

[MiniFilter.DriverFiles]
%DriverName%.sys

[SourceDisksFiles]
FsFilter2.sys = 1,,

[SourceDisksNames]
1 = %DiskId1%,,,

;;
;; String Section
;;

[Strings]
; TODO - Add your manufacturer
ManufacturerName        = "Template"ServiceDescription      = "FsFilter2 Mini-Filter Driver"ServiceName             = "FsFilter2"DriverName              = "FsFilter2"DiskId1                 = "FsFilter2 Device Installation Disk"
;Instances specific information.
DefaultInstance         = "FsFilter2 Instance"Instance1.Name          = "FsFilter2 Instance"; TODO - Change the altitude value, see https://msdn.microsoft.com/en-us/windows/hardware/drivers/ifs/load-order-groups-and-altitudes-for-minifilter-drivers
Instance1.Altitude       = "371000"Instance1.Flags         = 0x0              ; Allow all attachments

Затем в свойствах проекта я установил следующие конфигурации:

  • Платформа: x64
  • C / C ++> Уровень предупреждения: Level1 (/ W1)
  • Linker> Обработать предупреждение Linker как ошибки: Нет (/ WX: NO)
  • Настройки драйвера> Целевая версия ОС: Windows 10 или выше
  • Настройки драйвера> Целевая платформа: рабочий стол

Затем я создаю приложение и получаю успешное сообщение с созданными файлами .inf и .sys.

Моя целевая машина — Windows 10 x64, и я уже установил опцию, позволяющую использовать драйверы без подписи.

Я запускаю следующую команду:

pnputil / add-driver FsFilter2.inf

И драйвер успешно установлен. Я получаю вывод:

Microsoft PnP Utility

Adding driver package:  FsFilter2.inf
Driver package added successfully.
Published Name:         oem73.inf

Total driver packages:  1
Added driver packages:  1

Затем я запускаю диск, выполнив:

чистый старт FsFilter2

И получите следующий вывод:

The FsFilter2 service was started successfully.

Тем не менее, я все еще могу записать в файл OPENME.txt … в то время как в учебнике это невозможно …

Я также использую DebugView и не вижу ни одного из своих сообщений в нем …

Кто-нибудь знает, что я делаю не так? или что я могу сделать, чтобы узнать мою проблему?

0

Решение

Я, конечно, надеюсь, что видео на YouTube не научило вас так поступать.
Здесь много ошибок, так много, что я бы прежде всего посоветовал вам сходить и посмотреть образцы минифильтров Microsoft.
Они расположены Вот
Более конкретно, я бы посоветовал вам проверить образец сканера или avscan, но последний немного сложнее.
Вкратце вот несколько предложений:

  1. Сделайте проверку в post-create не предварительной, поскольку файловый объект еще не открыт файловой системой ниже вас, и, таким образом, FltGetFileNameInformation сама сделает FltCreateFile, чтобы открыть файл для запроса имени
  2. В PostCreate также решите, хотите ли вы разрешить открытие этого файла. Вы должны проверить DesiredAccess, с которым сделано открытие, и если оно соответствует вашей маске, в этом случае FILE_GENERIC_WRITE просто отрицают создание. Увидеть с каким API отменить открытие файла а также где находится желаемый доступ
  3. Не забудьте установить Data-> IoStatus.Status в STATUS_ACCESS_DENIED поскольку STATUS_INVALID_PARAMETER довольно неоднозначно, и это не так.
  4. Не выполняйте никакую обработку в PreWrite для этого, поскольку это не нужно, если вы уже заблокировали Create.
  5. Не используйте небезопасные строковые функции, такие как wcsstr, возможно, стоит рассмотреть возможность использования API, которые доступны в ntstrsafe.h и они выполняют проверку границ на основе предоставленной длины, а не принимают символ NULL в конце.

Удачи, и надеюсь, это поможет.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]