WSL의 숨겨진 COM 인터페이스와 LxBus IPC 메커니즘을 실험합니다. 커널 전문가 Alex Ionescu의 프로젝트 lxss 에서 많은 영감을 받았습니다. 이 프로젝트는 완전히 개발된 프로그램이 아닌 개념일 뿐이므로 테스트 목적으로 사용해야 합니다.
이 저장소를 복제하세요. Visual Studio에서 솔루션(.sln) 또는 프로젝트(.vcxproj) 파일을 열고 빌드합니다. 또는 Visual Studio 개발자 명령 프롬프트를 실행하고 복제된 폴더로 이동하여 msbuild
명령을 실행합니다. 이 프로젝트는 mingw-w64 툴체인을 사용하여 빌드할 수도 있습니다. 복제된 폴더에서 터미널을 열고 make
명령을 실행합니다. 바이너리는 /bin
폴더에 있습니다.
릴리스 페이지에서 바이너리를 다운로드하세요. 설치 단계가 필요하지 않습니다. 이 프로젝트는 향후 Windows 버전에서 변경될 수 있는 숨겨진 COM 메서드만 표시합니다. 이 프로젝트에 사용된 COM vtable은 최신 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
헤더 파일에 있습니다. 소스 파일의 프로젝트 레이아웃:
흔한:
프런트엔드:
백엔드:
리눅스_파일:
wslcli:
LxBus를 사용하려면 LxCoreFlags 레지스트리 파일을 가져옵니다. 그런 다음 PC를 재부팅하십시오. WSL에서 make
사용하여 LxBusClient.c를 컴파일합니다. WSL에서 관리자로 -b
또는 --bus
옵션을 사용하고 LxBusClient를 루트 사용자로 사용하여 WslRevese를 실행합니다. 이 두 바이너리는 LxBus를 통해 WSL과 Windows 측 간에 일부 메시지를 교환합니다. LxCore 드라이버. 그 중 일부는 다음과 같습니다.
단계 번호 | LxBus 서버(관리자 권한) | LxBus 클라이언트(루트로) |
---|---|---|
1 | LxBus 서버를 등록하고 클라이언트를 기다립니다. | lxss 장치를 열고 서버에 연결 |
2 | LxBus 클라이언트에서 메시지 읽기 | LxBus 서버에 메시지 쓰기 |
3 | LxBus 클라이언트에 메시지 쓰기 | LxBus 서버에서 메시지 읽기 |
4 | W 끝 파이프 마샬링, R 끝 파이프에서 읽음 | W-end 파이프 비정렬화, 메시지 쓰기 |
5 | R 엔드 파이프 마샬링, W 엔드 파이프에 쓰기 | R-end 파이프 비정렬화, 메시지 읽기 |
6 | 표준 I/O 파일 디스크립터 비정렬화 | 표준 I/O 파일 디스크립터 마샬링 |
7 | 비정렬화하고 클라이언트 측에서 PID 가져오기 | 마샬링 전류 PID |
8 | 마샬 콘솔 메시지 | 비정렬 콘솔 메시지 |
9 | 이름 없는 LxBus 서버 생성 | 계속하려면 ... |
10 | 마샬 포크 토큰 | 비마샬 포크 토큰 |
자세한 설명은 BlackHat USA 2016에서 Alex Ionescu의 @34min 프레젠테이션을 참조하세요. LxBus IPC 메커니즘으로 수행할 수 있는 작업은 많습니다. LxBus로 어떤 흥미로운 일을 하고 싶나요? ?
LxCore는 WSL2와 직접 관련되지 않기 때문에 이는 WSL1 에서만 작동합니다. 먼저 LxCoreFlags 레지스트리 파일을 가져옵니다. 그런 다음 관리자 권한으로 이 두 명령을 사용하여 로컬 커널 모드 디버깅을 활성화하고 PC를 재부팅하십시오.
bcdedit /debug on
bcdedit /dbgsettings local
이렇게 하면 일부 DWORD 레지스트리 플래그가 활성화됩니다. 뒤에서 LxCore는 주로 PrintSysLevel
과 PrintLogLevel
이 모두 0이고 TraceLastSyscall
이 있는지 확인합니다. 동일한 호스트 시스템의 경우 관리자로 DebugView를 사용하거나 VM용 KD를 사용하십시오.
WSL1 배포를 실행하고 로그와 모든 syscall 및 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.관리자 | {B99CDB5A-039C-5046-E672-1A0DE0A40211} | LxssManager.dll |
Microsoft.Windows.Lxss.하트비트 | {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에 따라 라이센스가 부여됩니다. 라이센스의 전체 사본은 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/>.