ObRegisterCallbacks 例程注册线程、进程和桌面句柄操作的回调例程,该函数的输出型参数 `RegistrationHandle` 指向接收标识已注册回调例程集的值的变量的指针, 用于取消注册ObUnRegisterCallbacks(该结构体中必定含有所注册的回调函数地址)。
在使用ObRegisterCallbacks函数注册对象管理器的回调函数时,可在其相应的ObjectType结构体的CallbackList成员中得到回调对象的双向循环链表。但是该链表所链接的结构体微软并没有公开,但是该结构中必定含有所注册的回调函数地址。
通过各种搜索看贴文,终于找到了一篇!ObRegisterCallbacks的运用obregistercallbacks 线程回调sanqiuai的博客-CSDN博客
博文中给出了该未公开的结构体:
``` c
typedef struct _CALLBACK_NODE {
USHORT Version; // 版本号,目前是0x100, 可通过ObGetFilterVersion获取该值
USHORT CallbackBodyCount; //本节点上CallbackBody的数量
PVOID Context; // 注册回调时设定的0B_CALLBACK_REGISTRATION.RegistrationContext
UNICODE_STRING Altitude; // 指向Altitude字符串
CALLBACK_BODY CallbackBody[1]; // CALLBACK_BODY数组, 其元素个数为CallbackCount
} CALLBACK_NODE, * PCALLBACK_NODE;
typedef struct _CALLBACK_BODY {
LIST_ENTRY ListEntry;
/* 系统中同类型对象的的CALLBACK_NODE通过这个链表串在一起, 对应于_OBJECT_TYPE->TypeList */
OB_OPERATION Operations;
/* 注册回调时设定的OB_OPERATION_REGISTRATION.Operations成员(OB_OPERATION_HANDLE_CREATE... ) */
ULONG Active;
PCALLBACK_NODE CallbackNode; // 指向该CallbackBody
POBJECT_TYPE 0bjectType;
POB_PRE_OPERATION_CALLBACK PreCallbackRoutine;
POB_POST_OPERATION_CALLBACK PostCallbackRoutine;
EX_RUNDOWN_REF RundownProtection; // Run-down Protection
} CALLBACK_BODY, * PCALLBACK_BODY;
```
根据该结构体的描述,每个所注册的回调函数存储在一个名为 `_CALLBACK_BODY ` 的结构体中,其成员 `0bjectType` 指向其相应的ObjectType对象,成员 ` ListEntry` 链接该类型对象的所有_CALLBACK_BODY。相应的,ObjectType->CallbackList与之完全相同!
以Process类型的ObjectType为例,成员CallbackList链表中0xffffb9803d278cb0成员恰好是自己调用ObRegisterCallbacks函数注册的对调函数所生成的`__CALLBACK_NODE` 结构,其 `_CALLBACK_BODY` 的地址为0xffffb9803d278c90(__CALLBACK_NODE的长度为0x20)。
`_CALLBACK_NODE` 和 `_CALLBACK_BODY` 的结构如下:
+ Verson:0x100
+ CallbackBodyCount:1
+ Context:0x12345678,自己指定的
+ ListEntry:对应于ObjectType->CallbackList
+ Operations:OB_OPERATION_HANDLE_CREATE
+ CallbackNode:指向所属的_CALLBACK_NODE
+ PreCallbackRoutine/PostCallbackRoutine
可以看到,PreCallbackRoutine成员指针指向了我们自己注册的回调函数地址。
ObjectType与CallBackObject的关系如下:
由上,可得出两种枚举系统中所注册的对象管理器回调函数的方法:
通过ObUnRegisterCallbacks参数所指向的 _CALLBACK_BODY->ListEntry 实现。
通过ObjectType->CallbackList实现。
参考博文:ObRegisterCallbacks的运用obregistercallbacks 线程回调sanqiuai的博客-CSDN博客
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)