Однажды я написал своего рода драйвер для Windows, который должен был перехватывать взаимодействие родного драйвера дисплея с ОС. Собственный драйвер дисплея состоит из драйвера минипорта и библиотеки DLL, загруженной win32k.sys в пространство сеанса. Моей целью было вмешаться между win32k.sys и этой DLL. Более того, в системе может быть несколько драйверов дисплея, мне пришлось их всех подключить.
Я создал стандартный драйвер WDM, который был настроен для загрузки при загрузке системы (то есть до win32k). Во время инициализации он перехватил ZwSetSystemInformation
, исправив SSDT. Эта функция вызывается ОС всякий раз, когда она загружает / выгружает DLL в пространство сеанса, а это именно то, что мне нужно.
Когда ZwSetSystemInformation
вызывается с параметром SystemLoadImage
- одним из его параметров является указатель на структуру SYSTEM_LOAD_IMAGE
, а ModuleBase
- адрес базового отображения модуля. Затем я анализирую отображенное изображение, patch его точку входа с моей функцией, а остальное просто.
Теперь мне нужно перенести этот драйвер на 64-битную Windows. Излишне говорить, что это совсем не тривиальная задача. Пока что я нашел следующие препятствия:
- Все драйверы должны быть подписаны
- PatchGuard
- SSDT напрямую не экспортируется.
Если я правильно понимаю, проверка подписи PatchGuard и драйвера может быть отключена, драйвер должен быть установлен на выделенном компьютере, и мы можем пытать его так, как хотим.
Согласно интернет-источникам, есть и трюки, чтобы найти SSDT.
Однако недавно я обнаружил, что существует функция с именем PsSetLoadImageNotifyRoutine
. Это может значительно упростить задачу и помочь избежать подвохов.
Мой вопрос:
- Если я использую
PsSetLoadImageNotifyRoutine
, получу ли я уведомления о библиотеках DLL, загруженных в пространство сеанса? Официальная документация говорит о «системном пространстве или пользовательском пространстве», но включает ли «системное пространство» также пространство сеанса?
- Нужно ли отключать PatchGuard, если я собираюсь пропатчить сопоставленный образ DLL после того, как он был сопоставлен?
- Есть ли еще потенциальные проблемы, о которых я не думал?
- Есть ли другие способы добиться того, чего я хочу?
Заранее спасибо.