Я пытаюсь вызвать 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
как указано ранее.