首页 > 系统相关 >windows内核下的回调钩子整理

windows内核下的回调钩子整理

时间:2022-11-23 14:26:47浏览次数:43  
标签:PVOID windows 钩子 NTSTATUS 内核 注册表 进程 回调

目录

windows内核下的回调钩子整理

一丶钩子

1.1 重新初始化钩子


void IoRegisterDriverReinitialization(
  [in]           PDRIVER_OBJECT       DriverObject,
  [in]           PDRIVER_REINITIALIZE DriverReinitializationRoutine,
  [in, optional] PVOID                Context
);

函数作用 可以在DriverEntry执行完毕之后,重新执行一次初始化的. 全驱动有且只能注册一个. 且 在DriverEntry 返回 STATUS_SUCCESS 之后才会被执行.

1.2 进程钩子

可以拦截进程,监控进程等等.

NTSTATUS PsSetCreateProcessNotifyRoutine(
  [in] PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
  [in] BOOLEAN                        Remove
);
NTSTATUS PsSetCreateProcessNotifyRoutineEx(
  [in] PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine,
  [in] BOOLEAN                           Remove
);
NTSTATUS PsSetCreateProcessNotifyRoutineEx2(
  [in] PSCREATEPROCESSNOTIFYTYPE NotifyType,
  [in] PVOID                     NotifyInformation,
  [in] BOOLEAN                   Remove
);

PsSetCreateProcessNotifyRoutineWindows 2000 开始提供 可以达到监视进程的目的

PsSetCreateProcessNotifyRoutineEx Windows Vista with SP1 and Windows Server 2008. 开始提供(Vista大于win7 也就是win7的前身,现在win7用的都不是很多了.所以后面可以使用此函数的.不用使用第一个了)

此函数可以达到 监视进程的目的 监控只能看,监视可以修改,比如拒绝进程启动.

PsSetCreateProcessNotifyRoutineEx2 比较新,在 Windows 10, version 1703 开始提供. 唯一区别有一个类型,作用和 Ex函数相似


原理:

上述API 其实本质都是将我们设置的函数设置到一个 数组中 而操作系统是通过 数组中 中记录的类型来识别 当前数组中的函数地址是哪个函数创建的. 类型分别是 2 4 6 如果是2 那么代表就是 PsSetCreateProcessNotifyRoutine 创建的, 那么操作系统调用我们的回调的时候就会按照回调函数的参数来进行传参.


2 4 6 是通过逆向得出的. 如果有兴趣做 钩子识别操作.那么就会使用到. 不保证后是否会改变.

1.3 线程钩子

使用方式跟进程钩子相似, 一个是监控,一个是监视.

NTSTATUS PsSetCreateThreadNotifyRoutine(
  [in] PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine
);
NTSTATUS PsSetCreateThreadNotifyRoutineEx(
  [in] PSCREATETHREADNOTIFYTYPE NotifyType,
  [in] PVOID                    NotifyInformation
);

1.4 模块回调监控

跟 进程 线程相似

NTSTATUS PsSetLoadImageNotifyRoutine(
  [in] PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine
);
NTSTATUS PsSetLoadImageNotifyRoutineEx(
  [in] PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine,
  [in] ULONG_PTR                  Flags
);

1.5 注册表的回调

注册回调

NTSTATUS CmRegisterCallback(
  [in]           PEX_CALLBACK_FUNCTION Function,
  [in, optional] PVOID                 Context,
  [out]          PLARGE_INTEGER        Cookie
);
NTSTATUS CmRegisterCallbackEx(
  [in]           PEX_CALLBACK_FUNCTION Function,
  [in]           PCUNICODE_STRING      Altitude,
  [in]           PVOID                 Driver,
  [in, optional] PVOID                 Context,
  [out]          PLARGE_INTEGER        Cookie,
                 PVOID                 Reserved
);

取消注册:

NTSTATUS CmUnRegisterCallback(
  [in] LARGE_INTEGER Cookie
);

基本没用过的(了解)

PVOID ExRegisterCallback(
  [in, out]      PCALLBACK_OBJECT   CallbackObject,
  [in]           PCALLBACK_FUNCTION CallbackFunction,
  [in, optional] PVOID              CallbackContext
);

1.6 进程保护

进程保护要注册保护回调. 然后里面可以控制进程的权限. 或者抹除权限.

注册:

NTSTATUS ObRegisterCallbacks(
  [in]  POB_CALLBACK_REGISTRATION CallbackRegistration,
  [out] PVOID                     *RegistrationHandle
);

取消注册:

void ObUnRegisterCallbacks(
  [in] PVOID RegistrationHandle
);

1.7 关机回调

可以监控关键回调.在关机的时候做一些处理.

注册:

NTSTATUS IoRegisterShutdownNotification(
  [in] PDEVICE_OBJECT DeviceObject
);

取消注册:

void IoUnregisterShutdownNotification(
  [in] PDEVICE_OBJECT DeviceObject
);

另一个注册回调(下面说区别)

NTSTATUS IoRegisterLastChanceShutdownNotification(
  [in] PDEVICE_OBJECT DeviceObject
);

用法:

注册好关机回调之后, 我们需要 在派遣函数中指定 IRP_MJ_SHUTDOWN 的回调函数,操作系统检测到关机的时候则会调用这个派遣函数

IoRegisterLastChanceShutdownNotificationIoRegisterShutdownNotification 的区别是 时机问题,前者会在文件系统刷新关闭之后调用,

后者则不是. 后者接受的通知比前者强. 关于文件系统刷新无法正确解释.举个例子自己体会. 后者关机回调里面可以设置注册表(注册表也可以说是文件,没刷新) 可以读写注册表的值. 而前者因为 文件系统刷新(可能处理了文件) 在回调里面操作注册表则不可以操作了. 包括打开 Key setvalue都会失败.





二丶未完待续

如果遇到新的回调则继续整理.目前已知是这些.

标签:PVOID,windows,钩子,NTSTATUS,内核,注册表,进程,回调
From: https://www.cnblogs.com/iBinary/p/16918110.html

相关文章

  • windows10 远程桌面黑屏
    【计算机配置】-【管理模板】-【Windows组件】-【远程桌面服务】-【远程桌面会话主机】-【远程会话环境】-{为远程桌面连接使用WDDM图形显示驱动程序-设置禁用}......
  • Windows2003英文版中文乱码问题的解决
    Windows2003英文版中文乱码问题的解决可以解决文件名乱码和文件内容乱码的问题。[1] 打开“控制面板”,双击“RegionalandLanguageOptions”图标,打开区域和语言设置窗口;[......
  • Windows Server 2003 为用户“NT AUTHORITY/NETWORK SERVICE”授予的权限不足,无法执行
    在VISTA,Win7,Server2008操作系统里建立SQL报表时使用reportview访问报表时提示下面错误:为用户“NTAUTHORITY/NETWORKSERVICE”授予的权限不足,无法执行此操作。(rsAcc......
  • 嵌入式操作系统内核原理和开发(总结篇)
      很多朋友都喜欢嵌入式操作系统的内容,但是如何实现和仿真这样一个系统一直是困扰我们的难题。现在郑重推荐一下raw-os系统,在我们的博客当中也多次提到了这个代码,希望大......
  • 嵌入式操作系统内核原理和开发(实时调度)
      和很多通用的操作系统相比,实时操作系统有自己的一个特点,那就是实时调度。通用操作系统的线程优先级一般是可以变化的,而实时系统的线程优先级却是不变的。之所以这么......
  • 嵌入式操作系统内核原理和开发(消息队列)
         消息队列是线程交互的一种方法,任务可以通过消息队列来实现数据的沟通和交换。在嵌入式系统上,这可以说这是用的最多的一种方法。通过消息队列,无论是发送者,还是接......
  • 嵌入式操作系统内核原理和开发(事件)
      在很多操作系统的书上,其实互斥和同步是放在一起进行介绍的。互斥,比较简单,就是对某一份资源或者几份资源进行抢占获取。而同步是什么意思呢,就是某一个线程等待另外一个......
  • 嵌入式操作系统内核原理和开发(地址空间)
      不管是什么样的嵌入式cpu,它必然有自己的访问地址空间。至于这个具体的访问空间是什么,那cpu就不知道了。它可以是ram,当然也可以是flash、uart、ide、i2c等。当然cpu不......
  • 嵌入式操作系统内核原理和开发(中断)
    系统。一旦你明白了中断的真正含义,你对操作系统的了解就算真正入门了。什么是中断呢?我们可以看看单片机下面是怎么做的。#include<REG51.h>sbitLED=P1^6;unsignedint......
  • 21.1 动态TLS--《Windows核心编程》
    应用程序通过调用一组4个函数来使用动态TLS,这些函数实际上最经常为DLL所使用。通常情况下,如果DLL使用TLS,那么当它用DLL_PROCESS_ATTACH标志调用它的DllMain函数时......