ZwProtectVirtualMemory () возвращает NTSTATUS 0xC0000018 - PullRequest
0 голосов
/ 05 мая 2019

Я пытаюсь вызвать ZwProtectVirtualMemory() из моего драйвера, когда я вызываю его с параметрами, я считаю, что ничего не происходит, и NTSTATUS 0xC0000018 возвращается (STATUS_CONFLICTING_ADDRESSES).

Здесь я беру PEPROCESS указатель.

if (!NT_SUCCESS(PsLookupProcessByProcessId((void*)request->target_pid, &target_process)))

Я знаю, что это правильно, потому что я могу использовать это для чтения и записи с MmCopyVirtualMemory.Затем я пытаюсь вызвать ZwProtectVirtualMemory(), так что сначала я переключаю контекст с помощью KeStackAttachProcess, затем пытаюсь вызвать его.

KAPC_STATE apc;
KeStackAttachProcess(target_process, &apc); 
{
    auto protect_base = (void*)request->target_addr; // ZwProtectVirtualMemory writes to target_addr
    unsigned long old_prot = 0;
    DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "base : %X size : %i protection : %X" , protect_base, request->size, request->protection);
    status = ZwProtectVirtualMemory(ZwCurrentProcess(), &protect_base, (unsigned long*)&request->size, request->protection, &old_prot);
    DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "returned : %X", status);
}
KeUnstackDetachProcess(&apc);

Первый DbgPrintEx выводит ожидаемые параметры, а второй возвращает 0xC0000018 как указано ранее.

...