ZwQueryInformationProcess

ZwQueryInformationProcess

作为驱动程序的一部分,我拥有这种代码的宁静。该驱动程序适用于Windows 7 x64,因此可以在同一系统上执行。

PVOID GetProcessInformation(ULONG PID)
{
    NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;

    HANDLE hProcess;
    PEPROCESS pProcess = NULL;

    PVOID pProcInfo = NULL;

    ULONG ulRet = 0;

    if ((pProcInfo = ExAllocatePoolWithTag(NonPagedPool, sizeof(PROCESS_BASIC_INFORMATION), 'QPI')) == NULL)
    {
        DbgPrint("ExAllocatePoolWithTag failed");
        return NULL;
    }
    ntStatus = PsLookupProcessByProcessId(PID, &pProcess);
    if (!NT_SUCCESS(ntStatus))
    {
        DbgPrint("PsLookupProcessByProcessId Returned: 0x%08x\n", ntStatus);
        ExFreePool(pProcInfo);
        return NULL;
    }
    ntStatus = ObOpenObjectByPointer(pProcess, 0, NULL, 0, 0, KernelMode, &hProcess);
    if (!NT_SUCCESS(ntStatus))
    {
        DbgPrint("ObOpenObjectByPointer sReturned: 0x%08x\n", ntStatus);
        ExFreePool(pProcInfo);
        return NULL;
    }

    ObDereferenceObject(pProcess);
    ntStatus = ZwQueryInformationProcess(hProcess, ProcessBasicInformation, pProcInfo, sizeof(PROCESS_BASIC_INFORMATION), &ulRet);
    if (!NT_SUCCESS(ntStatus))
    {
        DbgPrint("ZwQueryInformationProcess Returned: 0x%08x\n", ntStatus);
        ExFreePool(pProcInfo);
        return NULL;
    }
    if (ulRet != sizeof(PROCESS_BASIC_INFORMATION))
        DbgPrint("Warning : ZwQueryInformationProcess Returned Length is different than ProcessInformationLength");

    return pProcInfo;
}


在ntddk中定义的PROCESS_BASIC_INFORMATION。 PID值正确。但是ZwQueryInformationProcess的结果很奇怪。我只得到PEB地址的下部(PROCESS_BASIC_INFORMATION结构中的PPEB部分)。例如,另一个工具说PPEB等于0x000007FFFFFDC000。我的驱动程序仅知道0xFFFDC000。
我也尝试PsGetprocessPeb(...)函数,具有相同的结果。 ZwQueryInformationProcess函数成功。

最佳答案

已更正:
为了解决您的问题,我只得到PEB地址部分的下半部分,
因为pProcess是指针,所以使用指针格式说明符:%p

ntStatus = PsLookupProcessByProcessId(PID, &pProcess);
// your error handling code
printf("PsLookupProcessByProcessId: 0x%p\n", pProcess);


"%p" pointer format specifier将参数显示为十六进制地址。

关于c - ZwQueryInformationProcess重新请求ProcessBasicInformation时的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55833628/

10-09 08:43