среда, 27 октября 2010 г.

Детект доступа к PhysicalMemory или почему "стандартные" решения это плохо

Предположим, нам нужно задетектировать открытие секции "\\Device\\PhysicalMemory" с правами на запись юзерским приложением.
Стандартным решением в такой ситуации будет перехват ф-ции ZwOpenSection в ssdt a.k.a сплайсинг.

Правильно ли это? Казалось бы да, других способов открыть секцию минуя эту ф-цию вроде бы не существует, и все обращения пользовательских процессов к данной секции будут найдены. Однако, это не так.

Секрет в том, что секция может быть открыта неявно.
К примеру, java.exe при определенных обстоятельствах обращается к драйверу videoprt.sys, а он делает:

PAGE:0001D089 push ds:_PhysicalMemorySection
PAGE:0001D08F call ds:impObOpenObjectByPointer@28


Все это конечно происходит в контексте вызывающего, и KTHREAD.PreviousMode равен UserMode. Таким образом никаким сплайсингом такое не задетектировать, нужно спуститься чуть глубже и установить OpenProcedure у объекта секция, в агрументах придет вся необходимая информация, которой достаточно для определения имени секции, вызвающего процесса, маски доступа и т.д.


2 комментария:

  1. в итоге получилось использовать videoprt.sys, для записи в физ. память?

    ОтветитьУдалить
  2. Я ловил запись в физ. память, а не записывал =]

    ОтветитьУдалить