请求 ProcessBasicInformation 时 ZwQueryInformationProcess 的奇怪行为

Posted

技术标签:

【中文标题】请求 ProcessBasicInformation 时 ZwQueryInformationProcess 的奇怪行为【英文标题】:ZwQueryInformationProcess strange behavior when ProcessBasicInformation requeqsted 【发布时间】:2019-04-24 15:25:53 【问题描述】:

作为驱动程序的一部分,我拥有这种和平的代码。此驱动程序适用于 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 函数成功。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

感谢您的回答和解决方案。我需要使用 long long 类型变量在应用程序端存储地址? PEPROCESS 是指针类型(指向EPROCESS 结构的指针)。要打印指针类型,请使用 p format specifier。 long long(以及 %llx)错误有两个原因:long long 已签名(指针未签名),并且在 32 位构建中大小错误。 @IInspectable - 我应该在昨天回答之前先喝咖啡!感谢您指出我的错误。已更正。 @ThomasAndersen - 请注意对此答案的更正。 %llx 不是打印地址指针变量的正确方法。对不起那个错误。

以上是关于请求 ProcessBasicInformation 时 ZwQueryInformationProcess 的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

options请求问题

网络请求之GETPOST请求

简单请求和复杂请求

HTTP请求行请求头请求体以及响应行响应头响应体

关于HTTP请求头

HttpClient请求及代理IP请求