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:
parent
1fdfa70156
commit
184312875d
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user