首页
社区
课程
招聘
[分享] (win10 x64)CallBackList与ObjectType的关系,对象管理器回调函数地址的解析
2023-5-16 13:42 5361

[分享] (win10 x64)CallBackList与ObjectType的关系,对象管理器回调函数地址的解析

2023-5-16 13:42
5361


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的关系如下:


由上,可得出两种枚举系统中所注册的对象管理器回调函数的方法:

  1. 通过ObUnRegisterCallbacks参数所指向的 _CALLBACK_BODY->ListEntry 实现。

  2. 通过ObjectType->CallbackList实现。


参考博文:ObRegisterCallbacks的运用obregistercallbacks 线程回调sanqiuai的博客-CSDN博客


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞1
打赏
分享
最新回复 (2)
雪    币: 5811
活跃值: (3595)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
yimingqpa 1 2023-5-16 14:01
2
0
摘除太麻烦了,还要遍历!
直接特征码搜索对方回调函数,在目标函数头部直接返回。
雪    币: 2384
活跃值: (3964)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
ALwalker 2023-5-16 14:06
3
0
yimingqpa 摘除太麻烦了,还要遍历! 直接特征码搜索对方回调函数,在目标函数头部直接返回。
我只是想探究一下CallbakcList与对调函数之间的关系,没想那么多。。。
游客
登录 | 注册 方可回帖
返回