Может ли драйвер режима ядра выполнять ReadProcessMemory на любом процессе?

В настоящее время я пишу драйвер режима ядра (программный драйвер) с KMDF, и, поскольку я очень новичок в этой теме, я хочу спросить вас, сможет ли мой драйвер вызывать OpenProcess и ReadProcessMemory в любом запущенном процессе или есть какой-то способ предотвратить что мой драйвер может вызывать эти функции в процессе из режима ядра?

0

Решение

Вы можете получить указатель на целевой процесс по вызову PsLookupProcessByProcessId. чем звонить KeStackAttachProcess и прямое чтение памяти процесса. потому что это пользовательский режим памяти — обязательно сделать это в __try/__except блок. наконец позвоните KeUnstackDetachProcess а также ObfDereferenceObject для целевого процесса

1

Другие решения

У вас есть NtReadVirtualMemory, но в режиме ядра нет версии Zw *, что означает, что вам придется искать адрес самостоятельно (с помощью KeServiceDescriptorTable будет работать, но сканирование памяти также вариант).

Имейте в виду, что если вы хотите использовать какие-либо адреса в режиме ядра, вам нужно установить PreviousMode текущего потока в 0 (KernelMode), если вы выполняете его в контексте неядерного потока ( например, в процедуре обратного вызова вы можете быть помещены в контекст другого процесса, отличного от NTOSKRNL). Это то, что подпрограммы Zw * будут делать для вас автоматически в режиме ядра, но, как я уже сказал, очевидно, что для режима NtReadVirtualMemory в режиме ядра не существует (Microsoft просто не хочет, чтобы вы использовали его, я думаю, ).

Второй подход заключается в том, чтобы привязать к контексту процесса, о котором вы хотите прочитать память, а затем положиться на MmCopyMemory (задокументировано в MSDN) для копирования памяти с адреса, действительного в процессе, к которому вы только что подключены, в ваш собственный буфер. Затем вы можете получить доступ к скопированной памяти из вашего собственного буфера. Не забудьте отделить.

Кроме того, вы можете выбрать путь, предложенный @RbMm. Лично я бы принял его предложение, потому что это документированный подход, и вы, вероятно, добьетесь большего успеха в его реализации (не говоря уже о том, что у вас будет меньше работы).

2

В соответствии с https://github.com/Zer0Mem0ry/KernelBhop/blob/master/Driver/Driver.c, вам нужно использовать недокументированное MmCopyVirtualMemory для чтения и записи любого процесса.

NTSTATUS NTAPI MmCopyVirtualMemory
(
PEPROCESS SourceProcess,
PVOID SourceAddress,
PEPROCESS TargetProcess,
PVOID TargetAddress,
SIZE_T BufferSize,
KPROCESSOR_MODE PreviousMode,
PSIZE_T ReturnSize
);
1
По вопросам рекламы [email protected]