首页
社区
课程
招聘
[原创]ObCallback 回调钩子检测
发表于: 2013-12-20 13:58 18008

[原创]ObCallback 回调钩子检测

2013-12-20 13:58
18008

在 PatchGuard 的摧残下,通过 ObRegisterCallbacks 函数注册回调钩子已经成了 RK/ARK 中的主流技术之一。注册回调钩子的具体做法可以参考MSDN上的示例代码:http://code.msdn.microsoft.com/windowshardware/ObCallback-Sample-67a47841

今天研究了一下检测这类回调钩子的方法,发出来跟大家分享。本人水平有限,错漏之处还请大家指正。

首先关注的还是注册回调钩子时调用的 ObRegisterCallbacks 函数,MSDN上的函数声明如下:

NTSTATUS ObRegisterCallbacks(
  _In_   POB_CALLBACK_REGISTRATION CallBackRegistration,
  _Out_  PVOID *RegistrationHandle
);
Part1:
钩子数据结构的头部信息,如版本号,CallbackOperator 个数等

Part2:(这个部分的长度取决于该回调钩子包含多少个CallbackOperator)
钩子数据结构的CallbackOperator1 相关信息
钩子数据结构的CallbackOperator2 相关信息
……

Part3:
钩子数据结构的额外信息,如 Altitude 等

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 5
支持
分享
最新回复 (18)
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
2
占位学习下。
2013-12-20 14:40
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
PG,PG。好东西,坏东西
2013-12-20 18:11
0
雪    币: 270
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习学习@
2013-12-20 18:12
0
雪    币: 85
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习学习
2013-12-20 18:37
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
来留个mark
2013-12-20 18:52
0
雪    币: 66
活跃值: (960)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
留个mark
2013-12-20 22:37
0
雪    币: 2620
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
看楼主帖子清晰易懂
2013-12-21 09:07
0
雪    币: 882
活跃值: (350)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
值得学习啊
2013-12-21 10:06
0
雪    币: 199
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
留个mark
2013-12-21 10:15
0
雪    币: 4
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
DAY DAY UP
2013-12-21 10:30
0
雪    币: 8088
活跃值: (3964)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
12
不错的思路,学习了
2013-12-21 12:48
0
雪    币: 207
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
不用注册一个假钩子,你可以直接找到PsProcessType,
kd> dt _OBJECT_TYPE
nt!_OBJECT_TYPE
   +0x000 TypeList         : _LIST_ENTRY
   +0x008 Name             : _UNICODE_STRING
   +0x010 DefaultObject    : Ptr32 Void
   +0x014 Index            : UChar
   +0x018 TotalNumberOfObjects : Uint4B
   +0x01c TotalNumberOfHandles : Uint4B
   +0x020 HighWaterNumberOfObjects : Uint4B
   +0x024 HighWaterNumberOfHandles : Uint4B
   +0x028 TypeInfo         : _OBJECT_TYPE_INITIALIZER
   +0x078 TypeLock         : _EX_PUSH_LOCK
   +0x07c Key              : Uint4B
   +0x080 CallbackList     : _LIST_ENTRY
然后遍历CallbackList就行了~
2013-12-21 12:54
0
雪    币: 202
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
楼主逆向出来的那两个结构体是不是 OB_CALLBACK_REGISTRATIONOB_OPERATION_REGISTRATION
2013-12-22 00:59
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
15
内容差不多,CALLBACK_NODE描述的就是OB_CALLBACK_REGISTRATION,CALLBACK_BODY 描述的就是OB_OPERATION_REGISTRATION,只不过个别域的顺序不太一样,另外多了几个域,比如链表、ulXXX_000X000X 和 ulRefCount。

FC大牛睡得真晚……
2013-12-22 01:24
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
16
这个不错,改天试试!学习了!
2013-12-22 01:26
0
雪    币: 202
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
综合这里的信息,那个相邻的 ULONG 和 PWCHAR 应该确实是 OB_CALLBACK_REGISTRATION 里的那个 UNICODE_STRING,BODY 中间那个是个开关,结尾是个 EX_RUNDOWN_REF。

typedef struct _CALLBACK_BODY {
    LIST_ENTRY                  CallbackList;
    OB_OPERATION                Operations;
    ULONG                       Active;
    OB_HANDLE                   Handle;
    POBJECT_TYPE                ObjectType;
    POB_PRE_OPERATION_CALLBACK  PreOperation;
    POB_POST_OPERATION_CALLBACK PostOperation;
    EX_RUNDOWN_REF              RundownProtection;
} CALLBACK_BODY, *PCALLBACK_BODY;

typedef struct _CALLBACK_NODE {
    USHORT         Version;
    USHORT         OperationRegistrationCount;
    PVOID          RegistrationContext;
    UNICODE_STRING Altitude;
    CALLBACK_BODY  Entries[1];
} CALLBACK_NODE, *PCALLBACK_NODE;
2013-12-22 02:28
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
18
是的,这下就完整了
2013-12-22 03:09
0
雪    币: 77
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
国标 到此一游
2014-1-16 15:03
0
游客
登录 | 注册 方可回帖
返回
//