Windows 如何通过Minifilter阻止dll注入

Windows 如何通过Minifilter阻止dll注入,windows,kernel,driver,kmdf,minifilter,Windows,Kernel,Driver,Kmdf,Minifilter,我试图通过 这是我的预约: if (Data->Iopb->MajorFunction == IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION) { /* Open file for writing/appending? */ if ((Data->Iopb->Parameters.Create.SecurityContext->DesiredAccess & PAGE_EXECUT

我试图通过

这是我的预约:

    if (Data->Iopb->MajorFunction == IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION) {
        /* Open file for writing/appending? */
        if ((Data->Iopb->Parameters.Create.SecurityContext->DesiredAccess & PAGE_EXECUTE) == PAGE_EXECUTE) {
            if (security) {
                DbgPrint("[ miniFilter ] [IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION] [ Blocked ]\n");
                Data->IoStatus.Status = STATUS_ACCESS_DENIED;
                return FLT_PREOP_COMPLETE;
            }
        }
        if ((Data->Iopb->Parameters.Create.SecurityContext->DesiredAccess & FILE_EXECUTE) == FILE_EXECUTE) {
            if (security) {
                DbgPrint("[ miniFilter ] [IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION] [ Blocked ]\n");
                Data->IoStatus.Status = STATUS_ACCESS_DENIED;
                return FLT_PREOP_COMPLETE;
            }
        }
    }
}
根据其他论坛
IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION
将在DLL注入时调用! 我也尝试过“IRP_MJ_CREATE”,但是我也阻止了
.exe
文件的任何执行。过滤文件扩展名可以很容易地绕过


我希望有人知道得更多;)

微型过滤器不适用于此

当进程调用CreateFileMapping/ZwCreateSection时,将调用AcquireForSectionSync

假设ProcessA希望将DLL注入ProcessB。它可以创建一个远程线程,使ProcessB调用装入库

此时,您的筛选器将看到ProcessB调用AcquireForSection同步,每个进程在启动时都会这样做,因为加载程序将加载所有基本DLL,如:
ntdll
kernel32
,等等

您需要的是Ob回调,例如:


ObRegisterCallbacks例程为线程、进程和桌面句柄操作注册回调例程列表

这些回调将允许您阻止一个进程打开另一个具有各种权限的进程

假设您有一个场景,其中ProcessA希望通过某种CreateRemoteThread/ReadWriteProcessMemory操作将某些内容注入ProcessB

过程a

OpenProcess(ProcessB, PROCESS_VM_...);

YouDriverObCallbackRoutine() {
   Check if ProcessA should have access it asks for ProcessB.
   If not you can simply strip away the access and return.
}
这将导致ProcessA有一个句柄,而没有ProcessB的那些权限

现在当ProcessA尝试调用

  • CreateRemoteThread
  • ReadProcessMemory
  • 写进程内存

在ProcessB上,系统将拒绝访问,因为句柄不再具有这些权限(您在Ob回调中剥夺了这些权限)。

ObCallBacks是不够的。例如,SetWindowsHookEx()将完全忽略回调。