通过遍历系统句柄信息(SystemHandleInformation),获取系统进程和当前进程的eprocess

实验环境:win10 1909 64

(2022/03/24,在 win11 10.0.2200.318上,调用ZwQuerySystemInformation获取句柄信息,返回错误:0xc0000005)

参考:获得进程的EPROCESS_尘埃落定-CSDN博客

首先,获取系统的句柄信息;然后,在句柄信息表中进行搜索,通过数据结构进行匹配;最后,确定系统进程和当前进程的eprocess;

主要数据结构如下:

typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO {USHORT UniqueProcessId;USHORT CreatorBackTraceIndex;UCHAR ObjectTypeIndex;UCHAR HandleAttributes;USHORT HandleValue;PVOID Object;ULONG GrantedAccess;
} SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;typedef struct _SYSTEM_HANDLE_INFORMATION {ULONG NumberOfHandles;SYSTEM_HANDLE_TABLE_ENTRY_INFO Handles[1];
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;

成员的含义:

UniqueProcessId,表示进程号,也就是该句柄所属的进程。比如进程a(进程号为0x336)打开了文件b,产生了一个句柄c(其值为0x1900);以上过程会产生一个系统句柄表项:

   {

    USHORT UniqueProcessId=0x336
    USHORT CreatorBackTraceIndex; //暂空
    UCHAR ObjectTypeIndex=0x25;//0x25 对应文件类型对象
    UCHAR HandleAttributes;//暂空
    USHORT HandleValue=0x1900;//句柄值
    PVOID Object;//对应一个文件对象
    ULONG GrantedAccess;//暂空
}

利用上面的数据信息,获取系统进程和当前进程的eprocess:

# define ProcessObjectTypeIndex 0x7
# define SystemProcessId 0x4
# define SystemProcessHandleValue 0x4
//
//通过进程号(ProcessId),获取进程对象eprocess
// 获取系统进程和当前进程的eprocess
//参数:PID
ULONG64 GetEprocessFromPid(ULONG    PID)
{NTSTATUS                    status;PVOID                        buf = NULL;ULONG                        size = 0x1000;ULONG                        result = 0;ULONG                        NumOfHandle = 0;PSYSTEM_HANDLE_TABLE_ENTRY_INFO    h_info = NULL;HANDLE hCurrentProcess = INVALID_HANDLE_VALUE;printf("[++]enter GetEprocessFromPid(*)\n");//申请当前进程的句柄printf("[++]Current Process ID:%d\n", PID);hCurrentProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);do {buf = malloc(size);status = NtQuerySystemInformation(SystemHandleInformation, buf, size, &result);if (!NT_SUCCESS(status)){if (STATUS_INFO_LENGTH_MISMATCH == status){free(buf);buf = NULL;size = size * 2;continue;}else{printf("ZwQuerySystemInformation() failed");return status;}}else{break;}} while (true);//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组printf("[++]get system handle information\n");NumOfHandle = ((PSYSTEM_HANDLE_INFORMATION)buf)->NumberOfHandles;printf("[++]there are %d entries!\n", NumOfHandle);h_info = ((PSYSTEM_HANDLE_INFORMATION)buf)->Handles;for (i = 0; i < NumOfHandle; i++){if ((h_info[i].ObjectTypeIndex == ProcessObjectTypeIndex)){//获取系统进程(system)的eprocess //系统进程中的句柄值为0x4的句柄,通常对应的系统进程if (h_info[i].UniqueProcessId == SystemProcessId&&h_info[i].HandleValue==SystemProcessHandleValue){printf("System Process Object 0x%p\n", h_info[i].Object);}//获取当前进程的eprocess//与之前获取的当前进程的句柄值进行对比if (h_info[i].UniqueProcessId == PID&&(h_info[i].HandleValue==(USHORT)hCurrentProcess)){printf("Current Process Object 0x%p\n", h_info[i].Object);}}}if (hCurrentProcess){CloseHandle(hCurrentProcess);}if (buf != NULL){free(buf);buf = NULL;}return(FALSE);
}

测试结构:


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部