Ядро Windows ReadProcessMemory () / WriteProcessMemory ()? - PullRequest
2 голосов
/ 16 декабря 2011

Это просто и понятно в пользовательском режиме благодаря этим API.

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

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

Ответы [ 3 ]

4 голосов
/ 08 марта 2012

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

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

0 голосов
/ 17 июля 2016

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

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

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

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

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

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

...