////////////////////////////////
//功 能:根据进程ID获取进程句柄
//参 数: 进程ID
//返 回 值:进程句柄
////////////////////////////////
HANDLE OpenProcess(
HANDLE
Processid
)
{
NTSTATUS status;
PEPROCESS Process =
NULL;
HANDLE hProcess =
NULL;
UNICODE_STRING
Unicode;
status =
PsLookupProcessByProcessId(Processid,
&Process);
if
(NT_SUCCESS(status))//判断进程号是否存在
{
RtlInitUnicodeString(&Unicode,
L"PsProcessType");
//得到系统导出函数的地址和用户态的GetProcessAddress雷同
PsProcessType =
MmGetSystemRoutineAddress(&Unicode);
if (PsProcessType)
{
status =
ObOpenObjectByPointer(
Process,
0,
NULL,
PROCESS_ALL_ACCESS,
(PVOID) * PsProcessType,
KernelMode,
&hProcess
);
if
(NT_SUCCESS(status))
{
//减少指针计数
ObfDereferenceObject(Process);
return hProcess;
}
}
ObfDereferenceObject(Process);
}
return 0;
}
加载中,请稍候......