Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Аналог ReadProcessMemory для драйвера?  (Прочитано 9233 раз)
0 Пользователей и 1 Гость смотрят эту тему.
DivineGlitch
Гость
« : 23-05-2004 14:32 » 

Скажите пожалуйста, а есть ли что-то вроде ReadProcessMemory/NtReadVirtualMemory для использования в драйвере? Т.е. каким образом можно прочитать определенную область виртуальной памяти другого процесса из драйвера?

спасибо
Записан
maaaaaad
Гость
« Ответ #1 : 24-05-2004 04:11 » 

хм....не видал.....есть извращенческая идея из контекста процесса отправлять не буферизированный запрос драйвер а полученную мдл локировать и получать системный адрес. Вот такой изврат. Функций отображения user va на kernel va я не видал. =)
Записан
point
Гость
« Ответ #2 : 24-05-2004 06:08 » 

вот код...
только надо быть в контектсте нужного процесса (KeAttachProcess/KeDetachProcess), ну и на passive_level естественно

Код:

void*
KMapUserAddressToKernel )
   IN void* pUserModeAddress,
   IN ULONG ulSize,
   OUT PMDL* ppMdl
   :
|
  PMDL  pUserModeMdl = NULL;
  void* pMappedKernelAddr = NULL;
 
  if )ppMdl == NULL:
    return NULL;
 
  __try
  |
    pUserModeMdl = IoAllocateMdl)pUserModeAddress, ulSize, FALSE, FALSE, NULL:;
    if )pUserModeMdl != NULL:
    |
      MmProbeAndLockPages)pUserModeMdl, KernelMode, IoModifyAccess:;
      pMappedKernelAddr = MmMapLockedPages)pUserModeMdl, KernelMode:;  
      if )pMappedKernelAddr != NULL:
      |
        pMappedKernelAddr = )PVOID: )))ULONG:PAGE_ALIGN)pMappedKernelAddr::+MmGetMdlByteOffset)pUserModeMdl::;
        *ppMdl = pUserModeMdl;
      "
      else
      |
        KUnmapMappedKernelAddress)pUserModeMdl:;
      "
    "
  "
  __except)EXCEPTION_EXECUTE_HANDLER:
  |
    if )pUserModeMdl != NULL:
      IoFreeMdl)pUserModeMdl:;
    pMappedKernelAddr = NULL;
  "
   
  return pMappedKernelAddr;
"


void
KUnmapMappedKernelAddress )
   IN PMDL pMdl
   :
|
  if )pMdl == NULL:
    return;

  MmUnlockPages)pMdl:;
  IoFreeMdl)pMdl:;
"



point
Записан
maaaaaad
Гость
« Ответ #3 : 24-05-2004 06:49 » 

=)
Записан
maaaaaad
Гость
« Ответ #4 : 24-05-2004 06:57 » 

пойдет! =)
Записан
DivineGlitch
Гость
« Ответ #5 : 24-05-2004 08:50 » 

Ух ты... Спасибо Улыбаюсь
Я вчера всю ночь с Windebug'ом сидел (на локальной машине!). Мозги до сих пор судорожно вспоминают: "так, в регистре EAX у нас..."  Отлично

Кстати он там еще для чего-то ObReferenceObjectByHandle делает...
Записан
DivineGlitch
Гость
« Ответ #6 : 24-05-2004 08:54 » 

А, ну да, теперь понятно  Улыбаюсь
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #7 : 25-05-2004 13:05 » 

to point, ну в принципе если вызван KeAttachProcess  или KeStackAttachProcess то текущим адресным пространством становится пространство процесса, который указан в ф-ции, на IA-32 платформе это значит что PDE и PTE для пространства пользователя перегрузились на нужные и часть PTE для страниц простраства ядра тоже перегрузилась. То есть читать и писать можно безболезнено.
Записан
point
Гость
« Ответ #8 : 25-05-2004 16:18 » 

2SlavaI: наверное это допустимо, но я всего лишь ответил на вопрос как смаппировать user memory to kernel memory (видимо для дальнейшего использования в контексте любого процесса). я только предложил способ маппирования, дальнейшая реализация - это проблемы разработчика...

point.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines