Experimentos com interface COM oculta e mecanismo LxBus IPC em WSL. Fortemente inspirado no projeto lxss do guru do kernel Alex Ionescu . Este projeto é apenas um conceito, não um programa totalmente desenvolvido e deve ser usado para fins de teste.
Clone este repositório. Abra o arquivo de solução (.sln) ou projeto (.vcxproj) no Visual Studio e crie-o. Como alternativa, execute o prompt de comando do desenvolvedor do Visual Studio, vá para a pasta clonada e execute o comando msbuild
. Este projeto também pode ser construído com o conjunto de ferramentas mingw-w64. Abra o terminal na pasta clonada e execute o comando make
. Os binários estarão na pasta /bin
.
Baixe o binário na página Release, nenhuma etapa de instalação é necessária. Este projeto mostra apenas os métodos COM ocultos que podem mudar em versões futuras do Windows. A tabela COM, usada neste projeto, está de acordo com o Windows 10 20H1 Insider Preview mais recente , que é a versão 18917 e superior. Aqui estão as opções do 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.
A maioria das definições está nos arquivos de cabeçalho LxBus.h
e WinInternal.h
. O layout do projeto dos arquivos de origem:
comum:
front-end:
back-end:
arquivos_linux:
wslcli:
Para usar o LxBus, importe o arquivo de registro LxCoreFlags. Em seguida, reinicie o PC. Compile o LxBusClient.c com make
em WSL. Execute WslRevese com a opção -b
ou --bus
como administrador e LxBusClient como usuário root no WSL. Esses dois binários trocam algumas mensagens entre WSL e Windows usando LxBus via. Driver LxCore. Aqui estão alguns deles:
Passo nº. | Servidor LxBus (como Administrador) | Cliente LxBus (como root) |
---|---|---|
1 | Registar servidor LxBus, aguardar cliente | Abra o dispositivo lxss, conecte-se ao servidor |
2 | Ler mensagem do cliente LxBus | Escrever mensagem no servidor LxBus |
3 | Escrever mensagem para cliente LxBus | Ler mensagem do servidor LxBus |
4 | Tubo Marshal W-end, lido no tubo R-end | Desempacotar tubo W-end, escrever mensagem |
5 | Tubo Marshal R-end, escreva para tubo W-end | Desempacotar tubo R-end, ler mensagem |
6 | Desempacotar descritores de arquivo de E/S padrão | Descritores de arquivo de E/S padrão Marshal |
7 | Desempacotar e obter PID do lado do cliente | PID atual do Marshal |
8 | Mensagem do console Marshal | Mensagem do console de desempacotamento |
9 | Crie um servidor LxBus sem nome | Continua ... |
10 | Ficha de garfo do marechal | Token de garfo desempacotado |
Para uma explicação detalhada, veja a apresentação de Alex Ionescu @34min no BlackHat USA 2016. Há muitas coisas que podem ser feitas com o mecanismo LxBus IPC. Que coisa interessante você quer fazer com o LxBus? ?
Isso funciona com WSL1 apenas porque o LxCore não envolve diretamente com WSL2. Primeiro importe o arquivo de registro LxCoreFlags. Em seguida, habilite a depuração do modo kernel local com esses dois comandos como administrador e reinicie o PC.
bcdedit /debug on
bcdedit /dbgsettings local
Isso habilita alguns sinalizadores de registro DWORD. Nos bastidores, o LxCore verifica principalmente se PrintSysLevel
e PrintLogLevel
são zero e se TraceLastSyscall
está presente. Para a mesma máquina host, use DebugView como administrador ou use KD para VM.
Execute qualquer distribuição WSL1 e veja os logs e todos os syscalls e dmesg. As funções por trás desse formato de log são assim:
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);
Nome do provedor | GUID do provedor | Nome do arquivo |
---|---|---|
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 |
Este projeto usa algumas definições e tipos de dados a seguir. Obrigado a:
WslReverse está licenciado sob a Licença Pública Geral GNU v3. Uma cópia completa da licença é fornecida em LICENSE.
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/>.