Expériences avec l'interface COM cachée et le mécanisme LxBus IPC dans WSL. Fortement inspiré par le projet lxss du gourou du noyau Alex Ionescu . Ce projet n'est qu'un concept, pas un programme entièrement développé et doit être utilisé à des fins de test.
Clonez ce référentiel. Ouvrez le fichier de solution (.sln) ou de projet (.vcxproj) dans Visual Studio et générez-le. Vous pouvez également exécuter l’invite de commande du développeur Visual Studio, accéder au dossier cloné et exécuter la commande msbuild
. Ce projet peut également être construit avec la chaîne d'outils mingw-w64. Ouvrez le terminal dans le dossier cloné et exécutez la commande make
. Les binaires seront dans le dossier /bin
.
Téléchargez le binaire à partir de la page Release, aucune étape d'installation n'est requise. Ce projet affiche uniquement les méthodes COM cachées qui pourraient changer dans la future version de Windows. La table virtuelle COM, utilisée dans ce projet, est conforme à la dernière version de Windows 10 20H1 Insider Preview , c'est-à-dire la version 18917 et supérieure. Voici les options 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 plupart des définitions se trouvent dans les fichiers d'en-tête LxBus.h
et WinInternal.h
. La disposition du projet des fichiers sources :
commun:
l'extrémité avant:
back-end :
fichiers_linux :
wslcli :
Pour utiliser LxBus, importez le fichier de registre LxCoreFlags. Puis redémarrez le PC. Compilez le LxBusClient.c avec make
en WSL. Exécutez WslRevese avec l'option -b
ou --bus
en tant qu'administrateur et LxBusClient en tant qu'utilisateur root dans WSL. Ces deux binaires échangent des messages entre WSL et Windows en utilisant LxBus via. Pilote LxCore. En voici quelques-uns :
Étape n° | Serveur LxBus (en tant qu'administrateur) | Client LxBus (en tant que root) |
---|---|---|
1 | Enregistrez le serveur LxBus, attendez le client | Ouvrez l'appareil lxss, connectez-vous au serveur |
2 | Lire le message du client LxBus | Écrire un message sur le serveur LxBus |
3 | Écrire un message au client LxBus | Lire le message du serveur LxBus |
4 | Tuyau Marshal W-end, lu à partir du tuyau R-end | Démarrez le tuyau à l'extrémité W, écrivez un message |
5 | Tuyau Marshal R-end, écrivez dans le tuyau W-end | Démarrez le tuyau R-end, lisez le message |
6 | Décomposer les descripteurs de fichiers d'E/S standard | Descripteurs de fichiers d'E/S standard Marshal |
7 | Démarrer et obtenir le PID du côté client | Maréchal PID actuel |
8 | Message de la console Marshal | Message de la console Annuler le marshal |
9 | Créer un serveur LxBus sans nom | À suivre ... |
10 | Jeton de fourchette de maréchal | Jeton de fourchette de démaréchal |
Pour une explication détaillée, voir la présentation d'Alex Ionescu @34min au BlackHat USA 2016. De nombreuses choses peuvent être faites avec le mécanisme LxBus IPC. Quelle chose intéressante souhaitez-vous faire avec LxBus ? ?
Cela fonctionne avec WSL1 uniquement car LxCore n'implique pas directement WSL2. Importez d’abord le fichier de registre LxCoreFlags. Activez ensuite le débogage en mode noyau local avec ces deux commandes en tant qu'administrateur et redémarrez le PC.
bcdedit /debug on
bcdedit /dbgsettings local
Cela active certains indicateurs de registre DWORD. En arrière-plan, LxCore vérifie principalement si PrintSysLevel
et PrintLogLevel
sont tous deux nuls et si TraceLastSyscall
est présent. Pour la même machine hôte, utilisez DebugView en tant qu'administrateur ou utilisez KD pour VM.
Exécutez n'importe quelle distribution WSL1 et consultez les journaux ainsi que tous les appels système et dmesg. Les fonctions derrière ce format de journaux sont les suivantes :
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);
Nom du fournisseur | GUID du fournisseur | Nom de fichier |
---|---|---|
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 |
Ce projet utilise certaines définitions et types de données suivants. Grâce à:
WslReverse est sous licence GNU General Public License v3. Une copie complète de la licence est fournie dans LICENCE.
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/>.