Может ли драйвер режима ядра выполнять ReadProcessMemory на любом процессе? - PullRequest
0 голосов
/ 02 июня 2018

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

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

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

0 голосов
/ 21 июня 2018

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

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

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

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

0 голосов
/ 02 июня 2018

Согласно 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
);
...