|
作者: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`01d57050 fffffa80`18da67b0 00000000`00000000 <-第一个QWORD就是地址
- fffff800`01d57060 01000409`01000100 fffff8a0`000015c0
- fffff800`01d57070 fffffa80`18d41d80 fffffa80`18ddba90
- fffff800`01d57080 fffff8a0`0000c140 00000000`00000000
- fffff800`01d57090 00000001`01000000 00000000`00000000
- fffff800`01d570a0 fffff8a0`02221000 00000804`01000000
- fffff800`01d570b0 00000000`00000014 00000000`00000007
- fffff800`01d570c0 fffff980`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 void nt!CmpCloseKeyObject+0
- +0x048 DeleteProcedure : 0xfffff800`01b61d00 void nt!CmpDeleteKeyObject+0
- +0x050 ParseProcedure : 0xfffff800`01b5b500 long nt!CmpParseKey+0 <-要HOOK的是这个函数
- +0x058 SecurityProcedure : 0xfffff800`01b292e0 long nt!CmpSecurityMethod+0
- +0x060 QueryNameProcedure : 0xfffff800`01b4ff64 long nt!CmpQueryKeyName+0
- +0x068 OkayToCloseProcedure : (null)
复制代码
可见每个OBJECT都有8个Procedure,它们每个Procedure的函数原型各不相同(具体原型可以在WRK中找到)。但每个OBJECT的Procedure函数原型是一样的。举例来说,CmKeyObjectType和IoFileObjectType的ParseProcedure的原型是一样的。下面的代码演示的是禁止打开RUN键,如果注册表打开会弹出错误。PCHUNTER打开不会报错,但显示不了子键和键值了(除非用解析HIVE的方法才行)。
|
|