Форум программистов, компьютерный форум, киберфорум
_lunar_
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

Разбираемся в новом API KLoader. Часть 1: Общие сведения

Запись от _lunar_ размещена 25.05.2022 в 00:56
Показов 2734 Комментарии 0
Метки c, c++, winapi

Во-первых, сразу уточню, что новый API доступен только в Windows 11. В более старых версиях ОС не ищите, его там нет.

Уже и не помню каким образом я наткнулся на ветку реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\KLoader
но результат запроса на открытие меня немного удивил
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 475
Размер:	84.2 Кб
ID:	7549
Отказано в доступе с учётом того, что Реестр по умолчанию открывается с правами администратора с соответствующим запросом UAC.

"Не на того напал" - подумал я и повысил права на Реестр до системного процесса через KernelExplorer
Нажмите на изображение для увеличения
Название: 2.jpg
Просмотров: 312
Размер:	49.5 Кб
ID:	7550

Посмотрев кому разрешён туда доступ снова был немного удивлён
Нажмите на изображение для увеличения
Название: 3.jpg
Просмотров: 394
Размер:	141.0 Кб
ID:	7551
Только TrustedInstaller имеет полный доступ к этой ветке Реестра, и даже СИСТЕМА ограничена на ReadOnly
Нажмите на изображение для увеличения
Название: 4.jpg
Просмотров: 357
Размер:	129.8 Кб
ID:	7552

Стало интересно что это за Kernel_Loader такой (KLoader видимо расшифровывается именно так).
В каталоге {9C0B898D-6275-48EC-81B4-E5EDBE44B535} есть только один строковый ключ с именем сервиса - ExecutionContext.
Находим этот сервис в KernelExplorer и смотрим что это такое
Нажмите на изображение для увеличения
Название: 5.jpg
Просмотров: 424
Размер:	110.4 Кб
ID:	7553

Информации немного: данный сервис лишь только взводит одноимённый драйвер ExecutionContext.sys
Примечательно, что драйвер не запускается вместе с системой (SERVICE_NEVER_STARTED), и никаких триггеров запуска тоже нет.
Есть только его SID S-1-5-80-3864825158-175547187-713465520-1238131867-1407735089

Идём дальше.
Берём драйвер ExecutionContext.sys и скармливаем его дизассемблеру IDA.
Переходим на точку входа DriverEntry и видимо вот такую красоту
Нажмите на изображение для увеличения
Название: 6.jpg
Просмотров: 389
Размер:	61.6 Кб
ID:	7554
Интерес здесь вызывают две функции - internal (внутренняя) функция WppLoadTracingSupport и импортируемая из драйвера ndis.sys KLoaderRegisterModule
Внутри WppLoadTracingSupport вызывается очень интересная процедура ядра ОС MmGetSystemRoutineAddress
Эту процедуру может экспортировать только ядро или HAL (в старых версиях Windows 10, когда HAL ещё не переехал в ядро).
Суть этой функции очень проста - она возвращает указатель на функции внутри ntoskrnl.exe (как GetProcAddress в юзермоде)
C++
1
2
3
4
5
6
7
8
9
10
11
UNICODE_STRING DestinationString;
DEVICE_OBJECT WPP_MAIN_CB;
 
RtlInitUnicodeString(&DestinationString, L"PsGetVersion");
WPP_MAIN_CB.Queue.Wcb.DeviceRoutine = (PDRIVER_CONTROL)MmGetSystemRoutineAddress(&DestinationString);
 
RtlInitUnicodeString(&DestinationString, L"WmiTraceMessage");
WPP_MAIN_CB.Queue.Wcb.DeviceObject = MmGetSystemRoutineAddress(&DestinationString);
 
RtlInitUnicodeString(&DestinationString, L"WmiQueryTraceInformation");
WPP_MAIN_CB.Queue.Wcb.CurrentIrp = MmGetSystemRoutineAddress(&DestinationString);
Но вернёмся к нашим "баранам".
Теперь есть понимание, что API KLoader находится в драйвере ndis.sys
Открываем его в дизассемблере IDA и видим, что программный интерфейс включает в себя три экспортируемые internal функции
Нажмите на изображение для увеличения
Название: 7.jpg
Просмотров: 377
Размер:	47.7 Кб
ID:	7555

и одну не экспортируемую
Нажмите на изображение для увеличения
Название: 8.jpg
Просмотров: 273
Размер:	121.1 Кб
ID:	7604

Я составил их прототипы
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
DECLARE_HANDLE(KLOADER_MODULE_REFERENCE);
typedef KLOADER_MODULE_REFERENCE* PKLOADER_MODULE_REFERENCE;
 
 
typedef struct _KLOADER_MODULE_CHARACTERISTICS {
 
} KLOADER_MODULE_CHARACTERISTICS, * PKLOADER_MODULE_CHARACTERISTICS;
 
 
typedef struct _KLOADER_REFERENCE_MODULE_CONFIG {
 
} KLOADER_REFERENCE_MODULE_CONFIG, * PKLOADER_REFERENCE_MODULE_CONFIG;
 
 
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
NTSTATUS
FASTCALL
KLoaderRegisterModule(
    _In_ PDRIVER_OBJECT pDriverObject,
    _In_ PUNICODE_STRING pRegistryPath,
    _In_opt_ PVOID arg3,
    _In_ PKLOADER_MODULE_CHARACTERISTICS pKModuleCharacts);
 
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
NTSTATUS
FASTCALL
KLoaderReferenceModule(
    _In_ PKLOADER_REFERENCE_MODULE_CONFIG pKModuleConfig,
    _Out_ PKLOADER_MODULE_REFERENCE* ppKModule);
 
_IRQL_requires_max_(PASSIVE_LEVEL)
NTKERNELAPI
NTSTATUS
FASTCALL
KLoaderDereferenceModule(
    _In_ PKLOADER_MODULE_REFERENCE pKModule);
 
 
NTSTATUS
FASTCALL
KLoaderQueryDispatchTable(
    __int64 a1,
    __int64 a2,
    __int64 a3);
Что находится в структурах KLOADER_MODULE_CHARACTERISTICS и KLOADER_REFERENCE_MODULE_CONFIG пока сказать не могу.
API KLoader появился в Windows 11 (возможно даже только в свежих сборках) и никакой информации в интернете нет.
Символы тоже картины не проясняют ни в IDA, ни в WinDbg.

Относительно лёгкое понимание есть по двум функциям:
KLoaderReferenceModule - на вход подаётся сконфигурированная информация, а на выходе инициализируется дескриптор.
KLoaderDereferenceModule - здесь всё просто: процедура KLoaderDereferenceModule уменьшает количество ссылок объекта на единицу.

KLoaderRegisterModule - функция оперирует объектом драйвера и некоторыми атрибутами.

KLoaderQueryDispatchTable - это внутренняя процедура, которая получает доступ к таблице guid'ов.
В классе ExecutionContextLibrary инициализируется KLoaderReferenceModule через GUID
C
1
2
3
4
5
 __int128 EXECUTION_CONTEXT_MODULE_ID; // = 35B544BE-EDE5-B481-48EC-62759C0B898D
 
result = KLoaderReferenceModule(
    (struct _KLOADER_REFERENCE_MODULE_CONFIG *)&v8,
    (struct KLOADER_MODULE_REFERENCE__ **)this + 14);
если результат отрицательный, инициализация происходит через таблицу guid'ов
C
1
2
3
4
5
6
7
8
__int64 EXECUTION_CONTEXT_DISPATCH_TABLE_ID; // = 25h
 
if (!result)
{
    v4 = *((_QWORD *)this + 14);
    v7 = 0;
    result = KLoaderQueryDispatchTable(v4, v3, (__int64)&v7);
}
Надеюсь Вам было интересно немного окунуться в ядерные глубины Windows 11
То, что я описал очень поверхностно и многое требует так называемого deep internal исследования, которое будет в следующей части.

Разбираемся в новом API KLoader. Часть 2: Deep Internal Research
Метки c, c++, winapi
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru