Эксперименты со скрытым COM-интерфейсом и механизмом LxBus IPC в WSL. Во многом вдохновлен проектом lxss гуру ядра Алекса Ионеску . Этот проект представляет собой всего лишь концепцию, а не полностью разработанную программу, и его следует использовать в целях тестирования.
Клонируйте этот репозиторий. Откройте файл решения (.sln) или проекта (.vcxproj) в Visual Studio и создайте его. Либо запустите командную строку разработчика Visual Studio, перейдите в клонированную папку и выполните команду msbuild
. Этот проект также можно создать с помощью набора инструментов mingw-w64. Откройте терминал в клонированной папке и выполните команду make
. Бинарные файлы будут находиться в папке /bin
.
Загрузите двоичный файл со страницы выпуска, никаких действий по установке не требуется. В этом проекте показаны только скрытые методы COM, которые могут измениться в будущих версиях Windows. Виртуальная таблица COM, используемая в этом проекте, соответствует последней версии Windows 10 20H1 Insider Preview , то есть сборки 18917 и выше. Вот параметры WslReverse:
Usage: WslReverse.exe [-] [option] [argument]
Options:
-b, --bus [Distro] Create own LxBus server (as administrator).
-d, --get-id [Distro] Get distribution ID.
-e, --export [Distro] [File Name]
Exports selected distribution to a tar file.
-G, --get-default Get default distribution ID.
-g, --get-config [Distro] Get distribution configuration.
-h, --help Show this help information.
-i, --install [Distro] [Install Folder] [File Name]
Install tar file as a new distribution.
-l, --list List all distributions with pending ones.
-r, --run [Distro] Run bash in provided distribution.
-S, --set-default [Distro] Set default distribution.
-s, --set-config [Distro] Set configuration for distribution.
-t, --terminate [Distro] Terminate running distribution.
-u, --uninstall [Distro] Uninstall distribution.
Большинство определений находится в заголовочных файлах LxBus.h
и WinInternal.h
. Расположение исходных файлов проекта:
общий:
внешний интерфейс:
бэкэнд:
linux_files:
вскли:
Чтобы использовать LxBus, импортируйте файл реестра LxCoreFlags. Затем перезагрузите ПК. Скомпилируйте LxBusClient.c с помощью make
в WSL. Выполните WslRevese с параметром -b
или --bus
от имени администратора и LxBusClient от имени пользователя root в WSL. Эти два двоичных файла обмениваются некоторыми сообщениями между WSL и Windows, используя LxBus. Драйвер LxCore. Вот некоторые из них:
Шаг №. | Сервер LxBus (как администратор) | Клиент LxBus (как root) |
---|---|---|
1 | Зарегистрируйте сервер LxBus, дождитесь клиента | Откройте устройство lxss, подключитесь к серверу |
2 | Прочитать сообщение от клиента LxBus | Написать сообщение на сервер LxBus |
3 | Написать сообщение клиенту LxBus | Прочитать сообщение с сервера LxBus |
4 | Труба Marshal с W-концом, считывание с R-конца трубы | Размонтировать W-концевую трубу, написать сообщение |
5 | Маршал R-концевой канал, запись в W-концевой канал | Отсоединить R-концевую трубу, прочитать сообщение |
6 | Демаршалирование стандартных файловых дескрипторов ввода-вывода | Стандартные файловые дескрипторы ввода-вывода Marshal |
7 | Демаршалирование и получение PID со стороны клиента | Маршал текущего PID |
8 | Сообщение консоли маршала | Демаршалировать консольное сообщение |
9 | Создать безымянный сервер LxBus | Продолжение следует ... |
10 | Жетон вилки Маршала | Демаршалирование токена вилки |
Подробное объяснение см. в презентации Алекса Ионеску @34min на BlackHat USA 2016. С помощью механизма LxBus IPC можно сделать множество вещей. Что интересного вы хотите сделать с LxBus? ?
Это работает с WSL1 только потому, что LxCore не взаимодействует напрямую с WSL2. Сначала импортируйте файл реестра LxCoreFlags. Затем включите отладку в режиме локального ядра с помощью этих двух команд от имени администратора и перезагрузите компьютер.
bcdedit /debug on
bcdedit /dbgsettings local
Это активирует некоторые флаги реестра DWORD. За сценой LxCore в основном проверяет, равны ли PrintSysLevel
и PrintLogLevel
нулю, и присутствует ли TraceLastSyscall
. Для того же хост-компьютера используйте DebugView от имени администратора или используйте KD для виртуальной машины.
Запустите любой дистрибутив WSL1 и просмотрите журналы, все системные вызовы и dmesg. Функции этого формата журналов следующие:
DbgPrintEx(0, 0, "LX: (%p, %p) %s", PEPROCESS, PKTHREAD, Syscall);
DbgPrintEx(0, 0, "LX: (%p, %p) /dev/kmsg: %Z", PEPROCESS, PKTHREAD, Version);
DbgPrintEx(0, 0, "LX: (%p, %p) /dev/log: %d: %Z: %Zn", PEPROCESS, PKTHREAD, x, y, z);
DbgPrintEx(0, 0, "LX: (%p, %p) (%Z) %sn", PEPROCESS, PKTHREAD, Command, LxCoreFunction);
Имя поставщика | GUID поставщика | Имя файла |
---|---|---|
Microsoft.Windows.Lxss.Manager | {B99CDB5A-039C-5046-E672-1A0DE0A40211} | LxssManager.dll |
Microsoft.Windows.Lxss.Heartbeat | {0451AB4F-F74D-4008-B491-EB2E5F5D8B89} | LxssManager.dll |
Microsoft.Windows.Subsystem.LxCore | {0CD1C309-0878-4515-83DB-749843B3F5C9} | LxCore.sys |
Microsoft.Windows.Subsystem.Lxss | {D90B9468-67F0-5B3B-42CC-82AC81FFD960} | WSL.exe |
В этом проекте используются некоторые определения и типы данных из следующих. Благодаря:
WslReverse распространяется по лицензии GNU General Public License v3. Полная копия лицензии представлена в разделе ЛИЦЕНЗИЯ.
WslReverse -- Experiments with COM interface and LxBus IPC mechanism in WSL.
Copyright (c) 2018-19 Biswapriyo Nath
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.