Tesla.Angela 发表于 2014-7-10 09:55:31

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

作者: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的地址:
lkd> dq CmKeyObjectType
fffff800`01d57050fffffa80`18da67b0 00000000`00000000 <-第一个QWORD就是地址
fffff800`01d5706001000409`01000100 fffff8a0`000015c0
fffff800`01d57070fffffa80`18d41d80 fffffa80`18ddba90
fffff800`01d57080fffff8a0`0000c140 00000000`00000000
fffff800`01d5709000000001`01000000 00000000`00000000
fffff800`01d570a0fffff8a0`02221000 00000804`01000000
fffff800`01d570b000000000`00000014 00000000`00000007
fffff800`01d570c0fffff980`0000001c fffffe20`00000000
查看_OBJECT_TYPE信息:
lkd> dt_object_type fffffa80`18da67b0
ntdll!_OBJECT_TYPE
   +0x000 TypeList         : _LIST_ENTRY [ 0xfffffa80`18da67b0 - 0xfffffa80`18da67b0 ]
   +0x010 Name             : _UNICODE_STRING "Key"
   +0x020 DefaultObject    : 0xfffff800`01a399e0
   +0x028 Index            : 0x23 '#'
   +0x02c TotalNumberOfObjects : 0x3da
   +0x030 TotalNumberOfHandles : 0x3d5
   +0x034 HighWaterNumberOfObjects : 0x611
   +0x038 HighWaterNumberOfHandles : 0x60c
   +0x040 TypeInfo         : _OBJECT_TYPE_INITIALIZER
   +0x0b0 TypeLock         : _EX_PUSH_LOCK
   +0x0b8 Key            : 0x2079654b
   +0x0c0 CallbackList   : _LIST_ENTRY [ 0xfffffa80`18da6870 - 0xfffffa80`18da6870 ]
展开_OBJECT_TYPE_INITIALIZER的信息:
lkd> dt_OBJECT_TYPE_INITIALIZER fffffa80`18da67b0+40
ntdll!_OBJECT_TYPE_INITIALIZER
   +0x000 Length         : 0x70
   +0x002 ObjectTypeFlags: 0xc ''
   +0x002 CaseInsensitive: 0y0
   +0x002 UnnamedObjectsOnly : 0y0
   +0x002 UseDefaultObject : 0y1
   +0x002 SecurityRequired : 0y1
   +0x002 MaintainHandleCount : 0y0
   +0x002 MaintainTypeList : 0y0
   +0x002 SupportsObjectCallbacks : 0y0
   +0x004 ObjectTypeCode   : 0
   +0x008 InvalidAttributes : 0x30
   +0x00c GenericMapping   : _GENERIC_MAPPING
   +0x01c ValidAccessMask: 0x1f003f
   +0x020 RetainAccess   : 0
   +0x024 PoolType         : 1 ( PagedPool )
   +0x028 DefaultPagedPoolCharge : 0xb0
   +0x02c DefaultNonPagedPoolCharge : 0
   +0x030 DumpProcedure    : (null)
   +0x038 OpenProcedure    : (null)
   +0x040 CloseProcedure   : 0xfffff800`01b63ac0   voidnt!CmpCloseKeyObject+0
   +0x048 DeleteProcedure: 0xfffff800`01b61d00   voidnt!CmpDeleteKeyObject+0
   +0x050 ParseProcedure   : 0xfffff800`01b5b500   longnt!CmpParseKey+0<-要HOOK的是这个函数
   +0x058 SecurityProcedure : 0xfffff800`01b292e0   longnt!CmpSecurityMethod+0
   +0x060 QueryNameProcedure : 0xfffff800`01b4ff64   longnt!CmpQueryKeyName+0
   +0x068 OkayToCloseProcedure : (null)
可见每个OBJECT都有8个Procedure,它们每个Procedure的函数原型各不相同(具体原型可以在WRK中找到)。但每个OBJECT的Procedure函数原型是一样的。举例来说,CmKeyObjectType和IoFileObjectType的ParseProcedure的原型是一样的。下面的代码演示的是禁止打开RUN键,如果注册表打开会弹出错误。PCHUNTER打开不会报错,但显示不了子键和键值了(除非用解析HIVE的方法才行)。
**** Hidden Message *****

whitesilt 发表于 2014-7-10 10:35:23

{:soso_e142:}

biiaidt 发表于 2014-7-10 11:13:26

已阅,多谢老大提供

5ak 发表于 2024-1-1 20:13:08

学习了

linkerrors 发表于 2024-1-1 20:20:26

感谢分享。

xtfpg 发表于 2024-1-9 15:44:51

抄一抄

baggiowangyu 发表于 2024-1-26 17:40:33

2024补充学习

ruin1990 发表于 2024-2-6 13:48:02

感谢分析,受教了

nj001 发表于 2024-3-18 09:46:50

感谢分享

yimingqpa 发表于 2024-3-29 10:20:40

感谢楼主,学习一下。

wst5898 发表于 2025-1-25 22:45:20

好好学习一下
页: [1]
查看完整版本: 《WIN64驱动教程》补充[15]:OBJECT HOOK的实现