Провека ядерного адреса на возможность чтения

Тема в разделе "WASM.NT.KERNEL", создана пользователем somebodynew, 28 июл 2018.

  1. somebodynew

    somebodynew New Member

    Публикаций:
    0
    Регистрация:
    18 май 2018
    Сообщения:
    8
    Адрес может быть как впринципе невалиден (MmIsAddressValid вернет FALSE), так и иметь специфичные условия для чтения (например всё что относится к графической подсистеме - win32k/tsddd, доступ в контексте system процесса вызовет ребут без какого либо бсода). Собственно, как безопасно попытаться прочитать ядерную память ?
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Нужно понизить IRQL до уровня подкачки и обратиться к адресу(fetch), прежде обернув вызов в SEH или используя какой либо иной метод для отлова исключения. Если адреса(страницы) нет в рабочем наборе, он будет туда загружен. Иначе управление вернёт обработчик исключения. Но конечно можно покопаться в низкоуровневых кернел структурах и добыть инфу про состояние страницы :)
     
  3. somebodynew

    somebodynew New Member

    Публикаций:
    0
    Регистрация:
    18 май 2018
    Сообщения:
    8
    Никакие SEH не спасали (да и не должны же). Решил это проверкой адреса на MmGetPhysicalAddress != 0.
     
  4. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    somebodynew,

    А если выгружена; подкачивается память прямым обычно обращением. Тогда получается из за не обращения вы посчитали валид адрес на низком IRQL не валидным на высоком IRQL. Это не верное решение.

    Сех не на всех IRQL работает, поэтому если его понизить нельзя, то следует организовать интерфейс между потоком на низком IRQL. Иначе опять же придётся лезть в нт интерналс. Обычно выбирается простой пусть, копаться в структурах ядра не лучший метод.