枚举与删除对象回调
对象回调存储在对应对象结构体里,简单来说,就是存储在 ObjectType. CallbackList 这
个双向链表里。但对象结构体在每个系统上都不一定相同。比如 WIN7X64 的结构体如下:
ntdll!_OBJECT_TYPE
+0x000 TypeList : _LIST_ENTRY
+0x010 Name : _UNICODE_STRING
+0x020 DefaultObject : Ptr64 Void
+0x028 Index : UChar
+0x02c TotalNumberOfObjects : Uint4B
+0x030 TotalNumberOfHandles : Uint4B
+0x034 HighWaterNumberOfObjects : Uint4B
+0x038 HighWaterNumberOfHandles : Uint4B
+0x040 TypeInfo : _OBJECT_TYPE_INITIALIZER
+0x0b0 TypeLock : _EX_PUSH_LOCK
+0x0b8 Key : Uint4B
+0x0c0 CallbackList : _LIST_ENTRY
Object.CallbackList->FLink 指向的地址,是一个结构体链表,它的定义如下:
typedef&n

本文介绍了Windows 64位驱动中对象回调的存储位置和枚举方法,重点关注了存在于 ObjectType.CallbackList 的双向链表。文章详细分析了_WIN7X64_环境下_OBJECT_TYPE 结构体,并提供了逆向得出的_OB_CALLBACK_结构体定义。作者还分享了在枚举过程中如何使用ObUnRegisterCallbacks以及通过修改回调函数地址来管理回调的三种方法,并提醒在禁用回调时要遵循先PostCall后PreCall的顺序,以免导致系统崩溃。
最低0.47元/天 解锁文章
1798

被折叠的 条评论
为什么被折叠?



