Member 14771100 Ответов: 1

Почему zwqueryvirtualmemory возвращает недопустимый дескриптор?


Привет,

моя конечная цель - попытаться прочитать виртуальную память из процесса. В настоящее время я породил системный поток, который работает в выбранном процессе.

вот пример кода, который, как я думал, будет работать
MEMORY_BASIC_INFORMATION* memory = ExAllocatePoolWithTag(PagedPool, sizeof(MEMORY_BASIC_INFORMATION), '1gaT');
    PSIZE_T returnLength = 1;
    PVOID readAddr = 0;

NTSTATUS status = ZwQueryVirtualMemory(PsGetProcessId(IoGetCurrentProcess());, readAddr, MemoryBasicInformation, memory, sizeof(MEMORY_BASIC_INFORMATION), returnLength);


Что я уже пробовал:

Согласно документам, ZwQueryVirtualMemory принимает ProcessHandle в качестве первого параметра. PsGetProcessId возвращает processHandle (PID), поэтому я немного запутался в том, почему он не работает.

Я уже пробовал
ZwCurrentProcess()

функция как параметр ProcessHanlde, который возвращает значение -1. Другие форумы предположили, что это значение -1 является специальным значением, которое все функции, принимающие в processHandle, понимают, что -1 является текущим процессом, однако при использовании в
PsLookupProcessByProcessId(ZwCurrentProcess(), &peprocess);

Я получаю
STATUS_INVALID_CID

это означает, что был указан неверный идентификатор клиента.

любое разъяснение о том, почему это такое поведение, было бы оценено по достоинству.
Спасибо

1 Ответов

Рейтинг:
2

KarstenK

Очевидная причина заключается в том, что идентификатор недействителен. Распространенная причина заключается в том, что ваш процесс не имеет прав на доступ к нему. Попробуйте в качестве администратора.

Системный процесс имеет некоторые особые права, поэтому даже у процесса администратора могут возникнуть проблемы. Попробуйте создать некоторую память с более низкими правами. Я помню, что несколько лет назад создал несколько именованных объектов с префиксом "Global\\".