目录
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
);
PsSetCreateProcessNotifyRoutine
在 Windows 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
的回调函数,操作系统检测到关机的时候则会调用这个派遣函数
IoRegisterLastChanceShutdownNotification
和 IoRegisterShutdownNotification
的区别是 时机问题,前者会在文件系统刷新关闭之后调用,
后者则不是. 后者接受的通知比前者强. 关于文件系统刷新无法正确解释.举个例子自己体会. 后者关机回调里面可以设置注册表(注册表也可以说是文件,没刷新) 可以读写注册表的值. 而前者因为 文件系统刷新(可能处理了文件) 在回调里面操作注册表则不可以操作了. 包括打开 Key setvalue都会失败.
二丶未完待续
如果遇到新的回调则继续整理.目前已知是这些.
标签:PVOID,windows,钩子,NTSTATUS,内核,注册表,进程,回调 From: https://www.cnblogs.com/iBinary/p/16918110.html