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

Исследование сервиса "Обнаружение интерактивных служб" (UI0Detect) Часть 3: Эпилог

Запись от _lunar_ размещена 30.01.2021 в 13:33
Обновил(-а) _lunar_ 03.03.2021 в 10:59

Исследование сервиса "Обнаружение интерактивных служб" (UI0Detect) Часть 1: Windows Vista - Windows 7
Исследование сервиса "Обнаружение интерактивных служб" (UI0Detect) Часть 2: Windows 8 - Windows 10

В заключительной части много слов не будет. Я лишь скажу то, что мне всё таки удалось восстановить вырезанную Майкрософтом часть системы - сервис "Обнаружение интерактивных служб".
Очень долго я пытался заставить работать данный сервис на Windows 10 сборки 20H2 (2009), используя файлы UI0Detect.exe, WlS0WndH.dll и wininitext.dll от Windows 10 сборки 1709.
Делал разные хуки, инициализировал функции, просто подсовывал системе wininitext.dll, но wininit.exe на отрез отказывался запускать хукнутую PrimaryTerminalAndHookWorker с функцией RegisterSession0ViewerWindowHookDll.
При этом я знал, что платный инструмент ребят из FireDaemon прекрасно работает на сборке 1803 и последующих, в точности повторяя принцип работы дефолтового UI0Detect.
Поэтому, я решил написать свой сервис и попробовать его запустить.
Файлы FireDaemon дизассемблировать я не стал, т.к. они запакованы протом и тратить время на анпак я не собирался, да и ничего нового в части перехода в сессию 0 относительно UI0Detect я бы не увидел.
Тем более зачем мне это нужно, если я полностью дизассемблировал дефолтовый UI0Detect с имеющимися у Microsoft символами.

В итоге, после долгого тестирования и доработки сервиса мне удалось перейти в сессию 0 через стороннюю программу. Это была победа!
Далее появилась новая проблема - а как же теперь вернуться обратно в сессию 1?
Возврат я делал через меню ProcessHacker: сначала отключал сессию 1 Logoff (без этого перезагрузка из сессии 0 невозможна), затем перезагружал компьютер.
Такое положение вещей меня не устраивало. Я хотел быстрого перемещения из одной сессии в другую, как это делали дефолтовый UI0Detect и FireDaemon.
После долгих хождений по ядру ОС я всё же понял что необходимо для переключения в другую сессию.
С переходом получилось великолепно - одна команда и мы в сессии 0.
А с возвратом - дефолтовый UI0Detect запускается сразу в двух сессиях: основной поток в сессии 0 (как служба), и дочерний в сессии 1.
Я думаю это сделано для shared memory и глобальных данных, чтобы можно было видеть запросы в той и другой сессии и осуществлять переходы.
Ерундой этой я заниматься не стал и написал дополнительную программу для возврата в сессию 1.
В итоге, после перехода в сессию 0, вы увидите соответствующее уведомление (MessageBox), при нажатии на кнопку OK которого, будет осуществлен переход в сессию 1.

Теперь небольшая инструкция как осуществлять переход. Я не стал писать отдельное приложение, а просто включил данный функционал в свою программу.
Как мы помним из 2 части - Microsoft вырезала в Windows 10 поддержку устройств ввода\вывода в сессии 0 из драйвера win32kfull.sys.
Поэтому первое что нужно сделать - установить сторонний драйвер всё тех же FireDaemon (ребятам спасибо за дров, самому мне конечно же лень писать).

1. Драйвер нужно устанавливать всем пользователям Windows 10!
Для Windows Vista, Windows 7 и Windows 8\8.1 устанавливать его не обязательно, клава-мышь будет работать через дефолтовый win32kfull.sys в сессии 0.
Поэтому сразу после скачивания переходите в папку UI0Input и устанавливаете драйвер через FDUI0Input.inf (правой кнопкой мыши - Установить).
После установки драйвера обязательно перезагрузите компьютер.

2. Запустите ReqAdmin.exe
Для всех пользователей Windows 10 первое что нужно сделать - выполнить команду ui0 (Enter) (делается один раз - сервис будет запускаться вместе с системой в остановленном состоянии).
На сборках до 1709 включительно (у тех, кто имеет дефолтовый UI0Detect) эта команда внесёт соответствующие изменения в реестр (без них сервис не запустится).
На сборках 1803 и последующих эта команда полностью взведёт новый, написанный мною, сервис UI0Detect (разместит файл UI0Detect.exe в Windows\System32, внесёт изменения в реестр).
В результате на всех Windows (от Vista до 10), если вы выполните команду os (Enter) UI0Detect (Enter), должны увидеть следующее
Нажмите на изображение для увеличения
Название: 1.png
Просмотров: 102
Размер:	23.8 Кб
ID:	6758
Сервис будет находится в остановленном состоянии (SERVICE_STOPPED), и не иметь родительского процесса (PARENT_PROCESS_IS_NOT_RUNNING).

3. На всех Windows выполните команду ss (Enter) UI0Detect (Enter). Снова выполнив команду os (Enter) UI0Detect (Enter)
Нажмите на изображение для увеличения
Название: 2.png
Просмотров: 89
Размер:	26.0 Кб
ID:	6759
вы увидите, что сервис запущен (SERVICE_RUNNING) и имеет соответствующий ProcessId.

3.1. На Windows Vista, Windows 7, Windows 8\8.1, Windows 10 включительно до сборки 1709 после выполнения команды ss (Enter) UI0Detect (Enter) вы сразу увидите сообщение системы
Нажмите на изображение для увеличения
Название: 7.png
Просмотров: 84
Размер:	25.3 Кб
ID:	6770
Нажав на Просмотреть сообщение, вы сразу попадёте в сессию 0 (а вот пользователям Windows 10 сборки 1803 и последующих нужно сделать ещё немного).

4. Собственно всё готово к переходу в сессию 0. Но чтобы там не было совсем скучно, давайте запустим проводник Explorer++
Для этого выполните команду utl (Enter) 1 (Enter) 2 (Enter) 1 (Enter) 1 (Enter)
Нажмите на изображение для увеличения
Название: 3.png
Просмотров: 81
Размер:	22.5 Кб
ID:	6760
это запустит Explorer++ как системный процесс в сессии 0 на рабочем столе Default. Вы его не увидите до тех пор, пока не перейдёте в сессию 0.

5. Выполнив обязательное условие (на всех Windows сервис должен быть со статусом Выполняется (SERVICE_RUNNING)) можно сделать переход.
Для этого выполните команду sw (Enter) Default (Enter)
Нажмите на изображение для увеличения
Название: 4.png
Просмотров: 82
Размер:	14.6 Кб
ID:	6761

Я вас поздравляю, вы находитесь в окружении системы
Кликните здесь для просмотра всего текста
Название: 5.jpg
Просмотров: 253

Размер: 158.0 Кб


Там можно спокойно работать (этот блог я пишу из сессии 0), запускать программы, слушать музыку, серфить в интернете. И кстати браузер в сессии 0 открывается просто молниеносно, да и в целом там всё работает быстрее, т.к. нету целой физической оболочки пользовательского окружения, и все запросы отправляются прямиком в систему.
Единственно что не работает в сессии 0 - это графический драйвер (Microsoft об этом сразу заявляли). Так что запустить игру, или сделать интерфейс окон похожим на привычный пока что не получится.
А так, можно запустить какую-нибудь оболочку и превратить окружении сессии 0 в обычный рабочий стол (как это делается в linux системах).
А вот при попытке запуска дефолтового проводника Windows (explorer.exe), сначала произойдёт его первичная инициализация
Кликните здесь для просмотра всего текста
Название: 6.jpg
Просмотров: 264

Размер: 135.4 Кб

но через несколько секунд он "упадёт". Хотя при этом, в Windows 7 explorer.exe спокойно инициализируется и работает.

По мере обновления программы, буду прикреплять новые сборки, так что если кому интересно поглядывайте иногда)
Если возникнут какие-либо вопросы, пишите в комментариях.

Скачать программу вы можете ЗДЕСЬ
Размещено в Без категории
Показов 1169 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.