Перехват драйвера дисплея Windows, 64 бит - PullRequest
5 голосов
/ 18 марта 2012

Однажды я написал своего рода драйвер для 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 после того, как он был сопоставлен?
  • Есть ли еще потенциальные проблемы, о которых я не думал?
  • Есть ли другие способы добиться того, чего я хочу?

Заранее спасибо.

1 Ответ

2 голосов
/ 20 июня 2012

Нужно ли отключать PatchGuard, если я собираюсь исправлять сопоставленный образ DLL после того, как он был сопоставлен?

Чтобы загрузить любой драйвер на x64, он должен быть подписан. С правами администратора вы можете отключить PatchGuard, и я лично рекомендую использовать DSEO, приложение с графическим интерфейсом для этого. Или вы можете обойти PatchGuard, перезаписав MBR (или BIOS), хотя это обычно считается буткитом - вредоносным ПО.

...