当前位置: 首页 > news >正文

Windows驱动开发实战:用ObRegisterCallbacks实现进程与文件操作的监控与拦截(含完整代码)

Windows内核安全开发实战:基于ObRegisterCallbacks的进程与文件监控体系构建

在Windows内核安全领域,进程创建监控和文件操作拦截是构建主动防御系统的核心技术。本文将深入探讨如何利用ObRegisterCallbacks机制实现这两大核心功能,并分享在实际反作弊系统和终端检测响应(EDR)产品中的实战经验。

1. ObRegisterCallbacks机制深度解析

ObRegisterCallbacks是Windows内核提供的一种对象管理器回调机制,允许驱动程序在进程/线程句柄操作发生时进行拦截。与传统的PsSetCreateProcessNotifyRoutine相比,它具有以下显著优势:

  • 操作前拦截:能在句柄创建前进行干预,而不仅仅是事后通知
  • 细粒度控制:可修改访问权限(DesiredAccess),实现精确管控
  • 多对象类型支持:不仅限于进程,还支持文件、注册表等内核对象

关键数据结构解析:

typedef struct _OB_CALLBACK_REGISTRATION { USHORT Version; USHORT OperationRegistrationCount; UNICODE_STRING Altitude; PVOID RegistrationContext; OB_OPERATION_REGISTRATION *OperationRegistration; } OB_CALLBACK_REGISTRATION; typedef struct _OB_OPERATION_REGISTRATION { POBJECT_TYPE *ObjectType; OB_OPERATION Operations; POB_PRE_OPERATION_CALLBACK PreOperation; POB_POST_OPERATION_CALLBACK PostOperation; } OB_OPERATION_REGISTRATION;

典型初始化流程:

NTSTATUS RegisterProcessCallback() { OB_CALLBACK_REGISTRATION obReg; OB_OPERATION_REGISTRATION opReg; RtlZeroMemory(&obReg, sizeof(obReg)); obReg.Version = ObGetFilterVersion(); obReg.OperationRegistrationCount = 1; obReg.RegistrationContext = NULL; RtlInitUnicodeString(&obReg.Altitude, L"100000"); RtlZeroMemory(&opReg, sizeof(opReg)); opReg.ObjectType = PsProcessType; opReg.Operations = OB_OPERATION_HANDLE_CREATE; opReg.PreOperation = ProcessCallback; PVOID RegistrationHandle; return ObRegisterCallbacks(&obReg, &RegistrationHandle); }

2. 进程监控实战:从基础到高级防护

2.1 基础进程创建监控

最基本的进程监控回调函数实现:

OB_PREOP_CALLBACK_STATUS ProcessCallback( PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION OperationInfo) { if (OperationInfo->Operation == OB_OPERATION_HANDLE_CREATE) { PEPROCESS Process = (PEPROCESS)OperationInfo->Object; HANDLE ProcessId = PsGetProcessId(Process); PCHAR ImageName = PsGetProcessImageFileName(Process); DbgPrint("Process handle created: PID=%d, Name=%s\n", ProcessId, ImageName); } return OB_PREOP_SUCCESS; }

2.2 高级访问权限控制

在游戏反作弊系统中,经常需要限制调试器对游戏进程的访问权限:

OB_PREOP_CALLBACK_STATUS ProcessCallback(...) { // 检查是否为受保护进程 if (IsProtectedProcess(OperationInfo->Object)) { // 移除危险权限 OperationInfo->Parameters->CreateHandleInformation.DesiredAccess &= ~(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION); // 特殊情况下完全拒绝访问 if (IsDebuggerProcess(PsGetCurrentProcess())) { return OB_PREOP_DISALLOW; } } return OB_PREOP_SUCCESS; }

常见需要限制的进程权限标志:

访问权限标志风险描述
PROCESS_VM_READ允许读取进程内存
PROCESS_VM_WRITE允许写入进程内存
PROCESS_VM_OPERATION允许操作虚拟内存(VirtualAlloc等)
PROCESS_CREATE_THREAD允许创建远程线程
PROCESS_SUSPEND_RESUME允许暂停/恢复进程

2.3 进程隐藏技术实现

通过断链ActiveProcessLinks实现进程隐藏:

VOID HideProcess(PEPROCESS Process) { KIRQL irql = KeRaiseIrqlToDpcLevel(); // 从进程链表中移除目标进程 PLIST_ENTRY prev = Process->ActiveProcessLinks.Blink; PLIST_ENTRY next = Process->ActiveProcessLinks.Flink; prev->Flink = next; next->Blink = prev; // 初始化自己的链表指针,避免BSOD InitializeListHead(&Process->ActiveProcessLinks); KeLowerIrql(irql); }

注意:现代Windows版本会验证EPROCESS结构体的完整性,单纯的断链可能触发PatchGuard。更稳妥的做法是在回调中过滤进程枚举请求。

3. 文件操作监控与拦截

3.1 文件回调注册

文件监控需要先启用文件对象的回调支持:

BOOLEAN RegisterFileCallback() { // 启用文件对象回调支持 ((POBJECT_TYPE)*IoFileObjectType)->TypeInfo.SupportsObjectCallbacks = TRUE; OB_CALLBACK_REGISTRATION obReg = {0}; obReg.Version = ObGetFilterVersion(); obReg.OperationRegistrationCount = 1; RtlInitUnicodeString(&obReg.Altitude, L"321000"); OB_OPERATION_REGISTRATION opReg = {0}; opReg.ObjectType = IoFileObjectType; opReg.Operations = OB_OPERATION_HANDLE_CREATE; opReg.PreOperation = FileCallback; return NT_SUCCESS(ObRegisterCallbacks(&obReg, &gFileCallbackHandle)); }

3.2 敏感文件访问拦截

防止调试工具访问游戏核心文件:

OB_PREOP_CALLBACK_STATUS FileCallback(...) { PFILE_OBJECT FileObject = OperationInfo->Object; // 验证对象有效性 if (!FileObject->FileName.Buffer || !MmIsAddressValid(FileObject->DeviceObject)) return OB_PREOP_SUCCESS; // 获取DOS设备名 UNICODE_STRING DosName; RtlVolumeDeviceToDosName(FileObject->DeviceObject, &DosName); // 检查是否为敏感文件 if (IsSensitiveFile(FileObject->FileName.Buffer)) { // 修改为无效参数使后续操作失败 FileObject->Size = 1; OperationInfo->Parameters->CreateHandleInformation.DesiredAccess = DELETE; return OB_PREOP_SUCCESS; } return OB_PREOP_SUCCESS; }

常见需要保护的文件特征:

  • 调试器相关:*.exe(OllyDbg, x64dbg, CheatEngine等)
  • 游戏核心文件:*.pak,*.data, 配置文件和DLL
  • 反作弊模块:反作弊驱动和DLL文件

4. 注册表操作监控

虽然ObRegisterCallbacks不直接支持注册表,但可以结合CmRegisterCallback实现全面防护:

NTSTATUS RegistryCallback( PVOID CallbackContext, PVOID Argument1, PVOID Argument2) { REG_NOTIFY_CLASS notifyClass = (REG_NOTIFY_CLASS)Argument1; switch (notifyClass) { case RegNtPreCreateKeyEx: case RegNtPreOpenKeyEx: { PREG_CREATE_KEY_INFORMATION info = (PREG_CREATE_KEY_INFORMATION)Argument2; if (IsProtectedKey(info->RootObject)) { return STATUS_ACCESS_DENIED; } break; } // 处理其他注册表操作类型... } return STATUS_SUCCESS; }

关键注册表操作类型:

操作类型描述
RegNtPreCreateKeyEx创建注册表项前
RegNtPreOpenKeyEx打开注册表项前
RegNtPreQueryValueKey查询键值前
RegNtPreSetValueKey设置键值前

5. 实战中的问题与解决方案

5.1 回调卸载时机

不正确的回调卸载会导致系统不稳定。推荐做法:

VOID DriverUnload(PDRIVER_OBJECT DriverObject) { // 先禁用所有回调功能 g_ShuttingDown = TRUE; // 等待所有回调执行完成 LARGE_INTEGER interval; interval.QuadPart = -10000 * 1000; // 1秒 KeDelayExecutionThread(KernelMode, FALSE, &interval); // 正式卸载回调 if (g_ProcessCallbackHandle) { ObUnRegisterCallbacks(g_ProcessCallbackHandle); } // 其他资源清理... }

5.2 性能优化技巧

  • 快速路径判断:在回调开头进行快速过滤
if (!IsGameProcess(PsGetCurrentProcess())) { return OB_PREOP_SUCCESS; }
  • 避免阻塞操作:回调中严禁使用可能导致阻塞的API
  • 缓存常用数据:如进程黑白名单可缓存在非分页内存中

5.3 对抗逆向分析

  • 混淆回调函数:通过动态计算函数指针增加分析难度
  • 定期变更Altitude:防止被特定Altitude的驱动绕过
  • 完整性检查:监控自身回调是否被恶意移除

6. 完整示例代码

一个整合进程保护和文件监控的驱动示例:

#include <ntddk.h> #include <ntstrsafe.h> PVOID g_ProcessCallbackHandle = NULL; PVOID g_FileCallbackHandle = NULL; OB_PREOP_CALLBACK_STATUS ProcessCallback(...) { // 实现见上文 } OB_PREOP_CALLBACK_STATUS FileCallback(...) { // 实现见上文 } NTSTATUS RegisterCallbacks() { // 注册进程回调 OB_CALLBACK_REGISTRATION obReg = {0}; obReg.Version = ObGetFilterVersion(); obReg.OperationRegistrationCount = 1; RtlInitUnicodeString(&obReg.Altitude, L"100000"); OB_OPERATION_REGISTRATION opReg = {0}; opReg.ObjectType = PsProcessType; opReg.Operations = OB_OPERATION_HANDLE_CREATE; opReg.PreOperation = ProcessCallback; NTSTATUS status = ObRegisterCallbacks(&obReg, &g_ProcessCallbackHandle); if (!NT_SUCCESS(status)) { return status; } // 注册文件回调 ((POBJECT_TYPE)*IoFileObjectType)->TypeInfo.SupportsObjectCallbacks = TRUE; RtlInitUnicodeString(&obReg.Altitude, L"321000"); opReg.ObjectType = IoFileObjectType; opReg.PreOperation = FileCallback; return ObRegisterCallbacks(&obReg, &g_FileCallbackHandle); } VOID UnregisterCallbacks() { if (g_ProcessCallbackHandle) { ObUnRegisterCallbacks(g_ProcessCallbackHandle); } if (g_FileCallbackHandle) { ObUnRegisterCallbacks(g_FileCallbackHandle); } } NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { DriverObject->DriverUnload = DriverUnload; return RegisterCallbacks(); } VOID DriverUnload(PDRIVER_OBJECT DriverObject) { UnregisterCallbacks(); }

在实际产品中,我们还需要考虑:

  • 与用户态组件的通信机制
  • 配置的热加载能力
  • 完善的日志记录系统
  • 对抗恶意卸载的保护措施

通过合理运用ObRegisterCallbacks机制,开发者可以构建强大的内核级监控系统,为安全产品和游戏反作弊提供坚实的技术基础。

http://www.jsqmd.com/news/575717/

相关文章:

  • 提升开发效率:利用快马快速构建openclaw批量文本处理流水线
  • PyTorch 2.8镜像入门指南:NumPy/Pandas数据预处理加速技巧分享
  • Qwen3-ASR-0.6B部署避坑指南:CUDA版本冲突、音频解码失败、Streamlit CORS问题解决
  • Windows 系统CPU个数
  • 告别C#,我用Python+PyWin32给AutoCAD写脚本,效率翻倍了
  • JiYuTrainer:提升学习效率与自主控制的教学工具解决方案
  • 2026年豆包排名优化服务商深度测评——传声港新媒体平台:以全链路服务筑牢AI时代品牌增长根基 - 博客湾
  • 从零构建SVPWM:Simulink仿真实践与谐波优化分析
  • KMS激活技术的自动化解决方案:KMS_VL_ALL_AIO的实现原理与企业应用
  • 大模型写论文的突破与陷阱
  • Shopee虾皮轻出海项目是本土店铺吗?一文说清虾皮轻出海项目与跨境店铺区别! - 跨境小媛
  • M3u8Downloader_H 完整指南:专业流媒体视频下载与处理深度解析
  • Beyond Compare 5 无限制使用指南:从评估模式到专业授权的完整方案
  • 2026年豆包排名优化公司实力首选最新指南 - 博客湾
  • 测试右移的复仇:上线后bug如何让公司赔光融资
  • 大模型赋能游戏开发的五大场景
  • POIKit 2024:如何用5步实现大规模POI数据采集与智能处理
  • 大健康食品包装机采购指南:森富智能VS国际品牌,谁是您的性价比最优解? - 品牌推荐大师
  • 3个突破方案:ncmdumpGUI如何破解NCM格式播放限制难题
  • Qwen3-ForcedAligner-0.6B保姆级教程:HTTP API返回status code异常处理
  • 2026年波形护栏厂家品牌推荐榜哪家好——四川互悦交通设施上榜 - 深度智识库
  • 市面上耐用的防火板品牌推荐及选择参考 - 品牌排行榜
  • 773批量将图片垂直方向分割为指定数量的图片
  • 【2026最新】CrystalDiskInfo官网下载 | 专业硬盘检测工具(保姆级,图文并茂) - xiema
  • 自建视频平台解决方案:基于H-Player V2的开源播放工具实践指南
  • 释放系统潜能:Win11Debloat工具让电脑性能提升30%的技术解析与应用指南
  • 3分钟上手PCL2-CE:打造专属Minecraft启动环境的完整指南
  • 2025-2026年全球金相显微镜品牌厂家评测:五家口碑产品推荐比较知名 - 十大品牌推荐
  • EasyEEPROM:嵌入式EEPROM类型安全持久化库
  • Linux双网卡配置实战:从基础到高级设置