База полезных знаний

Таблицы дескрипторов служб

Главная таблица, используемая по умолчанию, KeServiceDescriptorTable, определяет основные системные службы исполняющей системы, реализованные в файле Ntosrknl.exe. Другая таблица, KeServiceDescriptorTableShadow, включает Windows-службы USER и GDI, реализованные в той части подсистемы Windows, которая работает в режиме ядра, Win32k.sys.

На 32-разрядной версии Windows и на версии IA64, где поток Windows сразу же вызывает Windows-службу USER или службу GDI, адрес таблицы системных служб потока изменяется, чтобы указать на таблицу, которая включает Windows-службы USER и GDI.

Функция KeAddSystemServiceTable позволяет Win32k.sys добавлять таблицу системных служб.

Инструкции диспетчера системных служб для служб исполняющей системы Windows находятся в системной библиотеке Ntdll.dll. Для реализации своих документированных функций DLL-библиотеки подсистем вызывают функции в Ntdll.

Исключение составляют функции Windows USER и GDI, для которых инструкции диспетчера системных служб реализованы в User32.dll и Gdi32.dll — Ntdll.dll в данном случае не привлекается. Эти два обстоятельства показаны на рисунке.

Как показано на рисунке, Windows-функция WriteFile в Kernel32.dll импортирует и вызывает функцию WriteFileв API-MS-Win-Core-File-L1-1-0.dll, в одной из DLL-библиотек перенаправления MinWin, которая, в свою очередь, вызывает функцию WriteFile в KernelBase.dll, где находится ее фактическая реализация.

После проверки некоторых параметров, характерных для подсистемы, она затем вызывает функцию NtWriteFile в Ntdll.dll, которая, в свою очередь, выполняет соответствующую инструкцию, чтобы вызвать системное прерывание системной службы, передавая номер системной службы, представляющей NtWriteFile.

Затем диспетчер системных служб (функция KiSystemService в Ntoskrnl.exe) вызывает настоящую функцию NtWriteFile для обработки запроса ввода-вывода. Для функций Windows USER и GDI диспетчер системных служб вызывает функции в загружаемой части подсистемы Windows режима ядра, Win32k.sys.

Диспетчеризация системных служб.

Содержание:

Отображение номеров системных служб на функции и аргументы.

Такой же поиск можно продублировать с помощью ядра, работая с идентификатором системного вызова для определения, какая именно функция отвечает за его обработку и сколько аргументов она принимает

Отладчик пытается сопоставить каждый указатель с символом. Частичный вывод имеет следующий вид:

lkd> dds KiServiceTable

820807d0 821be2e5 nt!NtAcceptConnectPort

820807d4 820659a6 nt!NtAccessCheck

820807d8 8224a953 nt!NtAccessCheckAndAuditAlarm

820807dc 820659dd nt!NtAccessCheckByType

820807e0 8224a992 nt!NtAccessCheckByTypeAndAuditAlarm

820807e4 82065a18 nt!NtAccessCheckByTypeResultList

820807e8 8224a9db nt!NtAccessCheckByTypeResultListAndAuditAlarm

820807ec 8224aa24 nt!NtAccessCheckByTypeResultListAndAuditAlarmByHandle

820807f0 822892af nt!NtAddAtom

lkd> dq nt!KiServiceTable

fffff800'01a73b00 02f6f000'04106900 031a0105'fff72d00

NtReadFile в Ntdll.dll.

lkd> ln poi(KiServiceTable + 102 * 4)

(82193023) nt!NtReadFile

На 64-разрядной Windows каждое смещение может быть сопоставлено с каждой функцией с помощью команды ln, путем смещения вправо на 4 разряда (используемых согласно ранее данному описанию) и добавления оставшегося значения к базе самой таблицы KiServiceTable, как показано в следующем примере:

lkd> ln @@c++(((int*)@@(nt!KiServiceTable))[3] >> 4) + nt!KiServiceTable

(fffff800'01d9cb10) nt!NtReadFile | (fffff800'01d9d24c) nt!NtOpenFile

Exact matches:

nt!NtReadFile = <no type information>

Просмотр проявления активности системной службы.

Проявление активности системной службы можно отследить, наблюдая за счетчиком производительности, показывающим количество системных вызовов в секунду — "Системных вызовов/с" (System Calls/Sec) в объекте "Система" (System).

Запустите "Системный монитор" (Performance Monitor), щелкните на пункте "Системный монитор" (Performance Monitor) в разделе "Средства наблюдения" (Monitoring Tools) и щелкните на кнопке "Добавить" (Add), чтобы добавить счетчик к графику. Выберите объект "Система" (System), выберите счетчик "Системных вызовов/с" (System Calls/Sec), а затем щелкните на кнопке "Добавить" (Add) для добавления счетчика к графику.

Exit mobile version