紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 291|回复: 9

《WIN64驱动教程》补充[15]:OBJECT HOOK的实现

[复制链接]

854

主题

3481

帖子

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
36100
发表于 2014-7-10 09:55:31 | 显示全部楼层 |阅读模式
作者:Tesla.Angela

顾名思义,OBJECT HOOK就是对OBJECT的Procedure进行的HOOK。
这是一种比较冷门的HOOK,知道的人不多。但在特定用途下比较有用(貌似现在是游戏保护用的比较多)。
在WIN64封锁各种内核HOOK的情况下,OBJECT HOOK是唯一一种修改NTOS代码而不PG检查的HOOK。
直到WIN8X64,微软才封锁了这种内核HOOK,但至少能在WIN7X64上用。
目前,在网上搜到的OBJECT HOOK代码大多是只能用于XP还有大量内嵌汇编的垃圾代码。
现在XP已经走进了历史的垃圾堆,下面我就讲解一下适用于NT6(32、64通用)的OBJECT HOOK代码。
要弄OBJECT HOOK,首先要知道HOOK点在哪里,下面直接用WINDBG演示(以CmKeyObjectType为例):

获得CmKeyObjectType的地址:
  1. lkd> dq CmKeyObjectType
  2. fffff800`01d57050  fffffa80`18da67b0 00000000`00000000 <-第一个QWORD就是地址
  3. fffff800`01d57060  01000409`01000100 fffff8a0`000015c0
  4. fffff800`01d57070  fffffa80`18d41d80 fffffa80`18ddba90
  5. fffff800`01d57080  fffff8a0`0000c140 00000000`00000000
  6. fffff800`01d57090  00000001`01000000 00000000`00000000
  7. fffff800`01d570a0  fffff8a0`02221000 00000804`01000000
  8. fffff800`01d570b0  00000000`00000014 00000000`00000007
  9. fffff800`01d570c0  fffff980`0000001c fffffe20`00000000
复制代码

查看_OBJECT_TYPE信息:
  1. lkd> dt_object_type fffffa80`18da67b0
  2. ntdll!_OBJECT_TYPE
  3.    +0x000 TypeList         : _LIST_ENTRY [ 0xfffffa80`18da67b0 - 0xfffffa80`18da67b0 ]
  4.    +0x010 Name             : _UNICODE_STRING "Key"
  5.    +0x020 DefaultObject    : 0xfffff800`01a399e0
  6.    +0x028 Index            : 0x23 '#'
  7.    +0x02c TotalNumberOfObjects : 0x3da
  8.    +0x030 TotalNumberOfHandles : 0x3d5
  9.    +0x034 HighWaterNumberOfObjects : 0x611
  10.    +0x038 HighWaterNumberOfHandles : 0x60c
  11.    +0x040 TypeInfo         : _OBJECT_TYPE_INITIALIZER
  12.    +0x0b0 TypeLock         : _EX_PUSH_LOCK
  13.    +0x0b8 Key              : 0x2079654b
  14.    +0x0c0 CallbackList     : _LIST_ENTRY [ 0xfffffa80`18da6870 - 0xfffffa80`18da6870 ]
复制代码

展开_OBJECT_TYPE_INITIALIZER的信息:
  1. lkd> dt_OBJECT_TYPE_INITIALIZER fffffa80`18da67b0+40
  2. ntdll!_OBJECT_TYPE_INITIALIZER
  3.    +0x000 Length           : 0x70
  4.    +0x002 ObjectTypeFlags  : 0xc ''
  5.    +0x002 CaseInsensitive  : 0y0
  6.    +0x002 UnnamedObjectsOnly : 0y0
  7.    +0x002 UseDefaultObject : 0y1
  8.    +0x002 SecurityRequired : 0y1
  9.    +0x002 MaintainHandleCount : 0y0
  10.    +0x002 MaintainTypeList : 0y0
  11.    +0x002 SupportsObjectCallbacks : 0y0
  12.    +0x004 ObjectTypeCode   : 0
  13.    +0x008 InvalidAttributes : 0x30
  14.    +0x00c GenericMapping   : _GENERIC_MAPPING
  15.    +0x01c ValidAccessMask  : 0x1f003f
  16.    +0x020 RetainAccess     : 0
  17.    +0x024 PoolType         : 1 ( PagedPool )
  18.    +0x028 DefaultPagedPoolCharge : 0xb0
  19.    +0x02c DefaultNonPagedPoolCharge : 0
  20.    +0x030 DumpProcedure    : (null)
  21.    +0x038 OpenProcedure    : (null)
  22.    +0x040 CloseProcedure   : 0xfffff800`01b63ac0     void  nt!CmpCloseKeyObject+0
  23.    +0x048 DeleteProcedure  : 0xfffff800`01b61d00     void  nt!CmpDeleteKeyObject+0
  24.    +0x050 ParseProcedure   : 0xfffff800`01b5b500     long  nt!CmpParseKey+0  <-要HOOK的是这个函数
  25.    +0x058 SecurityProcedure : 0xfffff800`01b292e0     long  nt!CmpSecurityMethod+0
  26.    +0x060 QueryNameProcedure : 0xfffff800`01b4ff64     long  nt!CmpQueryKeyName+0
  27.    +0x068 OkayToCloseProcedure : (null)
复制代码

可见每个OBJECT都有8个Procedure,它们每个Procedure的函数原型各不相同(具体原型可以在WRK中找到)。但每个OBJECT的Procedure函数原型是一样的。举例来说,CmKeyObjectType和IoFileObjectType的ParseProcedure的原型是一样的。下面的代码演示的是禁止打开RUN键,如果注册表打开会弹出错误。PCHUNTER打开不会报错,但显示不了子键和键值了(除非用解析HIVE的方法才行)。
游客,如果您要查看本帖隐藏内容请回复

7

主题

59

帖子

0

精华

金牌会员

Rank: 4Rank: 4Rank: 4Rank: 4

积分
844
发表于 2014-7-10 10:35:23 | 显示全部楼层
{:soso_e142:}

0

主题

31

帖子

0

精华

铂金会员

Rank: 5

积分
1773
发表于 2014-7-10 11:13:26 | 显示全部楼层
已阅,多谢老大提供

0

主题

37

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
61
发表于 2024-1-1 20:13:08 | 显示全部楼层
学习了

0

主题

29

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
87
发表于 2024-1-1 20:20:26 | 显示全部楼层
感谢分享。

8

主题

76

帖子

0

精华

钻石会员

Rank: 6Rank: 6

积分
4115
发表于 2024-1-9 15:44:51 | 显示全部楼层
抄一抄

0

主题

47

帖子

0

精华

贵宾会员

Rank: 2Rank: 2

积分
89
发表于 2024-1-26 17:40:33 | 显示全部楼层
2024补充学习

0

主题

21

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
53
发表于 2024-2-6 13:48:02 | 显示全部楼层
感谢分析,受教了

0

主题

45

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
53
发表于 2024-3-18 09:46:50 | 显示全部楼层
感谢分享

1

主题

117

帖子

0

精华

金牌会员

Rank: 4Rank: 4Rank: 4Rank: 4

积分
854
发表于 2024-3-29 10:20:40 | 显示全部楼层
感谢楼主,学习一下。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2024-4-28 20:22 , Processed in 0.028671 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表