ZwQueryInformationProcess странное поведение при запросе ProcessBasicInformation - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть этот код в составе драйвера.Этот драйвер предназначен для 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;
}

PROCESS_BASIC_INFORMATION, определенный в ntddk.Значение PID правильное.Но результат ZwQueryInformationProcess странный.Я получаю только нижнюю часть адреса PEB (часть PPEB в структуре PROCESS_BASIC_INFORMATION).Например, другой инструмент сообщает, что PPEB равен 0x000007FFFFFDC000.Мои драйверы знают только 0xFFFDC000.Также я пробую функцию PsGetprocessPeb (...), с тем же результатом.Функция ZwQueryInformationProcess выполнена успешно.

1 Ответ

0 голосов
/ 24 апреля 2019

Исправлено:
Для решения я получаю только нижнюю часть адреса PEB часть вашего вопроса,
, потому что pProcessуказатель, используйте спецификатор формата указателя: %p.

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

"%p" спецификатор формата указателя отображает аргумент в виде шестнадцатеричного адреса.

...