句柄表
当一个进程创建或者打开一个内核对象的时候,将获得一个句柄,通过这个句柄可以访问内核对象
句柄存在的目的是为了避免在应用层直接修改内核对象
句柄表是私有的,每个进程一个
kd> dt _EPROCESS
ntdll!_EPROCESS
+0x000 Pcb : _KPROCESS
+0x06c ProcessLock : _EX_PUSH_LOCK
+0x070 CreateTime : _LARGE_INTEGER
+0x078 ExitTime : _LARGE_INTEGER
+0x080 RundownProtect : _EX_RUNDOWN_REF
+0x084 UniqueProcessId : Ptr32 Void
+0x088 ActiveProcessLinks : _LIST_ENTRY
+0x090 QuotaUsage : [3] Uint4B
+0x09c QuotaPeak : [3] Uint4B
+0x0a8 CommitCharge : Uint4B
+0x0ac PeakVirtualSize : Uint4B
+0x0b0 VirtualSize : Uint4B
+0x0b4 SessionProcessLinks : _LIST_ENTRY
+0x0bc DebugPort : Ptr32 Void
+0x0c0 ExceptionPort : Ptr32 Void
+0x0c4 ObjectTable : Ptr32 _HANDLE_TABLE ;这个就是句柄表的位置
_HANDLE_TABLE
kd> dt _HANDLE_TABLE
ntdll!_HANDLE_TABLE
+0x000 TableCode : Uint4B ;TableCode就是所谓的句柄表
+0x004 QuotaProcess : Ptr32 _EPROCESS
+0x008 UniqueProcessId : Ptr32 Void
+0x00c HandleTableLock : [4] _EX_PUSH_LOCK
+0x01c HandleTableList : _LIST_ENTRY
+0x024 HandleContentionEvent : _EX_PUSH_LOCK
+0x028 DebugInfo : Ptr32 _HANDLE_TRACE_DEBUG_INFO
+0x02c ExtraInfoPages : Int4B
+0x030 FirstFree : Uint4B
+0x034 LastFree : Uint4B
+0x038 NextHandleNeedingPool : Uint4B
+0x03c HandleCount : Int4B
+0x040 Flags : Uint4B
+0x040 StrictFIFO : Pos 0, 1 Bit
TableCode的低2为可以判断出,这个句柄表是几级的
指明句柄表的级数,如果低两位是0,那么指向的句柄表里面存放的就是真正的句柄;如果低两位是1,那么指向的第一张句柄表的每一个成员都是一个地址,每一个地址指向每一个真正的句柄表,以此类推低两位是2的情况
句柄表结构
句柄就是索引
每个句柄对象在0环占用8个字节,但是索引是按照4个字节的(考虑是为了兼容性),当我们获得 : 句柄值 / 4 * 8
①:这一块共计两个字节,高位字节是给SetHandleInformation这个函数用的
②:这块是访问掩码,是给OpenProcess这个函数用的,具体的存的值就是这个函数的第一个参数的值
③ 和 ④ 这两个块共计四个字节 : bit0-bit2存的是这个句柄的属性,bit2和bit0默认为0和1,bit1表示的函数是该句柄是否可继承,OpenProcess的第二个参数与bit1有关,bit31-bit3则是存放的该内核对象在内核中的具体的地址
_OBJECT_HEADER
最后两位是句柄表的属性,我们需要清零才能得到结构体的地址,但是,这个结构体指向的不是EPROCESS,而是_OBJECT_HEADER结构体,这个是每一个内核对象都有的,被称为对象头:
kd> dt _OBJECT_HEADER
nt!_OBJECT_HEADER
+0x000 PointerCount : Int4B
+0x004 HandleCount : Int4B
+0x004 NextToFree : Ptr32 Void
+0x008 Type : Ptr32 _OBJECT_TYPE
+0x00c NameInfoOffset : UChar
+0x00d HandleInfoOffset : UChar
+0x00e QuotaInfoOffset : UChar
+0x00f Flags : UChar
+0x010 ObjectCreateInfo : Ptr32 _OBJECT_CREATE_INFORMATION
+0x010 QuotaBlockCharged : Ptr32 Void
+0x014 SecurityDescriptor : Ptr32 Void
+0x018 Body : _QUAD
3环代码(实验)
#include "stdafx.h"
#include <stdlib.h>
#include <windows.h>
int main(int argc, char* argv[])
{
int pid;
printf("请输入程序的pid:");
scanf("%d",&pid);
HANDLE hprocess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
if (hprocess==INVALID_HANDLE_VALUE)
{
puts("进程句柄无效!!!");
}
else
{
printf("打开进程获得句柄成功!句柄为:%d\n",hprocess);
}
system("pause");
CloseHandle(hprocess);
return 0;
}
kd> dt _EPROCESS 896c06b8
ntdll!_EPROCESS
+0x000 Pcb : _KPROCESS
+0x06c ProcessLock : _EX_PUSH_LOCK
+0x070 CreateTime : _LARGE_INTEGER 0x01d983ba`fcd5192d
+0x078 ExitTime : _LARGE_INTEGER 0x0
+0x080 RundownProtect : _EX_RUNDOWN_REF
+0x084 UniqueProcessId : 0x000001f8 Void
+0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x896bb0a8 - 0x899bd448 ]
+0x090 QuotaUsage : [3] 0x460
+0x09c QuotaPeak : [3] 0x650
+0x0a8 CommitCharge : 0x40
+0x0ac PeakVirtualSize : 0x825000
+0x0b0 VirtualSize : 0x7b3000
+0x0b4 SessionProcessLinks : _LIST_ENTRY [ 0x896bb0d4 - 0x899bd474 ]
+0x0bc DebugPort : 0x899a9af8 Void
+0x0c0 ExceptionPort : 0xe1658ba8 Void
+0x0c4 ObjectTable : 0xe1a3eab8 _HANDLE_TABLE
ntdll!_HANDLE_TABLE
+0x000 TableCode : 0xe1245000
+0x004 QuotaProcess : 0x896c06b8 _EPROCESS
+0x008 UniqueProcessId : 0x000001f8 Void
+0x00c HandleTableLock : [4] _EX_PUSH_LOCK
+0x01c HandleTableList : _LIST_ENTRY [ 0xe1825f64 - 0xe11dd09c ]
+0x024 HandleContentionEvent : _EX_PUSH_LOCK
+0x028 DebugInfo : (null)
+0x02c ExtraInfoPages : 0n0
+0x030 FirstFree : 0x7dc
+0x034 LastFree : 0
+0x038 NextHandleNeedingPool : 0x800
+0x03c HandleCount : 0n21
+0x040 Flags : 0
+0x040 StrictFIFO : 0y0
kd> dq 0xe1245000 + FD0
ReadVirtual: e1245fd0 not properly sign extended
e1245fd0 001f0fff`896d8ae9 021f0001`e108a729
e1245fe0 000f000f`e16add39 000007b8`00000000
e1245ff0 00000003`e15ec929 000f0003`e10096b9
e1246000 00000001`00000000 00000006`fffffff7
e1246010 38cccc78`00000009 00000078`cccc0c0c
kd> dt _OBJECT_HEADER 896d8ae8
nt!_OBJECT_HEADER
+0x000 PointerCount : 0n16
+0x004 HandleCount : 0n3
+0x004 NextToFree : 0x00000003 Void
+0x008 Type : 0x89bf1040 _OBJECT_TYPE
+0x00c NameInfoOffset : 0 ''
+0x00d HandleInfoOffset : 0 ''
+0x00e QuotaInfoOffset : 0 ''
+0x00f Flags : 0x20 ' '
+0x010 ObjectCreateInfo : 0x89a644f8 _OBJECT_CREATE_INFORMATION
+0x010 QuotaBlockCharged : 0x89a644f8 Void
+0x014 SecurityDescriptor : 0xe1c111a4 Void
+0x018 Body : _QUAD
kd> dt _EPROCESS 0x896d8ae8 + 0x018
ntdll!_EPROCESS
+0x000 Pcb : _KPROCESS
+0x06c ProcessLock : _EX_PUSH_LOCK
+0x070 CreateTime : _LARGE_INTEGER 0x01d983b9`8fa1129a
+0x078 ExitTime : _LARGE_INTEGER 0x0
+0x080 RundownProtect : _EX_RUNDOWN_REF
+0x084 UniqueProcessId : 0x000004f8 Void
+0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x899bd448 - 0x89943e28 ]
+0x090 QuotaUsage : [3] 0xa78
+0x09c QuotaPeak : [3] 0xaf0
+0x0a8 CommitCharge : 0x17f
+0x0ac PeakVirtualSize : 0x244d000
+0x0b0 VirtualSize : 0x2007000
+0x0b4 SessionProcessLinks : _LIST_ENTRY [ 0x899bd474 - 0x89943e54 ]
+0x0bc DebugPort : (null)
+0x0c0 ExceptionPort : 0xe1658ba8 Void
+0x0c4 ObjectTable : 0xe1077978 _HANDLE_TABLE
+0x0c8 Token : _EX_FAST_REF
+0x0cc WorkingSetLock : _FAST_MUTEX
+0x0ec WorkingSetPage : 0x279a5
+0x0f0 AddressCreationLock : _FAST_MUTEX
+0x110 HyperSpaceLock : 0
+0x114 ForkInProgress : (null)
+0x118 HardwareTrigger : 0
+0x11c VadRoot : 0x89a3bca0 Void
+0x120 VadHint : 0x896bde70 Void
+0x124 CloneRoot : (null)
+0x128 NumberOfPrivatePages : 0xbf
+0x12c NumberOfLockedPages : 0
+0x130 Win32Process : 0xe1269778 Void
+0x134 Job : (null)
+0x138 SectionObject : 0xe19b4500 Void
+0x13c SectionBaseAddress : 0x01000000 Void
+0x140 QuotaBlock : 0x89a644f8 _EPROCESS_QUOTA_BLOCK
+0x144 WorkingSetWatch : (null)
+0x148 Win32WindowStation : 0x0000003c Void
+0x14c InheritedFromUniqueProcessId : 0x00000594 Void
+0x150 LdtInformation : (null)
+0x154 VadFreeHint : (null)
+0x158 VdmObjects : (null)
+0x15c DeviceMap : 0xe171c4d8 Void
+0x160 PhysicalVadList : _LIST_ENTRY [ 0x896d8c60 - 0x896d8c60 ]
+0x168 PageDirectoryPte : _HARDWARE_PTE_X86
+0x168 Filler : 0
+0x170 Session : 0xf79a1000 Void
+0x174 ImageFileName : [16] "notepad.exe" ;我们找到了
+0x184 JobLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x18c LockedPagesList : (null)