在 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 IPC 机制可以完成很多事情。你想用 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/>.