常用工具函数记录---(Kernel) PID-HANDLE-EPROCESS-PATH 转换

根据PID获取进程句柄:

HANDLE GetHandleByPid(ULONG iPid)
    {
        HANDLE  handle = 0;
        OBJECT_ATTRIBUTES ObjectAttributes;
        CLIENT_ID clientid;
        InitializeObjectAttributes(&ObjectAttributes, 0, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 0, 0);
        clientid.UniqueProcess = (HANDLE)iPid;
        clientid.UniqueThread = 0;
        ZwOpenProcess(&handle, PROCESS_ALL_ACCESS, &ObjectAttributes, &clientid);
        return handle;
    }

根据句柄获取进程PID:

    ULONG GetPidByHandle(HANDLE ProcessHandle)
    {
        ULONG pid = 0;
        PROCESS_BASIC_INFORMATION pbi;
        auto st = ZwQueryInformationProcess(ProcessHandle, ProcessBasicInformation, (PVOID)&pbi, sizeof(PROCESS_BASIC_INFORMATION), NULL);
        if(NT_SUCCESS(st))
        {
            pid = (ULONG)pbi.UniqueProcessId;
        }
        return pid;
    }

根据PID获取进程EPROCESS:

   PEPROCESS  GetPepByPid(ULONG iPid)
    {
        PEPROCESS pEProc=0;
        auto st =PsLookupProcessByProcessId((HANDLE)iPid, &pEProc);
        if(NT_SUCCESS(st))
        {
            ObDereferenceObject(pEProc);
        }
       
        return pEProc;
    }

根据PID获取进程全路径:


BOOLEAN  GetProcPathByPid(HANDLE hdPid, char* cPath)
{
	BOOLEAN bOk = FALSE;
	PEPROCESS pEpro = 0;
	PFILE_OBJECT FileObject=0;
	PUNICODE_STRING ImageName;
	char parname[512] = { 0 };
	if ((int)hdPid == 4)
	{
		char system[] = "System";
		strcpy(cPath, system);
		bOk = TRUE;
	}
	else
	{
		auto spath = GetProcPathByPid((ULONG)hdPid);
		if (spath.length() > 0)
		{
			strcpy(cPath, spath.c_str());
			bOk = TRUE;
		}
		else
		{
			if (NT_SUCCESS(PsLookupProcessByProcessId(hdPid, &pEpro)))
			{
				if (NT_SUCCESS(PsReferenceProcessFilePointer(pEpro, &FileObject)))
				{
					if (NT_SUCCESS(SeLocateProcessImageName((PEPROCESS)pEpro, &ImageName)))
					{
						StringUnicodeToAnsi(ImageName, parname, ImageName->Length);
						StringToLower(parname);
						strcpy(cPath, parname);
						bOk = TRUE;
					}
				}
				if (FileObject)
					ObDereferenceObject(FileObject);
			}
			if (pEpro)
				ObDereferenceObject(pEpro);
		}
		
	}

	return bOk;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值