01句柄表

句柄是进程访问内核对象的唯一标识,每个进程有自己的句柄表。HANDLE_TABLE结构存储了句柄信息,包括句柄的级数、属性和对应的内核对象地址。对象头_OBJECT_HEADER包含了对象的相关计数、类型信息和安全描述符等。通过句柄,可以对进程进行操作,如OpenProcess函数使用句柄来获取进程的访问权限。
摘要由CSDN通过智能技术生成

句柄表

当一个进程创建或者打开一个内核对象的时候,将获得一个句柄,通过这个句柄可以访问内核对象

句柄存在的目的是为了避免在应用层直接修改内核对象

句柄表是私有的,每个进程一个

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) 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值