当前位置:   article > 正文

Windows驱动开发学习记录-ObjectType Hook之ObjectType结构相关分析

objecttype hook

目录

1、目的

2、相关结构分析

2.1 XP上的相关结构

  2.1.1 WinDbg调试结构

  2.1.2 实际中使用的情况

2.2 Win7 x64以上64位系统的结构分析

  2.2.1 WinDbg调试结构

  2.2.2 实际中使用的情况 

3、相应函数的可能原型

3.1 XP x32位

  3.1.1 DumpProcedure

  3.1.2 OpenProcedure

  3.1.3 CloseProcedure

  3.1.4 DeleteProcedure

  3.1.5 ParseProcedure

  3.1.6 SecurityProcedure

  3.1.7 QueryNameProcedure

  3.1.8 OkayToCloseProcedure

3.2 Win7 x64及以上

  3.2.1 DumpProcedure

  3.2.2 OpenProcedure

  3.2.3 CloseProcedure

  3.2.4 DeleteProcedure

  3.2.5 ParseProcedure

  3.2.6 SecurityProcedure

  3.2.7 QueryNameProcedure

  3.2.8 OkayToCloseProcedure

4、相关链接


1、目的

  在一般情况下,对于系统的常规操作如创建进程、创建互斥体、创建文件等可以进行SSDT Hook进行拦截,但在x64位系统下,有PG的保护,常规的SSDT Hook会导致蓝屏。但基于ObjectType的一些Hook也可以做到相应的功能且不会导致系统 BSOD。

2、相关结构分析

2.1 XP上的相关结构

  2.1.1 WinDbg调试结构

  首先是 _OBJECT_HEADER结构

  1. 0: kd> dt _object_header
  2. nt!_OBJECT_HEADER
  3. +0x000 PointerCount : Int4B
  4. +0x004 HandleCount : Int4B
  5. +0x004 NextToFree : Ptr32 Void
  6. +0x008 Type : Ptr32 _OBJECT_TYPE
  7. +0x00c NameInfoOffset : UChar
  8. +0x00d HandleInfoOffset : UChar
  9. +0x00e QuotaInfoOffset : UChar
  10. +0x00f Flags : UChar
  11. +0x010 ObjectCreateInfo : Ptr32 _OBJECT_CREATE_INFORMATION
  12. +0x010 QuotaBlockCharged : Ptr32 Void
  13. +0x014 SecurityDescriptor : Ptr32 Void
  14. +0x018 Body : _QUAD

  在第四个字段就是 _OBJECT_TYPE,其结构如下:

  1. 0: kd> dt _OBJECT_TYPE
  2. nt!_OBJECT_TYPE
  3. +0x000 Mutex : _ERESOURCE
  4. +0x038 TypeList : _LIST_ENTRY
  5. +0x040 Name : _UNICODE_STRING
  6. +0x048 DefaultObject : Ptr32 Void
  7. +0x04c Index : Uint4B
  8. +0x050 TotalNumberOfObjects : Uint4B
  9. +0x054 TotalNumberOfHandles : Uint4B
  10. +0x058 HighWaterNumberOfObjects : Uint4B
  11. +0x05c HighWaterNumberOfHandles : Uint4B
  12. +0x060 TypeInfo : _OBJECT_TYPE_INITIALIZER
  13. +0x0ac Key : Uint4B
  14. +0x0b0 ObjectLocks : [4] _ERESOURCE

  其中的TypeInfo为 _OBJECT_TYPE_INITIALIZER结构,其内容如下:

  1. 0: kd> dt _OBJECT_TYPE_INITIALIZER
  2. nt!_OBJECT_TYPE_INITIALIZER
  3. +0x000 Length : Uint2B
  4. +0x002 UseDefaultObject : UChar
  5. +0x003 CaseInsensitive : UChar
  6. +0x004 InvalidAttributes : Uint4B
  7. +0x008 GenericMapping : _GENERIC_MAPPING
  8. +0x018 ValidAccessMask : Uint4B
  9. +0x01c SecurityRequired : UChar
  10. +0x01d MaintainHandleCount : UChar
  11. +0x01e MaintainTypeList : UChar
  12. +0x020 PoolType : _POOL_TYPE
  13. +0x024 DefaultPagedPoolCharge : Uint4B
  14. +0x028 DefaultNonPagedPoolCharge : Uint4B
  15. +0x02c DumpProcedure : Ptr32 void
  16. +0x030 OpenProcedure : Ptr32 long
  17. +0x034 CloseProcedure : Ptr32 void
  18. +0x038 DeleteProcedure : Ptr32 void
  19. +0x03c ParseProcedure : Ptr32 long
  20. +0x040 SecurityProcedure : Ptr32 long
  21. +0x044 QueryNameProcedure : Ptr32 long
  22. +0x048 OkayToCloseProcedure : Ptr32 unsigned char

  其中靠后的如 OpenProcedure、CloseProcedure、ParseProcedure等就是我们关注的需要Hook的字段,通过Hook这些字段来实现打开创建相应的对象的过滤操作。

  2.1.2 实际中使用的情况

  我们经过一些操作来看看XP上的进程对象的相关字段对应的函数

  先通过!process命令获取explorer.exe的EPROCESS

  1. 0: kd> !process 0 0 explorer.exe
  2. Failed to get VadRoot
  3. PROCESS 89fc3338 SessionId: 0 Cid: 0604 Peb: 7ffd4000 ParentCid: 05f4
  4. DirBase: 0aac01c0 ObjectTable: e1835490 HandleCount: 487.
  5. Image: explorer.exe

  获取到的结果为PROCESS 89fc3338, 看看对应的数据如下:

  1. 0: kd> dt _eprocess 89fc3338
  2. nt!_EPROCESS
  3. +0x000 Pcb : _KPROCESS
  4. +0x06c ProcessLock : _EX_PUSH_LOCK
  5. +0x070 CreateTime : _LARGE_INTEGER 0x01d99c3e`eb1d80e8
  6. +0x078 ExitTime : _LARGE_INTEGER 0x0
  7. +0x080 RundownProtect : _EX_RUNDOWN_REF
  8. +0x084 UniqueProcessId : 0x00000604 Void
  9. +0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x8a2a8688 - 0x8a0b8738 ]
  10. +0x090 QuotaUsage : [3] 0x34a8
  11. +0x09c QuotaPeak : [3] 0x4650
  12. +0x0a8 CommitCharge : 0xfe0
  13. +0x0ac PeakVirtualSize : 0x6aee000
  14. +0x0b0 VirtualSize : 0x6031000
  15. +0x0b4 SessionProcessLinks : _LIST_ENTRY [ 0x8a2a86b4 - 0x8a0b8764 ]
  16. +0x0bc DebugPort : (null)
  17. +0x0c0 ExceptionPort : 0xe166ca10 Void
  18. +0x0c4 ObjectTable : 0xe1835490 _HANDLE_TABLE
  19. +0x0c8 Token : _EX_FAST_REF
  20. +0x0cc WorkingSetLock : _FAST_MUTEX
  21. +0x0ec WorkingSetPage : 0x16b59
  22. +0x0f0 AddressCreationLock : _FAST_MUTEX
  23. +0x110 HyperSpaceLock : 0
  24. +0x114 ForkInProgress : (null)
  25. +0x118 HardwareTrigger : 0
  26. +0x11c VadRoot : 0x8a32c2a8 Void
  27. +0x120 VadHint : 0x8a32c2a8 Void
  28. +0x124 CloneRoot : (null)
  29. +0x128 NumberOfPrivatePages : 0xa5e
  30. +0x12c NumberOfLockedPages : 0
  31. +0x130 Win32Process : 0xe1d749e0 Void
  32. +0x134 Job : (null)
  33. +0x138 SectionObject : 0xe1d7bbd0 Void
  34. +0x13c SectionBaseAddress : 0x01000000 Void
  35. +0x140 QuotaBlock : 0x8a4b7e58 _EPROCESS_QUOTA_BLOCK
  36. +0x144 WorkingSetWatch : (null)
  37. +0x148 Win32WindowStation : 0x00000038 Void
  38. +0x14c InheritedFromUniqueProcessId : 0x000005f4 Void
  39. +0x150 LdtInformation : (null)
  40. +0x154 VadFreeHint : (null)
  41. +0x158 VdmObjects : (null)
  42. +0x15c DeviceMap : 0xe19f0990 Void
  43. +0x160 PhysicalVadList : _LIST_ENTRY [ 0x89fc3498 - 0x89fc3498 ]
  44. +0x168 PageDirectoryPte : _HARDWARE_PTE
  45. +0x168 Filler : 0
  46. +0x170 Session : 0xba5d0000 Void
  47. +0x174 ImageFileName : [16] "explorer.exe"
  48. ......

   其中用不着EPROCESS的结构,获取这个的地址是为了获取_OBJECT_HEADER的地址,在XP环境的代码中可以用以下来获取到_OBJECT_HEADER地址,因为_OBJECT_HEADER结构中的Body部分就是获取的对应的对象,如EPROCESS。

#define ObObjectToObjectHeader(x) ((POBJECT_HEADER)(((PUCHAR)(x))-0x18))

  操作如下:

  1. 0: kd> dt _object_header 89fc3338-0x18
  2. nt!_OBJECT_HEADER
  3. +0x000 PointerCount : 0n185
  4. +0x004 HandleCount : 0n6
  5. +0x004 NextToFree : 0x00000006 Void
  6. +0x008 Type : 0x8a4a4ca0 _OBJECT_TYPE
  7. +0x00c NameInfoOffset : 0 ''
  8. +0x00d HandleInfoOffset : 0 ''
  9. +0x00e QuotaInfoOffset : 0 ''
  10. +0x00f Flags : 0x20 ' '
  11. +0x010 ObjectCreateInfo : 0x8a4b7e58 _OBJECT_CREATE_INFORMATION
  12. +0x010 QuotaBlockCharged : 0x8a4b7e58 Void
  13. +0x014 SecurityDescriptor : 0xe1cd5ed3 Void
  14. +0x018 Body : _QUAD

  再继续打印_OBJECT_TYPE

  1. 0: kd> dt _object_type 0x8a4a4ca0
  2. nt!_OBJECT_TYPE
  3. +0x000 Mutex : _ERESOURCE
  4. +0x038 TypeList : _LIST_ENTRY [ 0x8a4a4cd8 - 0x8a4a4cd8 ]
  5. +0x040 Name : _UNICODE_STRING "Process"
  6. +0x048 DefaultObject : (null)
  7. +0x04c Index : 5
  8. +0x050 TotalNumberOfObjects : 0x11
  9. +0x054 TotalNumberOfHandles : 0x51
  10. +0x058 HighWaterNumberOfObjects : 0x13
  11. +0x05c HighWaterNumberOfHandles : 0x51
  12. +0x060 TypeInfo : _OBJECT_TYPE_INITIALIZER
  13. +0x0ac Key : 0x636f7250
  14. +0x0b0 ObjectLocks : [4] _ERESOURCE

  然后是_OBJECT_TYPE_INITIALIZER

  1. 0: kd> dx -id 0,0,8055d0c0 -r1 (*((ntkrpamp!_OBJECT_TYPE_INITIALIZER *)0x8a4a4d00))
  2. (*((ntkrpamp!_OBJECT_TYPE_INITIALIZER *)0x8a4a4d00)) [Type: _OBJECT_TYPE_INITIALIZER]
  3. [+0x000] Length : 0x4c [Type: unsigned short]
  4. [+0x002] UseDefaultObject : 0x0 [Type: unsigned char]
  5. [+0x003] CaseInsensitive : 0x0 [Type: unsigned char]
  6. [+0x004] InvalidAttributes : 0xb0 [Type: unsigned long]
  7. [+0x008] GenericMapping [Type: _GENERIC_MAPPING]
  8. [+0x018] ValidAccessMask : 0x1f0fff [Type: unsigned long]
  9. [+0x01c] SecurityRequired : 0x1 [Type: unsigned char]
  10. [+0x01d] MaintainHandleCount : 0x0 [Type: unsigned char]
  11. [+0x01e] MaintainTypeList : 0x0 [Type: unsigned char]
  12. [+0x020] PoolType : NonPagedPool (0) [Type: _POOL_TYPE]
  13. [+0x024] DefaultPagedPoolCharge : 0x1000 [Type: unsigned long]
  14. [+0x028] DefaultNonPagedPoolCharge : 0x290 [Type: unsigned long]
  15. [+0x02c] DumpProcedure : 0x0 [Type: void (*)(void *,_OBJECT_DUMP_CONTROL *)]
  16. [+0x030] OpenProcedure : 0x0 [Type: long (*)(_OB_OPEN_REASON,_EPROCESS *,void *,unsigned long,unsigned long)]
  17. [+0x034] CloseProcedure : 0x0 [Type: void (*)(_EPROCESS *,void *,unsigned long,unsigned long,unsigned long)]
  18. [+0x038] DeleteProcedure : 0x805d263a [Type: void (*)(void *)]
  19. [+0x03c] ParseProcedure : 0x0 [Type: long (*)(void *,void *,_ACCESS_STATE *,char,unsigned long,_UNICODE_STRING *,_UNICODE_STRING *,void *,_SECURITY_QUALITY_OF_SERVICE *,void * *)]
  20. [+0x040] SecurityProcedure : 0x805f9a74 [Type: long (*)(void *,_SECURITY_OPERATION_CODE,unsigned long *,void *,unsigned long *,void * *,_POOL_TYPE,_GENERIC_MAPPING *,char)]
  21. [+0x044] QueryNameProcedure : 0x0 [Type: long (*)(void *,unsigned char,_OBJECT_NAME_INFORMATION *,unsigned long,unsigned long *)]
  22. [+0x048] OkayToCloseProcedure : 0x0 [Type: unsigned char (*)(_EPROCESS *,void *,void *,char)]

  在此就可以看到相关函数的定义及实际地址,如DeleteProcedure  : 0x805d263a [Type: void (*)(void *)] 就是地址为0x805d263a 函数声明为 void*(void*)的函数。

2.2 Win7 x64以上64位系统的结构分析

  2.2.1 WinDbg调试结构

  1. 7: kd> dt _object_header
  2. nt!_OBJECT_HEADER
  3. +0x000 PointerCount : Int8B
  4. +0x008 HandleCount : Int8B
  5. +0x008 NextToFree : Ptr64 Void
  6. +0x010 Lock : _EX_PUSH_LOCK
  7. +0x018 TypeIndex : UChar
  8. +0x019 TraceFlags : UChar
  9. +0x01a InfoMask : UChar
  10. +0x01b Flags : UChar
  11. +0x020 ObjectCreateInfo : Ptr64 _OBJECT_CREATE_INFORMATION
  12. +0x020 QuotaBlockCharged : Ptr64 Void
  13. +0x028 SecurityDescriptor : Ptr64 Void
  14. +0x030 Body : _QUAD

  在64位系统上 _OBJECT_HEADER中并没有字段直接包含_OBJECT_TYPE结构,而是一个索引,索引的是一个名叫 ObTypeIndexTable的表,这个表是一个包含所有ObjectType的表结构,详细可见我另一篇文章

《遍历Windows内核ObjectType》

  而在这种情况下,实现编程中可以直接通过ObGetObjectType函数直接从实际对象获取的ObjectType的指针。

  但_OBJECT_TYPE的结构化仍然可以在WinDbg中获取到,如下:

  1. 7: kd> dt _object_type
  2. nt!_OBJECT_TYPE
  3. +0x000 TypeList : _LIST_ENTRY
  4. +0x010 Name : _UNICODE_STRING
  5. +0x020 DefaultObject : Ptr64 Void
  6. +0x028 Index : UChar
  7. +0x02c TotalNumberOfObjects : Uint4B
  8. +0x030 TotalNumberOfHandles : Uint4B
  9. +0x034 HighWaterNumberOfObjects : Uint4B
  10. +0x038 HighWaterNumberOfHandles : Uint4B
  11. +0x040 TypeInfo : _OBJECT_TYPE_INITIALIZER
  12. +0x0b0 TypeLock : _EX_PUSH_LOCK
  13. +0x0b8 Key : Uint4B
  14. +0x0c0 CallbackList : _LIST_ENTRY

  然后是_OBJECT_TYPE_INITIALIZER

  1. 7: kd> dt _OBJECT_TYPE_INITIALIZER
  2. nt!_OBJECT_TYPE_INITIALIZER
  3. +0x000 Length : Uint2B
  4. +0x002 ObjectTypeFlags : UChar
  5. +0x002 CaseInsensitive : Pos 0, 1 Bit
  6. +0x002 UnnamedObjectsOnly : Pos 1, 1 Bit
  7. +0x002 UseDefaultObject : Pos 2, 1 Bit
  8. +0x002 SecurityRequired : Pos 3, 1 Bit
  9. +0x002 MaintainHandleCount : Pos 4, 1 Bit
  10. +0x002 MaintainTypeList : Pos 5, 1 Bit
  11. +0x002 SupportsObjectCallbacks : Pos 6, 1 Bit
  12. +0x002 CacheAligned : Pos 7, 1 Bit
  13. +0x004 ObjectTypeCode : Uint4B
  14. +0x008 InvalidAttributes : Uint4B
  15. +0x00c GenericMapping : _GENERIC_MAPPING
  16. +0x01c ValidAccessMask : Uint4B
  17. +0x020 RetainAccess : Uint4B
  18. +0x024 PoolType : _POOL_TYPE
  19. +0x028 DefaultPagedPoolCharge : Uint4B
  20. +0x02c DefaultNonPagedPoolCharge : Uint4B
  21. +0x030 DumpProcedure : Ptr64 void
  22. +0x038 OpenProcedure : Ptr64 long
  23. +0x040 CloseProcedure : Ptr64 void
  24. +0x048 DeleteProcedure : Ptr64 void
  25. +0x050 ParseProcedure : Ptr64 long
  26. +0x058 SecurityProcedure : Ptr64 long
  27. +0x060 QueryNameProcedure : Ptr64 long
  28. +0x068 OkayToCloseProcedure : Ptr64 unsigned char

  其结构和xp有些差别,但需要的几个函数大同小异。

  2.2.2 实际中使用的情况 

  先通过 《遍历Windows内核ObjectType》文章的方法得到EPROCESS对象的_OBJECT_TYPE指针:

  1. 5: kd> g
  2. 【PrintObjectTypeList】::【DriverEntry】 Hello Kernel World! CurrentProcessId:0x0000000000000004 CurrentIRQL:0x0
  3. 【ObRegisterCallback】::【GetObTypeIndexTable】Found ObTypeIndexTable Address:0xFFFFF80006678100
  4. 【PrintObjectTypeList】::【PrintObTypeIndexList】Index:00 Address:0xFFFFFA80610603C0 Name:Type
  5. 【PrintObjectTypeList】::【PrintObTypeIndexList】Index:01 Address:0xFFFFFA8061060270 Name:Directory
  6. 【PrintObjectTypeList】::【PrintObTypeIndexList】Index:02 Address:0xFFFFFA806106C700 Name:SymbolicLink
  7. 【PrintObjectTypeList】::【PrintObTypeIndexList】Index:03 Address:0xFFFFFA806106C4B0 Name:Token
  8. 【PrintObjectTypeList】::【PrintObTypeIndexList】Index:04 Address:0xFFFFFA806106C290 Name:Job
  9. 【PrintObjectTypeList】::【PrintObTypeIndexList】Index:05 Address:0xFFFFFA8061065F30 Name:Process
  10. 【PrintObjectTypeList】::【PrintObTypeIndexList】Index:06 Address:0xFFFFFA8061065DE0 Name:Thread

  其地址为0xFFFFFA8061065F30,再格式化其结构如下:

  1. 5: kd> dt _object_type 0xFFFFFA8061065F30
  2. nt!_OBJECT_TYPE
  3. +0x000 TypeList : _LIST_ENTRY [ 0xfffffa80`61065f30 - 0xfffffa80`61065f30 ]
  4. +0x010 Name : _UNICODE_STRING "Process"
  5. +0x020 DefaultObject : (null)
  6. +0x028 Index : 0x7 ''
  7. +0x02c TotalNumberOfObjects : 0x2f
  8. +0x030 TotalNumberOfHandles : 0x11a
  9. +0x034 HighWaterNumberOfObjects : 0x32
  10. +0x038 HighWaterNumberOfHandles : 0x11e
  11. +0x040 TypeInfo : _OBJECT_TYPE_INITIALIZER
  12. +0x0b0 TypeLock : _EX_PUSH_LOCK
  13. +0x0b8 Key : 0x636f7250
  14. +0x0c0 CallbackList : _LIST_ENTRY [ 0xfffff8a0`00f59b50 - 0xfffff8a0`00f59b50 ]

  再获取_OBJECT_TYPE_INITIALIZER,如下:

  1. 5: kd> dx -id 0,0,fffffa8061066b00 -r1 (*((ntkrnlmp!_OBJECT_TYPE_INITIALIZER *)0xfffffa8061065f70))
  2. (*((ntkrnlmp!_OBJECT_TYPE_INITIALIZER *)0xfffffa8061065f70)) [Type: _OBJECT_TYPE_INITIALIZER]
  3. [+0x000] Length : 0x70 [Type: unsigned short]
  4. [+0x002] ObjectTypeFlags : 0x4a [Type: unsigned char]
  5. [+0x002 ( 0: 0)] CaseInsensitive : 0x0 [Type: unsigned char]
  6. [+0x002 ( 1: 1)] UnnamedObjectsOnly : 0x1 [Type: unsigned char]
  7. [+0x002 ( 2: 2)] UseDefaultObject : 0x0 [Type: unsigned char]
  8. [+0x002 ( 3: 3)] SecurityRequired : 0x1 [Type: unsigned char]
  9. [+0x002 ( 4: 4)] MaintainHandleCount : 0x0 [Type: unsigned char]
  10. [+0x002 ( 5: 5)] MaintainTypeList : 0x0 [Type: unsigned char]
  11. [+0x002 ( 6: 6)] SupportsObjectCallbacks : 0x1 [Type: unsigned char]
  12. [+0x002 ( 7: 7)] CacheAligned : 0x0 [Type: unsigned char]
  13. [+0x004] ObjectTypeCode : 0x0 [Type: unsigned long]
  14. [+0x008] InvalidAttributes : 0xb0 [Type: unsigned long]
  15. [+0x00c] GenericMapping [Type: _GENERIC_MAPPING]
  16. [+0x01c] ValidAccessMask : 0x1fffff [Type: unsigned long]
  17. [+0x020] RetainAccess : 0x101000 [Type: unsigned long]
  18. [+0x024] PoolType : NonPagedPool (0) [Type: _POOL_TYPE]
  19. [+0x028] DefaultPagedPoolCharge : 0x1000 [Type: unsigned long]
  20. [+0x02c] DefaultNonPagedPoolCharge : 0x550 [Type: unsigned long]
  21. [+0x030] DumpProcedure : 0x0 : 0x0 [Type: void (__cdecl*)(void *,_OBJECT_DUMP_CONTROL *)]
  22. [+0x038] OpenProcedure : 0xfffff80006765ac8 : ntkrnlmp!PspProcessOpen+0x0 [Type: long (__cdecl*)(_OB_OPEN_REASON,char,_EPROCESS *,void *,unsigned long *,unsigned long)]
  23. [+0x040] CloseProcedure : 0xfffff80006765b10 : ntkrnlmp!PspProcessClose+0x0 [Type: void (__cdecl*)(_EPROCESS *,void *,unsigned __int64,unsigned __int64)]
  24. [+0x048] DeleteProcedure : 0xfffff8000672b814 : ntkrnlmp!PspProcessDelete+0x0 [Type: void (__cdecl*)(void *)]
  25. [+0x050] ParseProcedure : 0x0 : 0x0 [Type: long (__cdecl*)(void *,void *,_ACCESS_STATE *,char,unsigned long,_UNICODE_STRING *,_UNICODE_STRING *,void *,_SECURITY_QUALITY_OF_SERVICE *,void * *)]
  26. [+0x058] SecurityProcedure : 0xfffff80006735dd8 : ntkrnlmp!SeDefaultObjectMethod+0x0 [Type: long (__cdecl*)(void *,_SECURITY_OPERATION_CODE,unsigned long *,void *,unsigned long *,void * *,_POOL_TYPE,_GENERIC_MAPPING *,char)]
  27. [+0x060] QueryNameProcedure : 0x0 : 0x0 [Type: long (__cdecl*)(void *,unsigned char,_OBJECT_NAME_INFORMATION *,unsigned long,unsigned long *,char)]
  28. [+0x068] OkayToCloseProcedure : 0x0 : 0x0 [Type: unsigned char (__cdecl*)(_EPROCESS *,void *,void *,char)]

  其中的OpenProcedure、CloseProcedure、DeleteProcedure都有相应的值。

3、相应函数的可能原型

3.1 XP x32位

  这些结构参考微软泄露出来的源码和ReactOS获取得到:

  3.1.1 DumpProcedure

  1. typedef struct _OBJECT_DUMP_CONTROL {
  2. PVOID Stream;
  3. ULONG Detail;
  4. } OB_DUMP_CONTROL, *POB_DUMP_CONTROL;
  5. typedef VOID (*OB_DUMP_METHOD)(
  6. IN PVOID Object,
  7. IN POB_DUMP_CONTROL Control OPTIONAL
  8. );

  3.1.2 OpenProcedure

  1. typedef NTSTATUS (*OB_OPEN_METHOD)(
  2. IN OB_OPEN_REASON OpenReason,
  3. IN PEPROCESS Process OPTIONAL,
  4. IN PVOID Object,
  5. IN ACCESS_MASK GrantedAccess,
  6. IN ULONG HandleCount
  7. );

  3.1.3 CloseProcedure

  1. typedef VOID (*OB_CLOSE_METHOD)(
  2. IN PEPROCESS Process OPTIONAL,
  3. IN PVOID Object,
  4. IN ACCESS_MASK GrantedAccess,
  5. IN ULONG ProcessHandleCount,
  6. IN ULONG SystemHandleCount
  7. );

  3.1.4 DeleteProcedure

  1. typedef VOID (*OB_DELETE_METHOD)(
  2. IN PVOID Object
  3. );

  3.1.5 ParseProcedure

  1. typedef NTSTATUS (*OB_PARSE_METHOD)(
  2. IN PVOID ParseObject,
  3. IN PVOID ObjectType,
  4. IN OUT PACCESS_STATE AccessState,
  5. IN KPROCESSOR_MODE AccessMode,
  6. IN ULONG Attributes,
  7. IN OUT PUNICODE_STRING CompleteName,
  8. IN OUT PUNICODE_STRING RemainingName,
  9. IN OUT PVOID Context OPTIONAL,
  10. IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
  11. OUT PVOID *Object
  12. );

  3.1.6 SecurityProcedure

  1. typedef NTSTATUS (*OB_SECURITY_METHOD)(
  2. IN PVOID Object,
  3. IN SECURITY_OPERATION_CODE OperationCode,
  4. IN PSECURITY_INFORMATION SecurityInformation,
  5. IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
  6. IN OUT PULONG CapturedLength,
  7. IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
  8. IN POOL_TYPE PoolType,
  9. IN PGENERIC_MAPPING GenericMapping
  10. );

  3.1.7 QueryNameProcedure

  1. typedef NTSTATUS (*OB_QUERYNAME_METHOD)(
  2. IN PVOID Object,
  3. IN BOOLEAN HasObjectName,
  4. OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
  5. IN ULONG Length,
  6. OUT PULONG ReturnLength
  7. );

  3.1.8 OkayToCloseProcedure

  1. typedef BOOLEAN (*OB_OKAYTOCLOSE_METHOD)(
  2. IN PEPROCESS Process OPTIONAL,
  3. IN PVOID Object,
  4. IN HANDLE Handle,
  5. IN KPROCESSOR_MODE PreviousMode
  6. );

3.2 Win7 x64及以上

  参考XP源代码加上2.2.2节最后WinDbg调试显示的结果

  3.2.1 DumpProcedure

  1. typedef struct _OBJECT_DUMP_CONTROL {
  2. PVOID Stream;
  3. ULONG Detail;
  4. } OB_DUMP_CONTROL, *POB_DUMP_CONTROL;
  5. typedef VOID (*OB_DUMP_METHOD)(
  6. IN PVOID Object,
  7. IN POB_DUMP_CONTROL Control OPTIONAL
  8. );

  3.2.2 OpenProcedure

  1. typedef NTSTATUS (*OB_OPEN_METHOD)(
  2. IN OB_OPEN_REASON OpenReason,
  3. IN CHAR Flag,
  4. IN PEPROCESS Process OPTIONAL,
  5. IN PVOID Object,
  6. IN OUT PACCESS_MASK GrantedAccess,
  7. IN ULONG HandleCount
  8. );

  3.2.3 CloseProcedure

  1. typedef VOID (*OB_CLOSE_METHOD)(
  2. IN PEPROCESS Process OPTIONAL,
  3. IN PVOID Object,
  4. IN OUT PACCESS_MASK GrantedAccess,
  5. IN ULONGLONG ReferenceHandleCount
  6. );

  3.2.4 DeleteProcedure

  1. typedef VOID (*OB_DELETE_METHOD)(
  2. IN PVOID Object
  3. );

  3.2.5 ParseProcedure

  1. typedef NTSTATUS (*OB_PARSE_METHOD)(
  2. IN PVOID ParseObject,
  3. IN POBJECT_TYPE ObjectType,
  4. IN OUT PACCESS_STATE AccessState,
  5. IN CHAR Flag,
  6. IN ULONG Attributes,
  7. IN OUT PUNICODE_STRING CompleteName,
  8. IN OUT PUNICODE_STRING RemainingName,
  9. IN OUT PVOID Context OPTIONAL,
  10. IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
  11. OUT PVOID *Object
  12. );

  3.2.6 SecurityProcedure

  1. typedef NTSTATUS (*OB_SECURITY_METHOD)(
  2. IN PVOID Object,
  3. IN SECURITY_OPERATION_CODE OperationCode,
  4. IN PSECURITY_INFORMATION SecurityInformation,
  5. IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
  6. IN OUT PULONG CapturedLength,
  7. IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
  8. IN POOL_TYPE PoolType,
  9. IN PGENERIC_MAPPING GenericMapping,
  10. IN CHAR Flag
  11. );

  3.2.7 QueryNameProcedure

  1. typedef NTSTATUS (*OB_QUERYNAME_METHOD)(
  2. IN PVOID Object,
  3. IN BOOLEAN HasObjectName,
  4. OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
  5. IN ULONG Length,
  6. OUT PULONG ReturnLength,
  7. IN CHAR Flag
  8. );

  3.2.8 OkayToCloseProcedure

  1. typedef BOOLEAN (*OB_OKAYTOCLOSE_METHOD)(
  2. IN PEPROCESS Process OPTIONAL,
  3. IN PVOID Object,
  4. IN HANDLE Handle,
  5. IN KPROCESSOR_MODE PreviousMode
  6. );

4、相关链接

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/58728
推荐阅读
相关标签
  

闽ICP备14008679号