การทดลองกับอินเทอร์เฟซ COM ที่ซ่อนอยู่และกลไก LxBus IPC ใน WSL ได้รับแรงบันดาลใจอย่างมากจาก โปรเจ็กต์ lxss ของ Alex Ionescu โปรเจ็กต์นี้เป็นเพียงแนวคิด ไม่ใช่โปรแกรมที่พัฒนาอย่างสมบูรณ์ และควรใช้เพื่อการทดสอบ
โคลนที่เก็บนี้ เปิดไฟล์โซลูชัน (.sln) หรือโครงการ (.vcxproj) ใน Visual Studio และสร้างมันขึ้นมา หรือเรียกใช้พรอมต์คำสั่งนักพัฒนา Visual Studio ไปที่โฟลเดอร์ที่โคลนและเรียกใช้คำสั่ง msbuild
โปรเจ็กต์นี้สามารถสร้างด้วย toolchain mingw-w64 ได้ด้วย เปิดเทอร์มินัลในโฟลเดอร์โคลนและรันคำสั่ง make
ไบนารีจะอยู่ในโฟลเดอร์ /bin
ดาวน์โหลดไบนารี่จากหน้าวางจำหน่าย โดยไม่ต้องมีขั้นตอนการติดตั้ง โครงการนี้แสดงเฉพาะวิธีการ COM ที่ซ่อนอยู่ซึ่งอาจมีการเปลี่ยนแปลงใน Windows เวอร์ชันอนาคต 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
เค้าโครงโครงการของไฟล์ต้นฉบับ:
ทั่วไป:
ส่วนหน้า:
แบ็กเอนด์:
linux_files:
wslcli:
หากต้องการใช้ LxBus ให้นำเข้าไฟล์รีจิสทรี LxCoreFlags จากนั้นรีบูทพีซี คอมไพล์ LxBusClient.c ด้วย make
ใน WSL ดำเนินการ WslRevese ด้วยตัวเลือก -b
หรือ --bus
ในฐานะผู้ดูแลระบบและ LxBusClient ในฐานะผู้ใช้รูทใน WSL ไบนารีทั้งสองแลกเปลี่ยนข้อความระหว่าง WSL และ Windows โดยใช้ LxBus ผ่าน ไดรเวอร์ LxCore นี่คือบางส่วนของพวกเขา:
ขั้นตอนที่ # | LxBus Server (ในฐานะผู้ดูแลระบบ) | ไคลเอนต์ LxBus (ในฐานะรูท) |
---|---|---|
1 | ลงทะเบียนเซิร์ฟเวอร์ LxBus รอไคลเอ็นต์ | เปิดอุปกรณ์ lxss เชื่อมต่อกับเซิร์ฟเวอร์ |
2 | อ่านข้อความจากไคลเอนต์ LxBus | เขียนข้อความไปยังเซิร์ฟเวอร์ LxBus |
3 | เขียนข้อความถึงไคลเอนต์ LxBus | อ่านข้อความจากเซิร์ฟเวอร์ LxBus |
4 | ท่อ Marshal W-end อ่านจากท่อ R-end | Unmarshal W-end ไปป์ เขียนข้อความ |
5 | ท่อ Marshal R-end เขียนถึงท่อ W-end | Unmarshal ท่อ R-end อ่านข้อความ |
6 | Unmarshal ตัวอธิบายไฟล์ I/O มาตรฐาน | ตัวอธิบายไฟล์ I/O มาตรฐาน Marshal |
7 | Unmarshal และรับ PID จากฝั่งไคลเอ็นต์ | PID ปัจจุบันของจอมพล |
8 | ข้อความคอนโซลจอมพล | ข้อความคอนโซล Unmarshal |
9 | สร้างเซิร์ฟเวอร์ LxBus ที่ไม่มีชื่อ | ที่จะดำเนินต่อไป ... |
10 | โทเค็นส้อมจอมพล | โทเค็นการแยก Unmarshal |
สำหรับคำอธิบายโดยละเอียด โปรดดูการนำเสนอของ Alex Ionescu @34 นาทีที่ BlackHat USA 2016 มีหลายสิ่งที่สามารถทำได้ด้วยกลไก LxBus IPC สิ่งที่น่าสนใจที่คุณอยากทำกับ LxBus คืออะไร? -
ใช้งานได้กับ WSL1 เท่านั้น เนื่องจาก LxCore ไม่เกี่ยวข้อง โดยตรง กับ WSL2 ขั้นแรกให้นำเข้าไฟล์รีจิสทรี LxCoreFlags จากนั้นเปิดใช้งานการดีบักโหมดเคอร์เนลในเครื่องด้วยคำสั่งทั้งสองนี้ในฐานะผู้ดูแลระบบและรีบูตพีซี
bcdedit /debug on
bcdedit /dbgsettings local
ซึ่งเปิดใช้งานการตั้งค่าสถานะรีจิสทรี DWORD บางอย่าง เบื้องหลัง LxCore จะ ตรวจสอบว่า PrintSysLevel
และ PrintLogLevel
ทั้งคู่เป็นศูนย์เป็นหลักหรือไม่ และมี TraceLastSyscall
อยู่หรือไม่ สำหรับเครื่องโฮสต์เดียวกัน ให้ใช้ DebugView ในฐานะผู้ดูแลระบบ หรือใช้ KD สำหรับ VM
เรียกใช้การกระจาย WSL1 และดูบันทึกและทุก syscalls และ 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/>.