Как изменить защиту страницы из режима ядра в процессе пользовательского режима - PullRequest
0 голосов
/ 02 марта 2019

В последнее время я очень заинтересовался разработкой режима ядра 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);

Это BSODS дает мне необработанное сообщение об исключении kmode.Второе, что я попробовал, это перевернуть 16-й бит регистра cr0, но это также помогло мне BSOD.Я также пытался отобразить MDL из физической памяти, но это было выходом из моей лиги.Любые идеи приветствуются.эта проблема беспокоила меня уже несколько дней.

...