x64进程句柄表
原理
EPROCESS ---->0x570指针指向ObjectTable结构体—>[+0x008] TableCode指针指向一个句柄表:存储着各个内核对象地址。
应用层代码—3环
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <Windows.h>
int main()
{
HANDLE tmp;
for (int i = 0; i < 20; i++)
{
tmp = OpenProcess(PROCESS_ALL_ACCESS, NULL, 6892);
std::cout << tmp << std::endl;
}
tmp = OpenProcess(PROCESS_CREATE_THREAD, TRUE, 6892);
SetHandleInformation(tmp,HANDLE_FLAG_PROTECT_FROM_CLOSE, HANDLE_FLAG_PROTECT_FROM_CLOSE);
getchar();
return 0;
}
算法和查看句柄表
打印出OpenProcess获取的HANDLE 句柄。根据这个句柄在EPROCESS可以找到对应的内核对象句柄。例如OpenProcess就可以获取到别的进程的EPROCESS。
获取的是123.exe 的EPROCESS,我们用dbg在上方leizifunc16.exe句柄表中查找。
第一个句柄是0x9c;
首先在leizifunc16.exe EPROCESS—>0x570指针指向ObjectTable结构体—>[+0x008] TableCode指针,取TableCode地址;
其次:用9c/4*0x10 = 270;
再次 :TableCode地址 + 0x270
对地址进行换算右移16位,在与上FFFFFFFFFFFFFFF0:bf0f634050500001>>0x10&FFFFFFFFFFFFFFF0
16字节。
可以获取到地址FFFFBF0F 63405050 这个地址为:exe头部:_OBJECT_HEADER
kd> dt _OBJECT_HEADER
nt!_OBJECT_HEADER
+0x000 PointerCount : Int8B
+0x008 HandleCount : Int8B
+0x008 NextToFree : Ptr64 Void
+0x010 Lock : _EX_PUSH_LOCK
+0x018 TypeIndex : UChar
+0x019 TraceFlags : UChar
+0x019 DbgRefTrace : Pos 0, 1 Bit
+0x019 DbgTracePermanent : Pos 1, 1 Bit
+0x01a InfoMask : UChar
+0x01b Flags : UChar
+0x01b NewObject : Pos 0, 1 Bit
+0x01b KernelObject : Pos 1, 1 Bit
+0x01b KernelOnlyAccess : Pos 2, 1 Bit
+0x01b ExclusiveObject : Pos 3, 1 Bit
+0x01b PermanentObject : Pos 4, 1 Bit
+0x01b DefaultSecurityQuota : Pos 5, 1 Bit
+0x01b SingleHandleEntry : Pos 6, 1 Bit
+0x01b DeletedInline : Pos 7, 1 Bit
+0x01c Reserved : Uint4B
+0x020 ObjectCreateInfo : Ptr64 _OBJECT_CREATE_INFORMATION
+0x020 QuotaBlockCharged : Ptr64 Void
+0x028 SecurityDescriptor : Ptr64 Void
+0x030 Body : _QUAD
FFFFBF0F 63405050 + 0x30 就刚好是123.exe的EPROCESS
总结
对于16个字节,每几个字节的属性特征,之后在做测试!