Адрес сопоставления win32k.sys в пространстве сеанса - PullRequest
3 голосов
/ 12 июня 2011

Мой вопрос:

когда win32k.sys загружается в пространство сеанса, получает ли он один и тот же базовый адрес в каждом сеансе?

Подробности:

Я пишу драйвер устройства в режиме ядра для Windows (32 бит).Он загружается как стандартный драйвер WDM в системное пространство (глобальная память режима ядра) во время загрузки системы.

Однако в некоторых ситуациях мне требуется доступ к функциям, экспортируемым win32k.sys.Чтобы быть точным, я пишу своего рода драйвер, который иногда нужно притворяться драйвером дисплея.

I может не статически импортировать эти функции (значит, импортировать их с помощью исполняемого импортаТаблица).Это потому, что win32k.sys загружается на более позднем этапе, когда создаются сеансы.Более того, он загружается в пространство сеанса .

Тем не менее я нашел обходной путь.При создании сеанса я динамически импортирую нужные функции.Я использую ZwQuerySystemInformation с SystemModuleInformation, чтобы найти базовый адрес win32k.sys в текущем сеансе .Затем, используя этот базовый адрес, я анализирую его, чтобы найти каталог экспорта win32k.sys и получить необходимые указатели функций.

В настоящее время для каждой сессии я сохраняю отдельный массив импортируемых функций.Однако практически эти функции всегда одинаковы во всех сеансах.Означает, что win32k.sys сопоставляется с одним и тем же адресом, принадлежащим пространству сеанса в каждом сеансе.

Следовательно, у меня вопрос, есть ли гарантия, что win32k.sys будет сопоставлен с одним и тем же адресом во всехсеансы?

Помимо экономии памяти, мне будет легче.В настоящее время для вызова такой функции мне нужен специфичный для сеанса контекст, в котором хранятся указатели функций.

Ответы [ 2 ]

2 голосов
/ 10 декабря 2012

Мой опыт показывает, что win32k.sys базовый адрес одинаков в контексте всех процессов, которые отображаются драйвером.Во время инициализации win32k.sys вызывает ntoskrnl.exe для создания объектов ядра типа объектов для рабочих столов, оконных станций и, возможно, других объектов, используемых драйвером.Эти объекты ядра должны быть по одним и тем же адресам в контексте всех процессов, чтобы поддерживать согласованность структур данных ядра (например, в модуле ntoskrnl.exe имеется массив указателей на все объекты типа объекта).

Кроме того, win32k.sys содержит таблицу системных вызовов (win32k!W32pServiceTable).Адрес таблицы снова сохраняется в фиксированном месте в ntoskrnl.exe (nt!KeServiceDescriptorTableshadow).

Таким образом, если драйвер win32k.sys был сопоставлен с разными адресами в другом сеансе, ntoskrnl.exe должен вести себя одинаково.И это не так (такое поведение может вызвать дополнительные проблемы, например, с SYSENTER/SYSCALL).Но я не видел этого факта ни в одной официальной документации.

0 голосов
/ 03 августа 2011

Я не очень уверен, но я думаю, что ответ ДА.Win32k.sys - это просто еще один (специальный) файл DLL, и каждый файл DLL в Windows имеет базовый адрес в своем PE-заголовке.Для win32k.sys, который предоставляется Windows (я думаю), базовый адрес никогда не должен конфликтовать с другими системными файлами dll (.sys).

Чтобы быть в безопасности, вы можете сделать свою программу немного гибкой.В начале вы предполагаете, что адрес тот же.Но вы проверяете адрес прежде, чем вы на самом деле позвоните.Таким образом, система не будет зависать из-за плохого адреса, по крайней мере.

...