首页
社区
课程
招聘
[分享]OB_PREOP回调保护
发表于: 2026-3-7 00:51 712

[分享]OB_PREOP回调保护

2026-3-7 00:51
712

前言

OB_PREOP回调保护为微软提供的官方回调接口, 可用于拦截 进程\线程\桌面\句柄创建\句柄复制 等操作, 并且可以选择拦截类型如: 创建句柄\句柄复制等, 常预留于安全软件或反作弊软件, 其特点是微软官方支持所以非常稳定, 但缺点是人尽皆知, 所有人都可以用...

第一步: 初始化进程保护

第一步为注册回调注册信息, 其中Altitude为注册号, 数字越小优先级越高第二步为设置具体拦截操作, ObjectType可选: *PsProcessType;*PsThreadType;*PsJobType;*PsSiloContextPagedType;*PsSiloContextNonPagedType, Operations可选: OB_OPERATION_HANDLE_CREATE;OB_OPERATION_HANDLE_DUPLICATE, 其次PostOperation为是否注册 Post回调, Post回调:在操作 完成后执行, PreOperation为注册 Pre回调: 操作执行前

void InitCallBackProtect()
{
    //如已注册则返回 防止重复调用
    if (CallbackHandle != NULL) return;
    OB_CALLBACK_REGISTRATION ObCallback = { 0 };
    OB_OPERATION_REGISTRATION ObOperation = { 0 };
    //回调注册信息
    RtlInitUnicodeString(&ObCallback.Altitude, L"321000");//数字越小越先执行
    ObCallback.RegistrationContext = NULL;//注册上下文 可以存自定义数据
    ObCallback.Version = OB_FLT_REGISTRATION_VERSION;//回调接口版本 官方固定要求
    ObCallback.OperationRegistrationCount = 1;//注册多少个操作回调
    ObCallback.OperationRegistration = &ObOperation;//指向OB_OPERATION_REGISTRATION,如果多个指向数组

    //设置具体拦截哪种对象操作, 例如:进程\线程\桌面\句柄创建\句柄复制
    ObOperation.ObjectType = PsProcessType;//拦截进程
    ObOperation.Operations = OB_OPERATION_HANDLE_CREATE;//拦截操作类型:创建句柄
    ObOperation.PostOperation = NULL;//是否注册 Post回调, Post回调:在操作 完成后执行
    ObOperation.PreOperation = CallBack;//注册 Pre回调: 操作执行前	
    //注册回调, 参数二为以后注销需要
    ObRegisterCallbacks(&ObCallback, &CallbackHandle);
    PZY_PRINT("安装进程保护 CallbackHandle=%p", CallbackHandle);
}

第二步: 卸载保护方法

void UninstallCallBackProtect()
{
    if (CallbackHandle) {
        ObUnRegisterCallbacks(CallbackHandle);
        CallbackHandle = NULL;
        PZY_PRINT(L"卸载进程保护");
    }
}

第三步: 回调实现

这里简单判断是否为保护pid, 如果是则修改权限并写回

OB_PREOP_CALLBACK_STATUS CallBack( PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION OperationInformation)
{
    HANDLE pid = GetPidByEprocess((PEPROCESS)OperationInformation->Object);
    //判断是否为保护pid
    if (IsProtectPid(pid)) {
        ACCESS_MASK CurrentAccess = OperationInformation->Parameters->CreateHandleInformation.OriginalDesiredAccess;
        //修改权限
        CurrentAccess &= ~PROCESS_VM_READ;
        CurrentAccess &= ~PROCESS_VM_WRITE;
        CurrentAccess &= ~PROCESS_TERMINATE;
        //写回权限
        OperationInformation->Parameters->CreateHandleInformation.DesiredAccess = CurrentAccess;
    }
    return OB_PREOP_SUCCESS;
}

测试

测试依旧是选择CheatEngine, 在进程保护后可以看到已经获取不到图标了图片描述自然也搜索不到任何数据图片描述但是若是在保护前就已经创建了句柄, CheatEngine是能够正常访问的, 原因是回调处理发生在创建句柄时, 若是句柄已经创建成功后就不归回调管了

总结

OB_PREOP回调难度简单, 但只能保护某个事件发生的节点, 通常配合循环句柄降权使用效果最佳...


[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

最后于 4天前 被mb_binusgki编辑 ,原因: 补充内容
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回