2011-12-16 2 views
2

Это просто и просто в пользовательском режиме из-за этих API.Ядро Windows ReadProcessMemory()/WriteProcessMemory()?

Как вы читаете/записываете память пользовательского пространства указанного процесса из модуля ядра Windows?

целевой драйвер платформы Windows XP/2003

+2

Вы должны получать доступ к памяти в контексте во время фазы захвата, после чего вы должны работать только с захваченными значениями. В противном случае у вас есть уязвимость системы безопасности. –

ответ

4

Использование NtWriteVirtualMemory/NtReadVirtualMemory писать для других процессов - вам нужно будет открыть дескриптор процесса первым.

Обратите внимание, что если вы уже находитесь в процессе, вы можете просто написать напрямую - например, если вы отвечаете на запрос DeviceIoControl от процесса, вы можете напрямую писать адреса пользовательского режима, и они будут находиться в адресное пространство процесса, вызвавшего вас.

0

Я также начинаю в мире драйверов окон и из того, что я прочитал. XxxProcessMemory вызывает NtXxxVirtualMemory в ntdll (R3-UserMode). NtXxxVirtualMemory вызывает ZwXxxVirtualMemory (R0-KernelMode) также в ntdll.

Я считаю, что вам следует использовать ZwXxxVirtualMemory.

0

В krnel процедуры ZwXxx представляют собой всего лишь обертки вокруг NtXxx, сообщающие ядру, что вызывающий объект является компонентом режима ядра, а не пользовательским приложением. Когда вызов поступает из usermode, ядро ​​выполняет дополнительные проверки безопасности.

Итак, используйте ZwXxx, когда в ядре.

Альтернативный подход для чтения/записи памяти из/в другой процесс:

  1. получить адрес своего технологического объекта (PsLookupProcessByProcessId),
  2. переключателя текущего потока к его адресному пространству (KeStackAttachProcess),
  3. выполнить операцию (чтение/запись ...),
  4. переключатель адресного пространства обратно (KeUnstackDetachProcess),
  5. декремент счетчик ссылок увеличивается на (1) (ObDereferenceObject).
Смежные вопросы