diff --git a/Hidden/PsMonitor.c b/Hidden/PsMonitor.c index a07c43a..19226a3 100644 --- a/Hidden/PsMonitor.c +++ b/Hidden/PsMonitor.c @@ -35,15 +35,15 @@ OB_PREOP_CALLBACK_STATUS ProcessPreCallback(PVOID RegistrationContext, POB_PRE_O if (OperationInformation->KernelHandle) return OB_PREOP_SUCCESS; + + if (!IsProcessProtected(PsGetProcessId(OperationInformation->Object))) + return OB_PREOP_SUCCESS; - DbgPrint("FsFilter1!" __FUNCTION__ ": !!!!! Process: %d(%d:%d), Oper: %s, Space: %s\n", + DbgPrint("FsFilter1!" __FUNCTION__ ": !!!!! Process: %d(%d:%d), Oper: %s, Space: %s\n", PsGetProcessId(OperationInformation->Object), PsGetCurrentProcessId(), PsGetCurrentThreadId(), (OperationInformation->Operation == OB_OPERATION_HANDLE_CREATE ? "create" : "dup"), (OperationInformation->KernelHandle ? "kernel" : "user") ); - - if (!IsProcessProtected(PsGetProcessId(OperationInformation->Object))) - return OB_PREOP_SUCCESS; if (IsProcessProtected(PsGetCurrentProcessId())) { @@ -68,15 +68,15 @@ OB_PREOP_CALLBACK_STATUS ThreadPreCallback(PVOID RegistrationContext, POB_PRE_OP if (OperationInformation->KernelHandle) return OB_PREOP_SUCCESS; - DbgPrint("FsFilter1!" __FUNCTION__ ": Thread: %d(%d:%d), Oper: %s, Space: %s\n", + if (!IsProcessProtected(PsGetProcessId(OperationInformation->Object))) + return OB_PREOP_SUCCESS; + + DbgPrint("FsFilter1!" __FUNCTION__ ": Thread: %d(%d:%d), Oper: %s, Space: %s\n", PsGetThreadId(OperationInformation->Object), PsGetCurrentProcessId(), PsGetCurrentThreadId(), (OperationInformation->Operation == OB_OPERATION_HANDLE_CREATE ? "create" : "dup"), (OperationInformation->KernelHandle ? "kernel" : "user") ); - if (!IsProcessProtected(PsGetProcessId(OperationInformation->Object))) - return OB_PREOP_SUCCESS; - if (IsProcessProtected(PsGetCurrentProcessId())) { DbgPrint("FsFilter1!" __FUNCTION__ ": !!!!! allow protected thread %d\n", PsGetCurrentProcessId()); @@ -379,7 +379,36 @@ NTSTATUS DestroyPsMonitor() NTSTATUS AddProtectedImage(PUNICODE_STRING ImagePath, ULONG InheritType, PULONGLONG ObjId) { - return AddRuleToPsRuleList(g_protectProcessRules, ImagePath, InheritType, ObjId); + const USHORT maxBufSize = ImagePath->Length + NORMALIZE_INCREAMENT; + UNICODE_STRING normalized; + NTSTATUS status; + + normalized.Buffer = (PWCH)ExAllocatePool(PagedPool, maxBufSize); + normalized.Length = 0; + normalized.MaximumLength = maxBufSize; + + if (!normalized.Buffer) + { + DbgPrint("FsFilter1!" __FUNCTION__ ": error, can't allocate buffer\n"); + return STATUS_MEMORY_NOT_ALLOCATED; + } + + status = NormalizeDevicePath(ImagePath, &normalized); + if (!NT_SUCCESS(status)) + { + DbgPrint("FsFilter1!" __FUNCTION__ ": path normalization failed with code:%08x, path:%wZ\n", status, ImagePath); + ExFreePool(normalized.Buffer); + return status; + } + + DbgPrint("FsFilter1!" __FUNCTION__ ": protect image: %wZ\n", &normalized); + status = AddRuleToPsRuleList(g_protectProcessRules, &normalized, InheritType, ObjId); + + ExFreePool(normalized.Buffer); + + return status; + //DbgPrint("FsFilter1!" __FUNCTION__ ": protect image: %wZ\n", ImagePath); + //return AddRuleToPsRuleList(g_protectProcessRules, ImagePath, InheritType, ObjId); } NTSTATUS GetProtectedProcessState(HANDLE ProcessId, PULONG InheritType, PBOOLEAN Enable) @@ -433,7 +462,34 @@ NTSTATUS RemoveAllProtectedImages() NTSTATUS AddExcludedImage(PUNICODE_STRING ImagePath, ULONG InheritType, PULONGLONG ObjId) { - return AddRuleToPsRuleList(g_excludeProcessRules, ImagePath, InheritType, ObjId); + const USHORT maxBufSize = ImagePath->Length + NORMALIZE_INCREAMENT; + UNICODE_STRING normalized; + NTSTATUS status; + + normalized.Buffer = (PWCH)ExAllocatePool(PagedPool, maxBufSize); + normalized.Length = 0; + normalized.MaximumLength = maxBufSize; + + if (!normalized.Buffer) + { + DbgPrint("FsFilter1!" __FUNCTION__ ": error, can't allocate buffer\n"); + return STATUS_MEMORY_NOT_ALLOCATED; + } + + status = NormalizeDevicePath(ImagePath, &normalized); + if (!NT_SUCCESS(status)) + { + DbgPrint("FsFilter1!" __FUNCTION__ ": path normalization failed with code:%08x, path:%wZ\n", status, ImagePath); + ExFreePool(normalized.Buffer); + return status; + } + + DbgPrint("FsFilter1!" __FUNCTION__ ": exclude image: %wZ\n", &normalized); + status = AddRuleToPsRuleList(g_excludeProcessRules, &normalized, InheritType, ObjId); + + ExFreePool(normalized.Buffer); + + return status; } NTSTATUS GetExcludedProcessState(HANDLE ProcessId, PULONG InheritType, PBOOLEAN Enable) diff --git a/Hidden/RegFilter.c b/Hidden/RegFilter.c index 41e483e..48eea6b 100644 --- a/Hidden/RegFilter.c +++ b/Hidden/RegFilter.c @@ -618,13 +618,7 @@ NTSTATUS DestroyRegistryFilter() NTSTATUS AddHiddenRegKey(PUNICODE_STRING KeyPath, PULONGLONG ObjId) { - NTSTATUS status; - - // TODO: normalize registry key path - - status = AddExcludeListRegistryKey(g_excludeRegKeyContext, KeyPath, ObjId); - - return status; + return AddExcludeListRegistryKey(g_excludeRegKeyContext, KeyPath, ObjId); } NTSTATUS RemoveHiddenRegKey(ULONGLONG ObjId) @@ -639,13 +633,7 @@ NTSTATUS RemoveAllHiddenRegKeys() NTSTATUS AddHiddenRegValue(PUNICODE_STRING ValuePath, PULONGLONG ObjId) { - NTSTATUS status; - - // TODO: normalize registry value path - - status = AddExcludeListRegistryValue(g_excludeRegValueContext, ValuePath, ObjId); - - return status; + return AddExcludeListRegistryValue(g_excludeRegValueContext, ValuePath, ObjId); } NTSTATUS RemoveHiddenRegValue(ULONGLONG ObjId) diff --git a/Hidden/todo.txt b/Hidden/todo.txt index b420991..c801617 100644 --- a/Hidden/todo.txt +++ b/Hidden/todo.txt @@ -19,22 +19,25 @@ + Добавить проект HiddenTest - Реализовать тесты в проекте HiddenTest + FS monitor - - Reg filter + + Reg filter - Ps filter -- Добавить в Reg filter поддержку всех возможных операций над value - - set value - - delete value - - query value - - query multiple value ++ Добавить в Reg filter поддержку всех возможных операций над value + + set value + + delete value + + query value + + query multiple value - Почистить Exclude List + Добавить в Exclude List поддержку case insensetive crc32 (если возможно, например русские буквы) (*Нет необхлжимости) - Добавить в Exclude List для файлов такую же лексическую сортировку как и в реестру, возможно обьеденить ф-и - Переписать всё на основе AVL или других buildin generic trees -- Реализовать конвертирование пути в пути драйвера - - Ps monitor ++ Реализовать конвертирование пути в пути драйвера + + Ps monitor + FS filter - - Reg filter + + Reg filter + Реализовать RemoveAllExcludeListEntries +- Реализовать все ф-и Ps monitor + - Добавить в библиотеку поддержку get\set state + - Решить проблему с protected (возможно разрешить создавать такие процессы только из protected\system) - Реализовать IOCTL протокол управления + Реализовать usermode библиотеку для работы с IOCTL API - Реализовать программу управления драйвером, средствами IOCTL API