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
ヘッダー ファイルにあります。ソース ファイルのプロジェクト レイアウト:
一般:
フロントエンド:
バックエンド:
Linux_ファイル:
wslcli:
LxBus を使用するには、LxCoreFlags レジストリ ファイルをインポートします。その後、PC を再起動します。 WSL でmake
を使用して LxBusClient.c をコンパイルします。 WSL の管理者として-b
または--bus
オプションを使用して WslRevese を実行し、root ユーザーとして LxBusClient を実行します。これら 2 つのバイナリは、LxBus 経由で WSL と Windows 側の間でいくつかのメッセージを交換します。 LxCoreドライバー。その一部を次に示します。
ステップNo. | LxBus サーバー (管理者として) | LxBus クライアント (root として) |
---|---|---|
1 | LxBus サーバーを登録し、クライアントを待ちます | lxss デバイスを開き、サーバーに接続します |
2 | LxBus クライアントからのメッセージを読み取る | LxBus サーバーにメッセージを書き込む |
3 | LxBus クライアントにメッセージを書き込む | LxBus サーバーからメッセージを読み取る |
4 | マーシャル W エンド パイプ、R エンド パイプから読み取る | W エンド パイプをアンマーシャルし、メッセージを書き込みます |
5 | R エンド パイプをマーシャルし、W エンド パイプに書き込みます | R エンド パイプをアンマーシャルし、メッセージを読み取ります |
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 レジストリ ファイルをインポートします。次に、管理者としてこれら 2 つのコマンドを使用してローカル カーネル モード デバッグを有効にし、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.Manager | {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/>.