Experimentos con interfaz COM oculta y mecanismo LxBus IPC en WSL. Muy inspirado en el proyecto lxss del gurú del kernel Alex Ionescu . Este proyecto es sólo un concepto, no un programa completamente desarrollado y debe usarse con fines de prueba.
Clona este repositorio. Abra el archivo de solución (.sln) o proyecto (.vcxproj) en Visual Studio y compílelo. Alternativamente, ejecute el símbolo del sistema para desarrolladores de Visual Studio, vaya a la carpeta clonada y ejecute el comando msbuild
. Este proyecto también se puede construir con la cadena de herramientas mingw-w64. Abra la terminal en la carpeta clonada y ejecute el comando make
. Los archivos binarios estarán en la carpeta /bin
.
Descargue el binario desde la página de lanzamiento; no se requieren pasos de instalación. Este proyecto sólo muestra los métodos COM ocultos que pueden cambiar en futuras versiones de Windows. La tabla COM vtable, utilizada en este proyecto, se basa en la última versión Insider Preview de Windows 10 20H1 , es decir, la compilación 18917 y superior. Aquí están las opciones de 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.
La mayoría de las definiciones están en los archivos de encabezado LxBus.h
y WinInternal.h
. El diseño del proyecto de los archivos fuente:
común:
Interfaz:
back-end:
archivos_linux:
wslcli:
Para utilizar LxBus, importe el archivo de registro LxCoreFlags. Luego reinicie la PC. Compile LxBusClient.c con make
en WSL. Ejecute WslRevese con la opción -b
o --bus
como administrador y LxBusClient como usuario root en WSL. Esos dos binarios intercambian algunos mensajes entre WSL y Windows usando LxBus vía. Controlador LxCore. Éstos son algunos de ellos:
Paso No. | Servidor LxBus (como administrador) | Cliente LxBus (como root) |
---|---|---|
1 | Registre el servidor LxBus, espere al cliente | Abra el dispositivo lxss, conéctese al servidor |
2 | Leer mensaje del cliente LxBus | Escribir mensaje al servidor LxBus |
3 | Escribir mensaje al cliente LxBus | Leer mensaje del servidor LxBus |
4 | Tubo del extremo W Marshal, leído desde el tubo del extremo R | Unmarshal W-end pipe, escribir mensaje |
5 | Tubo del extremo R del Marshal, escribe en el tubo del extremo W | Unmarshal R-end pipe, leer mensaje |
6 | Descomponer descriptores de archivos de E/S estándar | Descriptores de archivos de E/S estándar de Marshal |
7 | Desarmar y obtener PID del lado del cliente | PID actual del mariscal |
8 | Mensaje de la consola Marshal | Mensaje de consola de desmarshal |
9 | Crear un servidor LxBus sin nombre | Continuará ... |
10 | Ficha de tenedor de mariscal | Ficha de horquilla Unmarshal |
Para obtener una explicación detallada, consulte la presentación de Alex Ionescu @34min en BlackHat USA 2016. Hay muchas cosas que se pueden hacer con el mecanismo LxBus IPC. ¿Qué cosa interesante quieres hacer con LxBus? ?
Esto funciona con WSL1 solo porque LxCore no involucra directamente con WSL2. Primero importe el archivo de registro LxCoreFlags. Luego habilite la depuración del modo kernel local con estos dos comandos como administrador y reinicie la PC.
bcdedit /debug on
bcdedit /dbgsettings local
Esto habilita algunos indicadores de registro DWORD. Detrás de escena, LxCore verifica principalmente si PrintSysLevel
y PrintLogLevel
son cero y TraceLastSyscall
está presente. Para la misma máquina host, use DebugView como administrador o use KD para VM.
Ejecute cualquier distribución WSL1 y vea los registros y todas las llamadas al sistema y dmesg. Las funciones detrás de este formato de registros son así:
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);
Nombre del proveedor | GUID del proveedor | Nombre del archivo |
---|---|---|
Microsoft.Windows.Lxss.Manager | {B99CDB5A-039C-5046-E672-1A0DE0A40211} | LxssManager.dll |
Microsoft.Windows.Lxss.Heartbeat | {0451AB4F-F74D-4008-B491-EB2E5F5D8B89} | LxssManager.dll |
Microsoft.Windows.Subsistema.LxCore | {0CD1C309-0878-4515-83DB-749843B3F5C9} | LxCore.sys |
Microsoft.Windows.Subsistema.Lxss | {D90B9468-67F0-5B3B-42CC-82AC81FFD960} | wsl.exe |
Este proyecto utiliza algunas definiciones y tipos de datos de los siguientes. Gracias a:
WslReverse tiene la licencia pública general GNU v3. Se proporciona una copia completa de la licencia en LICENCIA.
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/>.