如何在用户模式进程中从内核模式更改页面保护

时间:2019-03-02 00:52:56

标签: c++ c windows kernel kernel-mode

最近我对Windows内核模式的开发非常感兴趣,我正在尝试在用户模式的程序内编写一个jmp指令。请务必注意,我的驱动程序是通过drvmap手动映射到内核空间的。我可以使用MmCopyVirtualMemory轻松读取/写入,但是不幸的是,我需要写入的内存部分受到保护。我尝试了多种方法都无济于事。我尝试的第一种方法是使用ZwProtectVirtualMemory,它是一个ntdll.dll未公开记录的函数,我将这样的函数导入了驱动程序

extern "C"{__declspec(dllimport) NTSYSAPI NTSTATUS NTAPI ZwProtectVirtualMemory(IN HANDLE ProcessHandle, IN OUT PVOID *BaseAddress, IN OUT PULONG NumberOfBytesToProtect, IN ULONG NewAccessProtection, OUT PULONG OldAccessProtection);}

我这样调用函数

KAPC_STATE apc;
KeStackAttachProcess(proc, &apc);
auto addy = (void*)in->addr;
unsigned long old_prot;
ZwProtectVirtualMemory(ZwCurrentProcess(), &addy, (PULONG)in->sz, PAGE_EXECUTE_READWRITE, &old_prot);
KeUnstackDetachProcess(&apc);

那让我给了我未处理的kmode异常消息。我尝试的第二件事是翻转cr0寄存器的第16位,但是BSOD也使我感到困惑。我还尝试从物理内存映射MDL,但这超出了我的范围。任何想法表示赞赏。这个问题困扰了我好几天了。

0 个答案:

没有答案