前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >windows内核下的回调钩子整理

windows内核下的回调钩子整理

作者头像
IBinary
发布2022-11-28 15:48:48
1K0
发布2022-11-28 15:48:48
举报
文章被收录于专栏:逆向技术逆向技术

目录

windows内核下的回调钩子整理

一丶钩子

1.1 重新初始化钩子

代码语言:javascript
复制
void IoRegisterDriverReinitialization(
  [in]           PDRIVER_OBJECT       DriverObject,
  [in]           PDRIVER_REINITIALIZE DriverReinitializationRoutine,
  [in, optional] PVOID                Context
);

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

1.2 进程钩子

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

代码语言:javascript
复制
NTSTATUS PsSetCreateProcessNotifyRoutine(
  [in] PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
  [in] BOOLEAN                        Remove
);
代码语言:javascript
复制
NTSTATUS PsSetCreateProcessNotifyRoutineEx(
  [in] PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine,
  [in] BOOLEAN                           Remove
);
代码语言:javascript
复制
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 线程钩子

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

代码语言:javascript
复制
NTSTATUS PsSetCreateThreadNotifyRoutine(
  [in] PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine
);
代码语言:javascript
复制
NTSTATUS PsSetCreateThreadNotifyRoutineEx(
  [in] PSCREATETHREADNOTIFYTYPE NotifyType,
  [in] PVOID                    NotifyInformation
);

1.4 模块回调监控

跟 进程 线程相似

代码语言:javascript
复制
NTSTATUS PsSetLoadImageNotifyRoutine(
  [in] PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine
);
代码语言:javascript
复制
NTSTATUS PsSetLoadImageNotifyRoutineEx(
  [in] PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine,
  [in] ULONG_PTR                  Flags
);

1.5 注册表的回调

注册回调

代码语言:javascript
复制
NTSTATUS CmRegisterCallback(
  [in]           PEX_CALLBACK_FUNCTION Function,
  [in, optional] PVOID                 Context,
  [out]          PLARGE_INTEGER        Cookie
);
代码语言:javascript
复制
NTSTATUS CmRegisterCallbackEx(
  [in]           PEX_CALLBACK_FUNCTION Function,
  [in]           PCUNICODE_STRING      Altitude,
  [in]           PVOID                 Driver,
  [in, optional] PVOID                 Context,
  [out]          PLARGE_INTEGER        Cookie,
                 PVOID                 Reserved
);

取消注册:

代码语言:javascript
复制
NTSTATUS CmUnRegisterCallback(
  [in] LARGE_INTEGER Cookie
);

基本没用过的(了解)

代码语言:javascript
复制
PVOID ExRegisterCallback(
  [in, out]      PCALLBACK_OBJECT   CallbackObject,
  [in]           PCALLBACK_FUNCTION CallbackFunction,
  [in, optional] PVOID              CallbackContext
);

1.6 进程保护

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

注册:

代码语言:javascript
复制
NTSTATUS ObRegisterCallbacks(
  [in]  POB_CALLBACK_REGISTRATION CallbackRegistration,
  [out] PVOID                     *RegistrationHandle
);

取消注册:

代码语言:javascript
复制
void ObUnRegisterCallbacks(
  [in] PVOID RegistrationHandle
);

1.7 关机回调

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

注册:

代码语言:javascript
复制
NTSTATUS IoRegisterShutdownNotification(
  [in] PDEVICE_OBJECT DeviceObject
);

取消注册:

代码语言:javascript
复制
void IoUnregisterShutdownNotification(
  [in] PDEVICE_OBJECT DeviceObject
);

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

代码语言:javascript
复制
NTSTATUS IoRegisterLastChanceShutdownNotification(
  [in] PDEVICE_OBJECT DeviceObject
);

用法:

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

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

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

二丶未完待续

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • windows内核下的回调钩子整理
    • 一丶钩子
      • 1.1 重新初始化钩子
      • 1.2 进程钩子
      • 1.3 线程钩子
      • 1.4 模块回调监控
      • 1.5 注册表的回调
      • 1.6 进程保护
      • 1.7 关机回调
    • 二丶未完待续
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档