在 WSL 中進行隱藏 COM 介面和 LxBus IPC 機制的實驗。深受核心大師Alex Ionescu 的專案 lxss 的啟發。該專案只是一個概念,不是一個完全開發的程序,應該用於測試目的。
克隆這個儲存庫。在 Visual Studio 中開啟解決方案 (.sln) 或專案 (.vcxproj) 檔案並產生它。或者,執行 Visual Studio 開發人員命令提示符,請前往複製的資料夾並執行msbuild
命令。該專案也可以使用 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_檔:
wslcli:
若要使用 LxBus,請匯入 LxCoreFlags 登錄檔。然後重新啟動電腦。在 WSL 中使用make
編譯 LxBusClient.c。在 WSL 中以管理員身分使用-b
或--bus
選項執行 WslRevese,並以 root 使用者身分執行 LxBusClient。這兩個二進位檔案使用 LxBus via 在 WSL 和 Windows 端之間交換一些訊息。 LxCore 驅動程式。以下是其中一些:
步驟號 | LxBus 伺服器(作為管理員) | LxBus 用戶端(作為 root) |
---|---|---|
1 | 註冊LxBus伺服器,等待客戶端 | 開啟lxss設備,連接伺服器 |
2 | 從 LxBus 用戶端讀取訊息 | 將訊息寫入 LxBus 伺服器 |
3 | 將訊息寫入 LxBus 用戶端 | 從 LxBus 伺服器讀取訊息 |
4 | Marshal W 端管道,從 R 端管道讀取 | 解組 W 端管道,寫入訊息 |
5 | Marshal R 端管道,寫入 W 端管道 | 解組 R 端管道,讀取訊息 |
6 | 解組標準 I/O 檔案描述符 | 編組標準 I/O 檔案描述符 |
7 | 從客戶端解組並取得 PID | 元帥電流PID |
8 | Marshal 控制台訊息 | 解組控制台訊息 |
9 | 建立未命名的 LxBus 伺服器 | 待續 ... |
10 | Marshal 分叉代幣 | 解組分叉令牌 |
有關詳細說明,請參閱 Alex Ionescu 在 BlackHat USA 2016 上@34min 的演示。你想用 LxBus 做什麼有趣的事? ?
這僅適用於 WSL1 ,因為 LxCore 不直接涉及 WSL2。首先匯入LxCoreFlags註冊表檔案。然後以管理員身份使用這兩個命令啟用本地核心模式調試並重新啟動 PC。
bcdedit /debug on
bcdedit /dbgsettings local
這會啟用一些 DWORD 註冊表標誌。在幕後,LxCore主要檢查PrintSysLevel
和PrintLogLevel
是否都為零以及TraceLastSyscall
是否存在。對於同一台主機,以管理員身分使用 DebugView 或對 VM 使用 KD。
執行任何 WSL1 發行版並查看日誌以及每個系統呼叫和 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.Manager | {B99CDB5A-039C-5046-E672-1A0DE0A40211} | LxssManager.dll |
Microsoft.Windows.Lxss.Heartbeat | {0451AB4F-F74D-4008-B491-EB2E5F5D8B89} | LxssManager.dll |
Microsoft.Windows.子系統.LxCore | {0CD1C309-0878-4515-83DB-749843B3F5C9} | LXCore.sys |
Microsoft.Windows.子系統.Lxss | {D90B9468-67F0-5B3B-42CC-82AC81FFD960} | 執行程式 |
本項目使用以下一些定義和資料類型。由於:
WslReverse 根據 GNU 通用公共授權 v3 取得授權。許可證中提供了許可證的完整副本。
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/>.