句柄表
使用OpenProcess后,句柄表的变化
连续多次打开相同对象后,返回给三环的句柄的值是不同的,句柄表里面也会添加相应的值。
通过句柄寻找内核对象
第一步 :WinDbg使用命令 !Process 0 0 遍历所有进程
第二步 :dt _EPROCESS +指定进程的地址
第三步 :_EPROCESS+c4里面的值 就是句柄表位置的指针
kd> dt _HANDLE_TABLE 0xe2775e80
nt!_HANDLE_TABLE
+0x000 TableCode : 0xe2de3000
+0x004 QuotaProcess : 0x8a12f448 _EPROCESS
+0x008 UniqueProcessId : 0x00000d00 Void
+0x00c HandleTableLock : [4] _EX_PUSH_LOCK
+0x01c HandleTableList : _LIST_ENTRY [ 0x80565ba8 - 0xe11dbebc ]
+0x024 HandleContentionEvent : _EX_PUSH_LOCK
+0x028 DebugInfo : (null)
+0x02c ExtraInfoPages : 0n0
+0x030 FirstFree : 0x7a0
+0x034 LastFree : 0
+0x038 NextHandleNeedingPool : 0x800
+0x03c HandleCount : 0n28
+0x040 Flags : 0
+0x040 StrictFIFO : 0y0
第四步 : kd> dq e2de3000(句柄表位置的指针)
e2de3000 fffffffe00000000 00000000
00000000
e2de3010 0000000400000000 00000008
00000000
e2de3020 0000000c00000000 00000010
00000000
e2de3030 0000001400000000 00000018
00000000
e2de3040 0000001c00000000 00000020
00000000
e2de3050 0000002400000000 00000028
00000000
e2de3060 0000002c00000000 00000030
00000000
e2de3070 0000003400000000 00000038
00000000
第五步:找句柄7a4对应的内核对象
7a4为索引,该值/4*8就是要找的位置
句柄表里面的值,最后四位的低两位清0,然后加上18就是该内核对象的位置。(+18是_OBJECT_HEADER的大小)
因为内核对象开始都是_OBJECT_HEADER这个结构体。然后才是_EPROCESS的开始位置
kd> dt _EPROCESS 8a1413b8+18
nt!_EPROCESS
+0x000 Pcb : _KPROCESS
+0x06c ProcessLock : _EX_PUSH_LOCK
+0x070 CreateTime : _LARGE_INTEGER 0x1d51d70`0b380ae4
+0x078 ExitTime : _LARGE_INTEGER 0x0
+0x080 RundownProtect : _EX_RUNDOWN_REF
+0x084 UniqueProcessId : 0x00000980 Void
+0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x8a0fe498 - 0x8a134c68 ]
+0x090 QuotaUsage : [3] 0xa00
+0x09c QuotaPeak : [3] 0xc10
+0x0a8 CommitCharge : 0x17d
+0x0ac PeakVirtualSize : 0x22ef000
+0x0b0 VirtualSize : 0x1f9d000
+0x0b4 SessionProcessLinks : _LIST_ENTRY [ 0x8a0fe4c4 - 0x8a134c94 ]
+0x0bc DebugPort : (null)
+0x0c0 ExceptionPort : 0xe15d3bb8 Void
+0x0c4 ObjectTable : 0xe10cd258 _HANDLE_TABLE
+0x0c8 Token : _EX_FAST_REF
+0x0cc WorkingSetLock : _FAST_MUTEX
+0x0ec WorkingSetPage : 0x46763
+0x0f0 AddressCreationLock : _FAST_MUTEX
+0x110 HyperSpaceLock : 0
+0x114 ForkInProgress : (null)
+0x118 HardwareTrigger : 0
+0x11c VadRoot : 0x8a139268 Void
+0x120 VadHint : 0x8a1391d8 Void
+0x124 CloneRoot : (null)
+0x128 NumberOfPrivatePages : 0xcb
+0x12c NumberOfLockedPages : 0
+0x130 Win32Process : 0xe123e188 Void
+0x134 Job : (null)
+0x138 SectionObject : 0xe12955f8 Void
+0x13c SectionBaseAddress : 0x01000000 Void
+0x140 QuotaBlock : 0x8a1d56d8 _EPROCESS_QUOTA_BLOCK
+0x144 WorkingSetWatch : (null)
+0x148 Win32WindowStation : 0x00000038 Void
+0x14c InheritedFromUniqueProcessId : 0x00000644 Void
+0x150 LdtInformation : (null)
+0x154 VadFreeHint : (null)
+0x158 VdmObjects : (null)
+0x15c DeviceMap : 0xe1af54d8 Void
+0x160 PhysicalVadList : _LIST_ENTRY [ 0x8a141530 - 0x8a141530 ]
+0x168 PageDirectoryPte : _HARDWARE_PTE
+0x168 Filler : 0
+0x170 Session : 0xba5da000 Void
+0x174 ImageFileName : [16] “calc.exe”
+0x184 JobLinks : _LIST_ENTRY [ 0x0 - 0x0