最近我对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,但这超出了我的范围。任何想法表示赞赏。这个问题困扰了我好几天了。