-
-
[原创]通过ObRegisterCallbacks学习对象监控与反对象监控
-
发表于:
2021-10-27 16:18
26207
-
[原创]通过ObRegisterCallbacks学习对象监控与反对象监控
实现环境是WIN7 X86。
要实现的目标是对进程对象和线程对象实现监控来保护目标进程不被任务管理器关掉。
在Windows中可以通过ObRegisterCallbacks来设置对象监控,该函数的定义如下
OB_CALLBACK_REGISTRATION结构体的定义如下
OB_OPERATION_REGISTRATION结构体定义如下
指向触发回调例程的对象类型的指针。它指定以下值之一
PsProcessType:用于进程句柄操作
PsThreadType:用于线程句柄操作
ExDesktopObjectType:用于桌面句柄操作。此值在WIN10之前的系统中不支持
指定以下一个或多个标志:
OB_OPERATION_HANDLE_CREATE:已打开或将要打开一个新的进程,线程或桌面句柄
OB_OPERATION_HANDLE_DUPLICATE:已复制或将要复制进程,线程或桌面句柄
ObjectPreCallback和ObjectPostCallback的定义如下,它们的参数是一样的,只是返回值不同
RegistrationContext
最后在介绍一个函数,它可以根据线程对象获得进程对象。该函数的定义如下
根据以上内容就可以实现对进程的保护,具体代码如下
系统设置的对象回调函数会存储在一个名头CallbackList表头的双向链表里,它存储着系统上所有ObRegisterCallbacks对象回调地址,包括操作前和操作后的回调函数地址以及对象回调句柄信息。CallbackList双向链表的结构定义如下
如果想要获取进程回调的双向链表信息,可以从*PsProcessType中获取。要获得线程回调的双向链表信息,可以从*PsThreadType中获取。*PsProcessType和*PsThreadType的数据结构类型为POBJECT_TYPE,定义如下
最后一个成员CallbackList就是双向链表表头。而倒数第四个成员的类型为OBJECT_TYPE_INITIALIZER,它的定义如下
所以可以从*PsProcessType和*PsThreadType中获得链表头,然后遍历链表找到对应的句柄对象在调用ObUnRegisterCallbacks将回调删除,具体代码如下
设置回调以后想要关闭进程就会失败
将回调删除以后就可以正常关闭进程
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2022-1-19 10:40
被1900编辑
,原因: