这个还是根据作者Tesla.Angela所开源的教程写的东西
其实这个东西windows7 应该是没有问题的 但是听说windows10 是不行的 除了要摘链 还是去搞掉一张表 这个比较麻烦 还有一点要注意的是 我们这里的进程 结构体 不一定是其它系统的结构体 因为windows 不同的版本 会重新定义很多数据结构 然后 有些大手子写的 驱动 会有硬编码什么的 就会导致蓝屏~~~~~~
然后 想找结构的话 可以用Windbg 或者 去微软官网查
然后 这里直接说原理吧
进程其实使用双向链表来存储的 学过数据结构的 应该很熟悉 在增删改查比较频繁的 一般都用链表 那么我们只需要把链表 给搞掉 就行了 就可以完成 隐藏的功能 而保护 是因为 把结构体的Flag 置位0之后 就用OpenProcess 返回失败
但是这样的话 会有几率蓝屏 所以一般正规软件都不会用 这个方法
下面放出 作者 Tesla.Angela的源代码
#include <ntddk.h>
#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是指向 前一个 链表结构
那么 我们让前面的 指向我们下一个 而 让后面的指向我们的前面哪一个 就可以了
这里我画了图 轻喷。。。。 希望能够让大家理解 然后我们 然后我们想要摘掉的 直接指向自己就可以了~~~~·