【问题标题】:How to block an dll injection via Minifilter如何通过 Minifilter 阻止 dll 注入
【发布时间】:2020-05-19 08:08:21
【问题描述】:

我试图通过Minifilterblock .dll 注入(或一般注入)到特定进程中

这是我的 PreOperationCallback:

    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 文件的任何执行。过滤文件扩展名很容易被绕过...

我希望有人知道更多关于它的信息;)

【问题讨论】:

    标签: windows kernel driver kmdf minifilter


    【解决方案1】:

    微过滤器不适合这个。

    AcquireForSectionSync 在进程调用 CreateFileMapping/ZwCreateSection 时被调用。

    假设 ProcessA 想要将 DLL 注入 ProcessB。它可以创建一个远程线程,使 ProcessB 调用 LoadLibrary

    此时您的过滤器将看到 ProcessB 调用 AcquireForSection 同步,每个进程在启动时都会执行此操作,因为加载程序将加载所有基本 dll,例如:@987654322 @、kernel32 等...

    你想要的是 Ob 回调,例如:

    ObRegisterCallbacks function


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

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

    假设您有一个场景,ProcessA 想要通过某种 CreateRemoteThread/ReadWriteProcessMemoryProcessB 注入一些东西> 操纵。

    进程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 尝试调用时

    • 创建远程线程
    • ReadProcessMemory
    • WriteProcessMemory

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

    【讨论】:

    • ObCallBacks 是不够的。例如,SetWindowsHookEx() 将完全忽略回调。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2021-03-21
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    相关资源
    最近更新 更多