x64内核:无PsSetNotify替代方案下的API拦截与回调结构修改

需积分: 0 0 下载量 72 浏览量 更新于2024-08-05 收藏 472KB PDF 举报
本文主要探讨了在x64架构的Windows操作系统中,当某些版本缺乏PsSetXXXNotifyRoutineEx类型的系统回调函数时,如何实现API拦截技术。系统回调在内核级别起着关键作用,允许驱动程序监控和控制特定操作,如进程创建、线程启动、模块加载、注册表操作、错误处理、系统关闭以及对象句柄管理。 在没有PsSetXXXNotifyRoutineEx版本的函数可用的情况下,驱动程序开发者需要通过以下策略来实现回调功能: 1. **获取相关结构**:首先,需要了解内核中用于这些操作的底层结构,比如对于创建进程和线程,可能涉及`_KPRCB`或`_KPRCB64`等结构,对于模块加载则可能是`PLDR_DATA`或`PLUGPLAY_LOAD_IMAGE_CALLBACK_DATA`。这些结构中包含回调函数的注册点。 2. **修改结构中的字段**:找到相应的回调指针或注册区域,将其替换为驱动程序自定义的回调函数地址,以便在内核空间中捕获并处理所需的事件。 3. **驱动卸载时的清理**:确保在驱动卸载时,通过调用对应的移除API,如`PsRemoveCreateThreadNotifyRoutine`,以解除之前设置的回调,避免内存泄漏或不必要的干扰。 - **注册API一览**: - **创建进程类**:`PsSetCreateProcessNotifyRoutine`用于设置进程创建通知。 - **创建线程类**:`PsSetCreateThreadNotifyRoutine`用于设置线程创建通知,`PsRemoveCreateThreadNotifyRoutine`用于移除。 - **加载模块类**:`PsSetLoadImageNotifyRoutine`和`PsRemoveLoadImageNotifyRoutine`处理模块加载和卸载。 - **注册表类**:`CmRegisterCallbackEx`用于注册和取消注册注册表操作回调。 - **错误检查类**:`KeRegisterBugCheckCallback`用于处理蓝屏错误通知。 - **关闭系统类**:`IoRegisterShutdownNotification`用于响应系统关机过程。 - **对象句柄操作类**:`ObRegisterCallbacks`用于对象操作的挂钩,如保护进程、线程不受恶意操作,涉及`OB_CALLBACK_REGISTRATION`结构。 在对象句柄操作类中,驱动通过`NTSTATUS ObRegisterCallbacks`函数注册回调,该函数接受`CallbackRegistration`结构(包含回调函数地址、处理上下文等),返回`RegistrationHandle`供后续注销使用。驱动必须指定`Version`(如`OB_FLT_REGISTRATION_VERSION`)、`OperationRegistrationCount`、`Altitude`(驱动的权限级别)和`RegistrationContext`等参数。 虽然某些版本的Windows内核可能不提供标准的回调API,但通过理解并利用底层内核结构和相关的注册/移除接口,驱动开发者可以巧妙地实现类似功能,确保在兼容性和安全性的前提下监控和干预关键操作。