Eksperimen dengan antarmuka COM tersembunyi dan mekanisme LxBus IPC di WSL. Sangat terinspirasi oleh proyek guru kernel Alex Ionescu lxss . Proyek ini hanyalah sebuah konsep, bukan program yang dikembangkan sepenuhnya dan harus digunakan untuk tujuan pengujian.
Kloning repositori ini. Buka file solusi (.sln) atau proyek (.vcxproj) di Visual Studio dan buatlah. Alternatifnya, jalankan command prompt pengembang Visual Studio, buka folder kloning dan jalankan perintah msbuild
. Proyek ini juga dapat dibangun dengan toolchain mingw-w64. Buka terminal di folder kloning dan jalankan perintah make
. Biner akan berada di folder /bin
.
Unduh biner dari halaman Rilis, tidak diperlukan langkah instalasi. Proyek ini hanya menampilkan metode COM tersembunyi yang mungkin berubah di versi Windows mendatang. Tabel COM yang digunakan dalam proyek ini sesuai dengan Pratinjau Orang Dalam Windows 10 20H1 terbaru , yaitu versi 18917 ke atas. Berikut adalah opsi 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.
Sebagian besar definisi ada dalam file header LxBus.h
dan WinInternal.h
. Tata letak proyek file sumber:
umum:
bagian depan:
bagian belakang:
linux_files:
wslcli:
Untuk menggunakan LxBus, impor file registri LxCoreFlags. Kemudian reboot PC. Kompilasi LxBusClient.c dengan make
di WSL. Jalankan WslRevese dengan opsi -b
atau --bus
sebagai administrator dan LxBusClient sebagai pengguna root di WSL. Kedua biner tersebut bertukar beberapa pesan antara WSL dan sisi Windows menggunakan LxBus melalui. Sopir LxCore. Berikut beberapa di antaranya:
Langkah No. | LxBus Server (sebagai Administrator) | Klien LxBus (sebagai root) |
---|---|---|
1 | Daftarkan server LxBus, tunggu klien | Buka perangkat lxss, sambungkan ke server |
2 | Baca pesan dari klien LxBus | Tulis pesan ke server LxBus |
3 | Tulis pesan ke klien LxBus | Baca pesan dari server LxBus |
4 | Pipa ujung W Marshal, dibaca dari pipa ujung R | Buka pipa ujung W marshal, tulis pesan |
5 | Pipa ujung R Marshal, tulis ke pipa ujung W | Unmarshal pipa R-end, baca pesan |
6 | Deskriptor file I/O standar yang tidak dapat diubah | Deskriptor file I/O standar Marshal |
7 | Hapus marshal dan dapatkan PID dari sisi klien | Marsekal PID saat ini |
8 | Pesan konsol marshal | Pesan konsol unmarshal |
9 | Buat server LxBus yang tidak disebutkan namanya | Untuk dilanjutkan... |
10 | Token garpu marshal | Token garpu unmarshal |
Penjelasan lebih detail lihat presentasi Alex Ionescu @34min di BlackHat USA 2016. Banyak hal yang bisa dilakukan dengan mekanisme LxBus IPC. Hal menarik apa yang ingin Anda lakukan dengan LxBus? ?
Ini berfungsi dengan WSL1 hanya karena LxCore tidak terlibat langsung dengan WSL2. Impor terlebih dahulu file registri LxCoreFlags. Kemudian aktifkan debugging mode kernel lokal dengan dua perintah ini sebagai administrator dan reboot PC.
bcdedit /debug on
bcdedit /dbgsettings local
Ini mengaktifkan beberapa tanda registri DWORD. Di balik layar, LxCore terutama memeriksa apakah PrintSysLevel
dan PrintLogLevel
sama-sama nol dan TraceLastSyscall
ada. Untuk mesin host yang sama, gunakan DebugView sebagai administrator atau gunakan KD untuk VM.
Jalankan distribusi WSL1 apa pun dan lihat log serta setiap syscall dan dmesg. Fungsi di balik format log ini adalah seperti ini:
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);
Nama Penyedia | GUID Penyedia | Nama File |
---|---|---|
Microsoft.Windows.Lxss.Manager | {B99CDB5A-039C-5046-E672-1A0DE0A40211} | LxssManager.dll |
Microsoft.Windows.Lxss.Detak Jantung | {0451AB4F-F74D-4008-B491-EB2E5F5D8B89} | LxssManager.dll |
Microsoft.Windows.Subsistem.LxCore | {0CD1C309-0878-4515-83DB-749843B3F5C9} | LxCore.sys |
Microsoft.Windows.Subsistem.Lxss | {D90B9468-67F0-5B3B-42CC-82AC81FFD960} | Wsl.exe |
Proyek ini menggunakan beberapa definisi dan tipe data dari berikut ini. Berkat:
WslReverse dilisensikan di bawah GNU General Public License v3. Salinan lengkap lisensi disediakan di LISENSI.
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/>.