🗣️ Статья включает практические примеры в отладчике WinDbg, так что знания можно сразу применить на практике. Рекомендуется к прочтению после первой части.
Подсистема Win32 в архитектуре Windows
🔸В Windows виртуальная память делится на область пользователя (User) и ядра (Kernel). На системах x64 используется только часть адресного пространства. Старшие 16 бит установлены в единицу, что позволяет по старшим битам адреса сразу определять, принадлежит ли объект ядру или пользователю.
🔸Win32, основная подсистема Windows, предоставляет базовые библиотеки окружения, такие как Kernel32, User32 и Gdi32, отвечающие за интерфейсы графики (GUI). Отдельное внимание уделено драйверу win32k.sys, который поддерживает работу графического интерфейса в ядре.
Файлы Csrss.exe, Gdi32.dll и Win32k.sys
🔸GDI (Graphics Device Interface) — это компонент для вывода графического контента на устройства. До NT4 он находился в пользовательском режиме, но в целях безопасности его перенесли в режим ядра, добавив win32k.sys. Теперь CSRSS (Client/Server Runtime SubSystem) обрабатывает только консольные задачи, а графика передана win32k.sys.
SSDT — System Service Descriptor Table
🔸SSDT позволяет выполнять системные вызовы в ядре с использованием SYSENTER/SYSCALL инструкций. Для каждой функции ядра есть уникальный "System Service Number" (SSN), который задает ее адрес в SSDT. Это обеспечивает быстрый и эффективный переход между режимами.
🔸Для графических функций существует отдельная "затененная" таблица — SSDT Shadow. Она действует только для GUI-приложений, тогда как консольные приложения используют основную таблицу SSDT#0.
⚙️ В статье приводится демонстрация работы SSDT и SSDT Shadow в отладчике WinDbg. Указатели на обе таблицы можно обнаружить, подключившись к процессу GUI.
➡️ Читать подробнее
