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

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

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

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

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

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

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

Стало интересно что это за Kernel_Loader такой (KLoader видимо расшифровывается именно так).
В каталоге {9C0B898D-6275-48EC-81B4-E5EDBE44B535} есть только один строковый ключ с именем сервиса - ExecutionContext.
Находим этот сервис в KernelExplorer и смотрим что это такое
Нажмите на изображение для увеличения
Название: 5.jpg
Просмотров: 466
Размер:	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
Просмотров: 425
Размер:	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
Просмотров: 432
Размер:	47.7 Кб
ID:	7555

и одну не экспортируемую
Нажмите на изображение для увеличения
Название: 8.jpg
Просмотров: 307
Размер:	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
Комментарии
 
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru