6
0
mirror of https://github.com/JKornev/hidden synced 2024-06-16 03:58:04 +00:00

Added path conversion to NT path to the FS filter interface

This commit is contained in:
JKornev 2016-09-11 14:39:12 +03:00
parent 1fdfa70156
commit 184312875d
4 changed files with 146 additions and 38 deletions

@ -356,7 +356,7 @@ NTSTATUS IrpDeviceControlHandler(PDEVICE_OBJECT DeviceObject, PIRP Irp)
outputData = (PVOID)((UINT_PTR)outputBuffer + sizeof(result));
outputDataMaxSize = outputBufferMaxSize - sizeof(result);
// Important Limitation:
// Important limitation:
// Because both input (inputBuffer) and output data (outputData) are located in the same buffer there is a limitation for the output
// buffer usage. When a ioctl handler is executing, it can use the input buffer only until first write to the output buffer, because
// when you put data to the output buffer you can overwrite data in input buffer. Therefore if you gonna use both an input and output
@ -390,7 +390,7 @@ NTSTATUS IrpDeviceControlHandler(PDEVICE_OBJECT DeviceObject, PIRP Irp)
case HID_IOCTL_REMOVE_ALL_OBJECTS:
result.status = RemoveAllPsObjects((PHid_RemoveAllPsObjectsPacket)inputBuffer, (USHORT)inputBufferSize);
break;
//
// Other
default:
DbgPrint("FsFilter1!" __FUNCTION__ ": unknown IOCTL code:%08x\n", ioctl);
status = STATUS_INVALID_PARAMETER;

@ -2,14 +2,10 @@
+ Добавить поддержку фильтрации открытия и создания key
+ Добавить поддержку фильтрации перечисления key
+ Добавить поддержку фильтрации перечисления value
- Почистить Exclude List
+ Добавить в Exclude List поддержку case insensetive crc32 (если возможно, например русские буквы) (*Нет необхлжимости)
- Добавить в Exclude List для файлов такую же лексическую сортировку как и в реестру, возможно обьеденить ф-и
- Переписать всё на основе AVL или других buildin generic trees
+ Вынести fs filter и reg filter в отдельные файлы
+ Протестировать фишки с ObRegisterCallback
+ Стерание всех флагов
- Реализовать PsMonitor со всеми вытекающими
+ Реализовать PsMonitor со всеми вытекающими
+ Реализовать рабочий прототип
+ Для Exclude
+ Для Protected
@ -18,22 +14,27 @@
+ Реализовать интерфейс для File & Reg мониторов
+ Вынести Process Table в отдельный файл
+ Переименовать Process Tree в Process Table
- Протестировать интерфейсы
+ Добавить в HiddenCLI загрузку excluded и protected процессов
- Добавить проект HiddenTest
- Реализовать тесты в проекте HiddenTest
- Реализовать конвертирование NT path в кернел путь \\Deivce\\HardDisk..
+ Портировать в PsMonitor
- Портировать в Device API
+ FS filter
- Протестировать интерфейсы
+ Добавить в HiddenCLI загрузку excluded и protected процессов
+ Добавить проект HiddenTest
- Реализовать тесты в проекте HiddenTest
+ FS monitor
- Reg filter
- Ps filter
- Почистить Exclude List
+ Добавить в Exclude List поддержку case insensetive crc32 (если возможно, например русские буквы) (*Нет необхлжимости)
- Добавить в Exclude List для файлов такую же лексическую сортировку как и в реестру, возможно обьеденить ф-и
- Переписать всё на основе AVL или других buildin generic trees
- Реализовать конвертирование пути в пути драйвера
- Ps monitor
+ FS filter
- Reg filter
+ Реализовать RemoveAllExcludeListEntries
- Реализовать IOCTL протокол управления
- Реализовать usermode библиотеку для работы с IOCTL API
+ Реализовать usermode библиотеку для работы с IOCTL API
- Реализовать программу управления драйвером, средствами IOCTL API
+ Слинковать с IOCTL API lib
- Проверить работу на x64
- Портировать драйвер под архитектуру x64
- Залить проект на Git
+ Переименовать проект драйвера в Hidden
- Привести в порядок все версии билда Release, Debug, ...
@ -42,5 +43,7 @@
- Отреверсить установщик VMWare tools
- Сокрытие VMBox Tools
- Отреверсить установщик VMBox tools
- Реализовать поддержку вкл\выкл драйвера
- Реализовать steals mode
- Насодить на ETL и DbgPrintEx

@ -13,11 +13,42 @@ typedef struct _HidContextInternal {
HANDLE hdevice;
} HidContextInternal, *PHidContextInternal;
typedef struct _LSA_UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING;
typedef struct _RTL_RELATIVE_NAME {
UNICODE_STRING RelativeName;
HANDLE ContainingDirectory;
void* CurDirRef;
} RTL_RELATIVE_NAME, *PRTL_RELATIVE_NAME;
typedef BOOLEAN(NTAPI*RtlDosPathNameToRelativeNtPathName_U_Prototype)(
_In_ PCWSTR DosFileName,
_Out_ PUNICODE_STRING NtFileName,
_Out_opt_ PWSTR* FilePath,
_Out_opt_ PRTL_RELATIVE_NAME RelativeName
);
RtlDosPathNameToRelativeNtPathName_U_Prototype RtlDosPathNameToRelativeNtPathName_U = nullptr;
HidStatus Hid_Initialize(PHidContext pcontext)
{
HANDLE hdevice = INVALID_HANDLE_VALUE;
PHidContextInternal context;
if (!RtlDosPathNameToRelativeNtPathName_U)
{
*(FARPROC*)&RtlDosPathNameToRelativeNtPathName_U = GetProcAddress(
GetModuleHandleW(L"ntdll.dll"),
"RtlDosPathNameToRelativeNtPathName_U"
);
if (!RtlDosPathNameToRelativeNtPathName_U)
return HID_SET_STATUS(FALSE, GetLastError());
}
hdevice = CreateFileW(
DEVICE_WIN32_NAME,
GENERIC_READ | GENERIC_WRITE,
@ -50,7 +81,61 @@ void Hid_Destroy(HidContext context)
free(cntx);
}
HidStatus SendIoctl_HideObjectPacket(PHidContextInternal context, wchar_t* path, unsigned short type, HidObjId* objId)
bool ConvertToNtPath(const wchar_t* path, wchar_t* normalized, size_t normalizedLen)
{
UNICODE_STRING ntPath;
DWORD size;
bool result = false;
size = GetFullPathNameW(path, normalizedLen, normalized, NULL);
if (size == 0)
return false;
memset(&ntPath, 0, sizeof(ntPath));
if (RtlDosPathNameToRelativeNtPathName_U(normalized, &ntPath, NULL, NULL) == FALSE)
return false;
if (normalizedLen * sizeof(wchar_t) > ntPath.Length)
{
memcpy(normalized, ntPath.Buffer, ntPath.Length);
normalized[ntPath.Length / sizeof(wchar_t)] = L'\0';
result = true;
}
HeapFree(GetProcessHeap(), 0, ntPath.Buffer);
return result;
}
HidStatus AllocNormalizedPath(const wchar_t* path, wchar_t** normalized)
{
enum { NORMALIZATION_OVERHEAD = 32 };
wchar_t* buf;
size_t len;
len = wcslen(path) + NORMALIZATION_OVERHEAD;
buf = (wchar_t*)malloc(len * sizeof(wchar_t));
if (!buf)
return HID_SET_STATUS(FALSE, ERROR_NOT_ENOUGH_MEMORY);
if (!ConvertToNtPath(path, buf, len))
{
free(buf);
return HID_SET_STATUS(FALSE, ERROR_INVALID_DATA);
}
*normalized = buf;
return HID_SET_STATUS(TRUE, 0);
}
void FreeNormalizedPath(wchar_t* normalized)
{
free(normalized);
}
HidStatus SendIoctl_HideObjectPacket(PHidContextInternal context, const wchar_t* path, unsigned short type, HidObjId* objId)
{
PHid_HideObjectPacket hide;
Hid_StatusPacket result;
@ -139,7 +224,7 @@ HidStatus SendIoctl_UnhideAllObjectsPacket(PHidContextInternal context, unsigned
return HID_SET_STATUS(TRUE, 0);
}
HidStatus SendIoctl_AddPsObjectPacket(PHidContextInternal context, wchar_t* path, unsigned short type, HidPsInheritTypes inheritType, HidObjId* objId)
HidStatus SendIoctl_AddPsObjectPacket(PHidContextInternal context, const wchar_t* path, unsigned short type, HidPsInheritTypes inheritType, HidObjId* objId)
{
PHid_AddPsObjectPacket hide;
Hid_StatusPacket result;
@ -245,7 +330,7 @@ HidStatus Hid_GetState(HidContext context, HidActiveState* pstate)
// Registry hiding interface
HidStatus Hid_AddHiddenRegKey(HidContext context, wchar_t* regKey, HidObjId* objId)
HidStatus Hid_AddHiddenRegKey(HidContext context, const wchar_t* regKey, HidObjId* objId)
{
return SendIoctl_HideObjectPacket((PHidContextInternal)context, regKey, RegKeyObject, objId);
}
@ -260,7 +345,7 @@ HidStatus Hid_RemoveAllHiddenRegKeys(HidContext context)
return SendIoctl_UnhideAllObjectsPacket((PHidContextInternal)context, RegKeyObject);
}
HidStatus Hid_AddHiddenRegValue(HidContext context, wchar_t* regValue, HidObjId* objId)
HidStatus Hid_AddHiddenRegValue(HidContext context, const wchar_t* regValue, HidObjId* objId)
{
return SendIoctl_HideObjectPacket((PHidContextInternal)context, regValue, RegValueObject, objId);
}
@ -277,9 +362,19 @@ HidStatus Hid_RemoveAllHiddenRegValues(HidContext context)
// File system hiding interface
HidStatus Hid_AddHiddenFile(HidContext context, wchar_t* filePath, HidObjId* objId)
HidStatus Hid_AddHiddenFile(HidContext context, const wchar_t* filePath, HidObjId* objId)
{
return SendIoctl_HideObjectPacket((PHidContextInternal)context, filePath, FsFileObject, objId);
HidStatus status;
wchar_t* normalized;
status = AllocNormalizedPath(filePath, &normalized);
if (!HID_STATUS_SUCCESSFUL(status))
return status;
status = SendIoctl_HideObjectPacket((PHidContextInternal)context, normalized, FsFileObject, objId);
FreeNormalizedPath(normalized);
return status;
}
HidStatus Hid_RemoveHiddenFile(HidContext context, HidObjId objId)
@ -292,9 +387,19 @@ HidStatus Hid_RemoveAllHiddenFiles(HidContext context)
return SendIoctl_UnhideAllObjectsPacket((PHidContextInternal)context, FsFileObject);
}
HidStatus Hid_AddHiddenDir(HidContext context, wchar_t* dirPath, HidObjId* objId)
HidStatus Hid_AddHiddenDir(HidContext context, const wchar_t* dirPath, HidObjId* objId)
{
return SendIoctl_HideObjectPacket((PHidContextInternal)context, dirPath, FsDirObject, objId);
HidStatus status;
wchar_t* normalized;
status = AllocNormalizedPath(dirPath, &normalized);
if (!HID_STATUS_SUCCESSFUL(status))
return status;
status = SendIoctl_HideObjectPacket((PHidContextInternal)context, normalized, FsDirObject, objId);
FreeNormalizedPath(normalized);
return status;
}
HidStatus Hid_RemoveHiddenDir(HidContext context, HidObjId objId)
@ -309,7 +414,7 @@ HidStatus Hid_RemoveAllHiddenDirs(HidContext context)
// Process exclude interface
HidStatus Hid_AddExcludedImage(HidContext context, wchar_t* imagePath, HidPsInheritTypes inheritType, HidObjId* objId)
HidStatus Hid_AddExcludedImage(HidContext context, const wchar_t* imagePath, HidPsInheritTypes inheritType, HidObjId* objId)
{
return SendIoctl_AddPsObjectPacket((PHidContextInternal)context, imagePath, PsExcludedObject, inheritType, objId);
}
@ -341,7 +446,7 @@ HidStatus Hid_RemoveExcludedState(HidContext context, HidProcId procId)
// Process protect interface
HidStatus Hid_AddProtectedImage(HidContext context, wchar_t* imagePath, HidPsInheritTypes inheritType, HidObjId* objId)
HidStatus Hid_AddProtectedImage(HidContext context, const wchar_t* imagePath, HidPsInheritTypes inheritType, HidObjId* objId)
{
return SendIoctl_AddPsObjectPacket((PHidContextInternal)context, imagePath, PsProtectedObject, inheritType, objId);
}

@ -1,11 +1,11 @@
#pragma once
typedef unsigned int HidStatus;
typedef unsigned long long HidStatus;
#define HID_STATUS_SUCCESSFUL(status) (status & 1)
#define HID_STATUS_CODE(status) (status >> 1)
#define HID_STATUS_SUCCESSFUL(status) (status & 1)
#define HID_STATUS_CODE(status) (unsigned int)(status >> 1)
#define HID_SET_STATUS(state, code) (code << 1 | (state ? 1 : 0))
#define HID_SET_STATUS(state, code) (unsigned long long)(code << 1 | (state ? 1 : 0))
typedef void* HidContext;
typedef HidContext* PHidContext;
@ -36,32 +36,32 @@ HidStatus Hid_GetState(HidContext context, HidActiveState* pstate);
// Fs\Reg
HidStatus Hid_AddHiddenRegKey(HidContext context, wchar_t* regKey, HidObjId* objId);
HidStatus Hid_AddHiddenRegKey(HidContext context, const wchar_t* regKey, HidObjId* objId);
HidStatus Hid_RemoveHiddenRegKey(HidContext context, HidObjId objId);
HidStatus Hid_RemoveAllHiddenRegKeys(HidContext context);
HidStatus Hid_AddHiddenRegValue(HidContext context, wchar_t* regValue, HidObjId* objId);
HidStatus Hid_AddHiddenRegValue(HidContext context, const wchar_t* regValue, HidObjId* objId);
HidStatus Hid_RemoveHiddenRegValue(HidContext context, HidObjId objId);
HidStatus Hid_RemoveAllHiddenRegValues(HidContext context);
HidStatus Hid_AddHiddenFile(HidContext context, wchar_t* filePath, HidObjId* objId);
HidStatus Hid_AddHiddenFile(HidContext context, const wchar_t* filePath, HidObjId* objId);
HidStatus Hid_RemoveHiddenFile(HidContext context, HidObjId objId);
HidStatus Hid_RemoveAllHiddenFiles(HidContext context);
HidStatus Hid_AddHiddenDir(HidContext context, wchar_t* dirPath, HidObjId* objId);
HidStatus Hid_AddHiddenDir(HidContext context, const wchar_t* dirPath, HidObjId* objId);
HidStatus Hid_RemoveHiddenDir(HidContext context, HidObjId objId);
HidStatus Hid_RemoveAllHiddenDirs(HidContext context);
// Ps
HidStatus Hid_AddExcludedImage(HidContext context, wchar_t* imagePath, HidPsInheritTypes inheritType, HidObjId* objId);
HidStatus Hid_AddExcludedImage(HidContext context, const wchar_t* imagePath, HidPsInheritTypes inheritType, HidObjId* objId);
HidStatus Hid_RemoveExcludedImage(HidContext context, HidObjId objId);
HidStatus Hid_RemoveAllExcludedImages(HidContext context);
HidStatus Hid_GetExcludedState(HidContext context, HidProcId procId, HidActiveState* state, HidPsInheritTypes* inheritType);
HidStatus Hid_AttachExcludedState(HidContext context, HidProcId procId, HidPsInheritTypes inheritType);
HidStatus Hid_RemoveExcludedState(HidContext context, HidProcId procId);
HidStatus Hid_AddProtectedImage(HidContext context, wchar_t* imagePath, HidPsInheritTypes inheritType, HidObjId* objId);
HidStatus Hid_AddProtectedImage(HidContext context, const wchar_t* imagePath, HidPsInheritTypes inheritType, HidObjId* objId);
HidStatus Hid_RemoveProtectedImage(HidContext context, HidObjId objId);
HidStatus Hid_RemoveAllProtectedImages(HidContext context);
HidStatus Hid_GetProtectedState(HidContext context, HidProcId procId, HidActiveState* state, HidPsInheritTypes* inheritType);