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

Added a cache to routine that looks for ActiveProcessLinks offset

This commit is contained in:
JKornev 2021-07-30 22:44:18 +03:00
parent 9e89ad1da0
commit 206258a6fe
4 changed files with 27 additions and 24 deletions

@ -71,6 +71,15 @@ NTSYSAPI NTSTATUS NTAPI ZwQueryInformationProcess(
_Out_opt_ PULONG ReturnLength _Out_opt_ PULONG ReturnLength
); );
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
PsLookupProcessByProcessId(
_In_ HANDLE ProcessId,
_Outptr_ PEPROCESS* Process
);
NTSTATUS QuerySystemInformation(SYSTEM_INFORMATION_CLASS Class, PVOID* InfoBuffer, PSIZE_T InfoSize); NTSTATUS QuerySystemInformation(SYSTEM_INFORMATION_CLASS Class, PVOID* InfoBuffer, PSIZE_T InfoSize);
NTSTATUS QueryProcessInformation(PROCESSINFOCLASS Class, HANDLE ProcessId, PVOID* InfoBuffer, PSIZE_T InfoSize); NTSTATUS QueryProcessInformation(PROCESSINFOCLASS Class, HANDLE ProcessId, PVOID* InfoBuffer, PSIZE_T InfoSize);
VOID FreeInformation(PVOID Buffer); VOID FreeInformation(PVOID Buffer);

@ -24,6 +24,8 @@ PsRulesContext g_hideProcessRules;
FAST_MUTEX g_processTableLock; FAST_MUTEX g_processTableLock;
KGUARDED_MUTEX g_activeProcListLock; KGUARDED_MUTEX g_activeProcListLock;
volatile ULONG g_activeProcessListOffset = 0;
typedef struct _ProcessListEntry { typedef struct _ProcessListEntry {
LPCWSTR path; LPCWSTR path;
ULONG inherit; ULONG inherit;
@ -48,15 +50,6 @@ CONST ProcessListEntry g_protectProcesses[] = {
UNICODE_STRING g_csrssPath; UNICODE_STRING g_csrssPath;
WCHAR g_csrssPathBuffer[CSRSS_PAHT_BUFFER_SIZE]; WCHAR g_csrssPathBuffer[CSRSS_PAHT_BUFFER_SIZE];
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
PsLookupProcessByProcessId(
_In_ HANDLE ProcessId,
_Outptr_ PEPROCESS* Process
);
BOOLEAN CheckProtectedOperation(HANDLE Source, HANDLE Destination) BOOLEAN CheckProtectedOperation(HANDLE Source, HANDLE Destination)
{ {
ProcessTableEntry srcInfo, destInfo; ProcessTableEntry srcInfo, destInfo;
@ -199,21 +192,31 @@ BOOLEAN FindActiveProcessLinksOffset(PEPROCESS Process, ULONG* Offset)
ULONG peak = 0x150; ULONG peak = 0x150;
#endif #endif
HANDLE* ptr = (HANDLE*)Process; HANDLE* ptr = (HANDLE*)Process;
HANDLE processId = PsGetProcessId(Process); HANDLE processId;
ULONG i; ULONG i;
if (g_activeProcessListOffset)
{
*Offset = g_activeProcessListOffset;
return TRUE;
}
processId = PsGetProcessId(Process);
// EPROCESS ActiveProcessLinks field is next to UniqueProcessId // EPROCESS ActiveProcessLinks field is next to UniqueProcessId
// ... // ...
// + 0x0b4 UniqueProcessId : Ptr32 Void // + 0x0b4 UniqueProcessId : Ptr32 Void
// + 0x0b8 ActiveProcessLinks : _LIST_ENTRY // + 0x0b8 ActiveProcessLinks : _LIST_ENTRY
// + 0x0c0 Flags2 : Uint4B // + 0x0c0 Flags2 : Uint4B
// ... // ...
for (i = 10; i < peak / sizeof(HANDLE); i++) for (i = 15; i < peak / sizeof(HANDLE); i++)
{ {
if (ptr[i] == processId) if (ptr[i] == processId)
{ {
*Offset = sizeof(HANDLE) * (i + 1); ULONG offset = sizeof(HANDLE) * (i + 1);
LogInfo("EPROCESS->ActiveProcessList offset is %x", *Offset); InterlockedExchange((LONG volatile*)&g_activeProcessListOffset, offset);
LogInfo("EPROCESS->ActiveProcessList offset is %x", offset);
*Offset = offset;
return TRUE; return TRUE;
} }
} }

@ -8,15 +8,6 @@ RTL_AVL_TABLE g_processTable;
RTL_AVL_TABLE g_hiddenProcessTable; RTL_AVL_TABLE g_hiddenProcessTable;
FAST_MUTEX g_hiddenProcessTableLock; FAST_MUTEX g_hiddenProcessTableLock;
_Must_inspect_result_
_IRQL_requires_max_(APC_LEVEL)
NTKERNELAPI
NTSTATUS
PsLookupProcessByProcessId(
_In_ HANDLE ProcessId,
_Outptr_ PEPROCESS* Process
);
_Function_class_(RTL_AVL_COMPARE_ROUTINE) _Function_class_(RTL_AVL_COMPARE_ROUTINE)
RTL_GENERIC_COMPARE_RESULTS CompareProcessTableEntry(struct _RTL_AVL_TABLE *Table, PVOID FirstStruct, PVOID SecondStruct) RTL_GENERIC_COMPARE_RESULTS CompareProcessTableEntry(struct _RTL_AVL_TABLE *Table, PVOID FirstStruct, PVOID SecondStruct)
{ {

@ -73,7 +73,7 @@
- Реализовать сокрытие процессов - Реализовать сокрытие процессов
+ Сделать видимыми скрытые процессы после выгрузки и /unhide + Сделать видимыми скрытые процессы после выгрузки и /unhide
- Улучшить алгоритм поиска офсета - Улучшить алгоритм поиска офсета
- Добавить конфигурацию в реестр + Добавить конфигурацию в реестр
- Реализовать сокрытие сервисов через scdb патч - Реализовать сокрытие сервисов через scdb патч
- Добавить тест для проверки сокрытия процессов - Добавить тест для проверки сокрытия процессов
- Решить проблему с %tu принтом лога на 32-бит драйвере + Решить проблему с %tu принтом лога на 32-бит драйвере