news 2026/7/22 3:24:21

Windows对象句柄回调 (Object Handle Callbacks)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows对象句柄回调 (Object Handle Callbacks)

Windows对象句柄回调 (Object Handle Callbacks)

对象句柄回调直接介入Windows对象管理器的工作流程,它允许我们在其它进程对进程、线程、桌面对象进行操作的前后执行自定义的回调函数。

关键函数

对象句柄回调的关键函数是ObRegisterCallbacks:

NTSTATUSObRegisterCallbacks([in]POB_CALLBACK_REGISTRATION CallbackRegistration,// 指向 OB_CALLBACK_REGISTRATION 结构体[out]PVOID*RegistrationHandle// 返回的注册句柄,用于卸载);

OB_CALLBACK_REGISTRATION结构体

这是注册信息的“根”结构,包含了所有注册的总体信息。

typedefstruct_OB_CALLBACK_REGISTRATION{USHORT Version;// 必须设置为 OB_FLT_REGISTRATION_VERSIONUSHORT OperationRegistrationCount;// 下面 OperationRegistration 数组的元素个数UNICODE_STRING Altitude;// 驱动程序的“高度”,用于确定回调的优先级PVOID RegistrationContext;// 驱动定义的上下文,会传递给回调函数POB_OPERATION_REGISTRATION OperationRegistration;// 指向一个结构体数组}OB_CALLBACK_REGISTRATION,*POB_CALLBACK_REGISTRATION;

Altitude 字段:这是一个关键的Unicode字符串,它决定了当多个驱动同时注册回调时,你的回调函数被调用的顺序。数值越高,优先级也越高,其 PreOperation 回调会更早被调用,PostOperation 回调会更晚被调用。

OB_OPERATION_REGISTRATION结构体

这个结构体用于指定你要监控的具体对象类型、操作类型以及对应的回调函数。

typedefstruct_OB_OPERATION_REGISTRATION{POBJECT_TYPE*ObjectType;// 对象类型: PsProcessType 或 PsThreadType 等OB_OPERATION Operations;// 操作类型: OB_OPERATION_HANDLE_CREATE 或 DUPLICATEPOB_PRE_OPERATION_CALLBACK PreOperation;// 操作前回调函数指针POB_POST_OPERATION_CALLBACK PostOperation;// 操作后回调函数指针}OB_OPERATION_REGISTRATION,*POB_OPERATION_REGISTRATION;
  • ObjectType:指定要监控的对象类型,通常是 PsProcessType(进程)或 PsThreadType(线程)。
  • Operations:指定要拦截的操作,可以是 OB_OPERATION_HANDLE_CREATE(创建句柄)或 OB_OPERATION_HANDLE_DUPLICATE(复制句柄)。

示例代码

下面这份代码用于防止notepad.exe进程被关闭:

/* * 这份代码用于测试ObRegisterCallbacks内核回调函数 * * 该份代码的作用是避免notepad.exe被终止 */#include<wdm.h>#include<ntstrsafe.h>EXTERN_C NTKERNELAPI UCHAR*PsGetProcessImageFileName(IN PEPROCESS Process);// 保存ObRegisterCallbacks返回的注册句柄,卸载时需要PVOID g_registrationHandle=nullptr;// 该函数在每一次进程句柄创建或者复制之前被调用OB_PREOP_CALLBACK_STATUSObPreCallback(PVOID RegistrationContext,POB_PRE_OPERATION_INFORMATION OperationInformation);voidDriverUnload(PDRIVER_OBJECT pDrvObj){// 注册成功,需要卸载if(g_registrationHandle!=nullptr){ObUnRegisterCallbacks(g_registrationHandle);g_registrationHandle=nullptr;DbgPrintEx(DPFLTR_IHVDRIVER_ID,DPFLTR_INFO_LEVEL,"[ObCallback] Callback unregistered.\n");}DbgPrintEx(DPFLTR_IHVDRIVER_ID,DPFLTR_INFO_LEVEL,"Uninstall driver\n");}EXTERN_C NTSTATUSDriverEntry(PDRIVER_OBJECT pDrvObj,PUNICODE_STRING pRegPath){pDrvObj->DriverUnload=DriverUnload;// 定义操作注册结构,告诉系统我们要监控什么对象和什么操作OB_OPERATION_REGISTRATION opReg={0};opReg.ObjectType=PsProcessType;opReg.Operations=OB_OPERATION_HANDLE_CREATE;opReg.PreOperation=ObPreCallback;opReg.PostOperation=nullptr;// 定义回调注册结构OB_CALLBACK_REGISTRATION cbReg={0};cbReg.Version=OB_FLT_REGISTRATION_VERSION;cbReg.OperationRegistrationCount=1;RtlInitUnicodeString(&cbReg.Altitude,L"600000");cbReg.RegistrationContext=nullptr;cbReg.OperationRegistration=&opReg;// 注册回调NTSTATUS status=ObRegisterCallbacks(&cbReg,&g_registrationHandle);if(!NT_SUCCESS(status)){DbgPrintEx(DPFLTR_IHVDRIVER_ID,DPFLTR_INFO_LEVEL,"ObRegisterCallbacks failed with status 0x%X\n",status);returnstatus;}DbgPrintEx(DPFLTR_IHVDRIVER_ID,DPFLTR_INFO_LEVEL,"ObRegisterCallbacks successfully\n");returnSTATUS_SUCCESS;}OB_PREOP_CALLBACK_STATUSObPreCallback(PVOID RegistrationContext,POB_PRE_OPERATION_INFORMATION OperationInformation){// 只对进程对象感兴趣,虽然注册的时候指定了类型,这里是为了确保安全if(OperationInformation->ObjectType!=*PsProcessType){returnOB_PREOP_SUCCESS;}PEPROCESS targetProcess=(PEPROCESS)OperationInformation->Object;if(!targetProcess){returnOB_PREOP_SUCCESS;}PCHAR processName=(PCHAR)PsGetProcessImageFileName(targetProcess);if(!processName){returnOB_PREOP_SUCCESS;}// 检查是否为notepad.exeif(_stricmp(processName,"notepad.exe")!=0){returnOB_PREOP_SUCCESS;}// 检查操作类型if(OperationInformation->Operation==OB_OPERATION_HANDLE_CREATE||OperationInformation->Operation==OB_OPERATION_HANDLE_DUPLICATE){// 检查请求的访问掩码中包含的权限是否包含终止权限ACCESS_MASK desireAccess=OperationInformation->Parameters->CreateHandleInformation.DesiredAccess;// 只检查创建句柄,大部分终止操作是通过OpenProcess产生if(OperationInformation->Operation==OB_OPERATION_HANDLE_CREATE){ACCESS_MASK desire=OperationInformation->Parameters->CreateHandleInformation.DesiredAccess;if(desire&0x0001){// 拒绝该操作,返回访问被拒绝DbgPrintEx(DPFLTR_IHVDRIVER_ID,DPFLTR_INFO_LEVEL,"[ObCallback] Blocked attempt to open notepad.exe \ with TERMINATE access.\n");OperationInformation->Parameters->CreateHandleInformation.DesiredAccess=0;// 清空权限returnOB_PREOP_SUCCESS;}}}returnOB_PREOP_SUCCESS;}

为了避免运行驱动时出现权限不足的报错,我们需要在项目属性中的链接器选项页面中,添加/INTEGRITYCHECK:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/22 3:23:02

Android SDK离线下载与更新全攻略

1. Android SDK离线下载与更新方案解析作为Android开发者&#xff0c;SDK管理是日常开发中最基础却最容易出问题的环节之一。最近在给团队搭建新的CI环境时&#xff0c;发现传统的在线SDK安装方式存在诸多痛点&#xff1a;网络不稳定导致构建失败、跨国下载速度缓慢、统一团队开…

作者头像 李华
网站建设 2026/7/22 3:22:03

深入解析EDMA3控制器:从事件队列管理到系统级性能调优

1. 项目概述&#xff1a;从硬件搬运工到系统性能的基石在嵌入式系统开发&#xff0c;尤其是涉及音视频处理、高速数据采集或网络通信的场景里&#xff0c;我们常常会面临一个核心矛盾&#xff1a;CPU的计算能力是宝贵的&#xff0c;但大量简单、重复的数据搬运工作&#xff08;…

作者头像 李华
网站建设 2026/7/22 3:21:47

【维克】条件概率与贝叶斯思维:如何根据新信息更新判断?

WHY&#xff1a;为什么你的交易判断总是"慢半拍"&#xff1f;你有没有过这种经历&#xff1f;• 看到某个技术指标金叉买入&#xff0c;结果行情转头向下&#xff0c;被套了• 听消息说某只股票要涨&#xff0c;追进去却被割了韭菜• 研究了很久的基本面&#xff0c;…

作者头像 李华
网站建设 2026/7/22 3:21:31

Objective-C性能优化实战:从原理到应用

1. OC底层知识之性能优化概述在移动开发领域&#xff0c;性能优化始终是开发者面临的核心挑战之一。Objective-C(OC)作为iOS/macOS开发的传统语言&#xff0c;其性能优化技巧对提升应用流畅度至关重要。我从事iOS开发多年&#xff0c;处理过数十个性能瓶颈案例&#xff0c;发现…

作者头像 李华
网站建设 2026/7/22 3:20:45

Windows下VSCode+CMake+MinGW+Ninja搭建现代C++开发环境实战

1. 项目概述与核心价值 最近在技术社区里看到一个用C实现的“雪花屏”效果&#xff0c;代码简洁但视觉效果很酷&#xff0c;不少朋友都想在Windows上复现一下。这个项目本质上是一个控制台动画程序&#xff0c;利用C标准库在命令行窗口里模拟雪花飘落的效果。听起来简单&#…

作者头像 李华
网站建设 2026/7/22 3:20:10

Redux核心原理与工程实践全解析

1. Redux核心设计理念解析Redux作为React生态中最具影响力的状态管理方案&#xff0c;其核心设计哲学源于Flux架构与函数式编程思想。我在2016年首次将Redux引入企业级项目时&#xff0c;最震撼的是其通过约2KB的代码量实现了整个应用状态的时空可追溯性。这种看似简单的设计背…

作者头像 李华