《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 ***** {:soso_e142:} 已阅,多谢老大提供 学习了 感谢分享。 抄一抄 2024补充学习 感谢分析,受教了 感谢分享 感谢楼主,学习一下。 好好学习一下
页:
[1]