【问题标题】:Detect & Block Read/WriteProcessMemory calls from a Driver检测并阻止来自驱动程序的 Read/WriteProcessMemory 调用
【发布时间】:2019-01-04 14:33:16
【问题描述】:

您好,我对内核编程比较陌生(不过我有很多 c++ 开发经验)并且有一个我想要实现的目标:

检测并有条件地阻止用户态程序写入或读取位于我自己的用户态进程中的特定内存地址的尝试。这必须由驱动程序完成。

我已经设置了一个开发环境(运行最新的 windows 10 + virtualkd + windbg 的虚拟机)并且已经通过 Visual Studio 集成(通过局域网)成功部署了一个小型 kmdf 测试驱动程序。

所以我现在的问题是: 如何检测/拦截对我的 ring3 应用程序的 Read/WriteProcessMemory 调用?仅仅阻塞句柄是不够的。

如果有人可以通过链接(一个非过时的)示例或仅通过告诉我如何执行此操作来为我指明正确的方向,那就太好了。

更新: 阅读了很多关于过滤驱动程序和从内核模式挂钩 Windows API 的内容,但我真的不想弄乱 Patchguard 并且真的不知道如何过滤来自用户态的 RPM 调用。保护我的程序不受驱动程序的影响并不重要,只保护 ring3 应用程序。

谢谢你:)

【问题讨论】:

    标签: driver protection readprocessmemory kmdf filter-driver


    【解决方案1】:

    here 的这段代码应该可以解决问题。

    OB_PREOP_CALLBACK_STATUS PreCallback(PVOID RegistrationContext, 
    POB_PRE_OPERATION_INFORMATION OperationInformation)
        {
    UNREFERENCED_PARAMETER(RegistrationContext);
    
    PEPROCESS OpenedProcess = (PEPROCESS)OperationInformation->Object,
        CurrentProcess = PsGetCurrentProcess();
    
    PsLookupProcessByProcessId(ProtectedProcess, &ProtectedProcessProcess); // Getting the PEPROCESS using the PID 
    PsLookupProcessByProcessId(Lsass, &LsassProcess); // Getting the PEPROCESS using the PID 
    PsLookupProcessByProcessId(Csrss1, &Csrss1Process); // Getting the PEPROCESS using the PID 
    PsLookupProcessByProcessId(Csrss2, &Csrss2Process); // Getting the PEPROCESS using the PID 
    
    
    if (OpenedProcess == Csrss1Process) // Making sure to not strip csrss's Handle, will cause BSOD
        return OB_PREOP_SUCCESS;
    
    if (OpenedProcess == Csrss2Process) // Making sure to not strip csrss's Handle, will cause BSOD
        return OB_PREOP_SUCCESS;
    
    if (OpenedProcess == CurrentProcess) // make sure the driver isnt getting stripped ( even though we have a second check )
        return OB_PREOP_SUCCESS;
    
    if (OpenedProcess == ProtectedProcess) // Making sure that the game can open a process handle to itself
        return OB_PREOP_SUCCESS;
    
    if (OperationInformation->KernelHandle) // allow drivers to get a handle
        return OB_PREOP_SUCCESS;
    
    
    // PsGetProcessId((PEPROCESS)OperationInformation->Object) equals to the created handle's PID, so if the created Handle equals to the protected process's PID, strip
    if (PsGetProcessId((PEPROCESS)OperationInformation->Object) == ProtectedProcess)
    {
    
        if (OperationInformation->Operation == OB_OPERATION_HANDLE_CREATE) // striping handle 
        {
            OperationInformation->Parameters->CreateHandleInformation.DesiredAccess = (SYNCHRONIZE | PROCESS_QUERY_LIMITED_INFORMATION);
        }
        else
        {
            OperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess = (SYNCHRONIZE | PROCESS_QUERY_LIMITED_INFORMATION);
        }
    
        return OB_PREOP_SUCCESS;
    }
    }
    

    此代码一旦注册到 ObRegisterCallback,将检测何时为您的受保护进程创建了新句柄,如果它不是来自 Lsass、Csrss 或自身,则将终止它。这是为了防止蓝屏导致关键进程被拒绝处理 你的申请。

    【讨论】:

    • 感谢您的遮阳篷,但挡住把手是不行的。 id 真的很喜欢,至少,记录一个进程正在读取或写入的地址。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2016-04-05
    • 2020-12-19
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多