阅读更多

0顶
1踩

操作系统

原创新闻 在调试器里看Windows 10的Linux子系统

2017-06-02 14:31 by 副主编 jihong10102006 评论(0) 有24865人浏览
引用
作者简介:张银奎,《软件调试》和《格蠹汇编》作者,爱写书与代码,以调试各类软件和分享调试技术为乐(微博@格友-张银奎)。
本文为CSDN首发原创文章,未经允许不得转载

Windows 10是微软第三代NT团队的力挽狂澜之作,大刀阔斧地改造革新,目标是重塑Windows(Reinvent Windows)!在众多新特征中,Linux环境子系统(WSL)无疑是最具开创性和最拉风的一个。

启用WSL

在2016年3月30日开幕的Build大会上,微软向广大开发者宣布Windows 10将支持Linux应用。在2016年4月7号推送的 Windows 10 build 14328 fast ring中首次包含了WSL。在Windows 10的周年更新(Anniversary Update)中包含了相对完整的Beta版本。

值得说明的是,不是所有的Windows 10系统都能运行WSL,要满足两个基本要求:64位和Build号不低于14393.0(笔者使用的两个版本分别是14393.1198和14393.479)。

在满足上述条件的Windows 10中,WSL也不是默认安装的,而是需要通过以下两个步骤来启用。

第一步是通过Settings -> Update and Security -> For developers打开开发者模式(参见图1)。

图1 打开开发者模式

第二步是通过“Turn Windows features on or off”打开WSL功能(图2)。

图2 打开WSL功能

点击图2所示的确定按钮后,Windows 10会安装WSL的组件,需要一点时间。安装完成后,要重启系统。重启后,在开始菜单区输入bash,如果看到图3所示的菜单项就代表WSL启用成功了。Bash是GNU旗下的命令处理器和外壳(shell)程序,包括Ubuntu在内的很多Linux发行版本和苹果macOS都使用它作为默认的控制台外壳和命令处理器。Windows 10中使用的就是Ubuntu版本的Bash。因此,WSL有时也被称为Bash on Ubuntu on Windows。


图3 Bash on Ubuntu on Windows

启用WSL成功代表着在Windows系统中搭建好了运行Linux应用的基本环境,这个环境就是所谓的Windows Subsystem for Linux(WSL)。环境子系统是NT内核固有的机制,目的是可以在一个NT内核运行不同类型的应用程序。在支持WSL之前,有三种子系统:Windows子系统、OS/2子系统和POSIX子系统。

每个子系统通常都有一个子系统服务进程和一个内核态驱动,对于Windows子系统,分别是著名的CSRSS.exe和Win32K.sys。对于WSL,它的组成主要有以下几个部分:
  • 以系统服务形式运行的子系统服务进程LxssManager。在服务管理器里,可以看到这个服务。服务的描述信息很详实,不妨引用一下:LXSS Manager服务支持运行本机ELF二进制文件。该服务提供在Windows上运行ELF二进制文件所需的基础结构。如果停止或禁用该服务,这些二进制文件将不再运行。LxssManager的核心代码是一个DLL,位于system32\lxss子目录下。它使用svchost.exe作为宿主运行。

  • 图4 WSL的子系统服务DLL
  • 运行在内核空间的Linux子系统驱动,有两个,一个文件名叫lxss.sys,另一个叫LxCore.sys,都位于system32\drivers目录中,图5是lxss驱动在注册表中的安装选项。

  • 图5 Linux子系统驱动的注册表表项
  • 用于与Windows环境接口的Bash启动(Bash Launcher)程序bash.exe,位于system32目录下,图3中的菜单项指向的就是这个程序。
  • 一个用于管理和维护WSL的工具程序,名为LxRun.exe。
安装Ubuntu

有了上面的基本运行环境就可以运行Linux应用程序了么?不是的,还需要安装Linux系统,包括系统程序、库文件和必要的工具程序。不过不用担心,微软已经和Canonical(Ubuntu背后的公司)合作准备好了一个特殊版本的Ubuntu,称为Ubuntu On Windows(以下简称UoW)。第一次启动Bash Launcher时,它就会提示安装UoW,如图6所示。

图6 安装Ubuntu On Windows

安装UoW后,便可以在当前用户的AppData\Local\lxss下看到Ubuntu的各个子目录和文件了,图7所示的便是根文件系统下的子目录和文件,可以看到很多熟悉的名字:tmp、boot、etc、home、sbin、bin、usr、var等。

图7 磁盘上的Ubuntu根目录

安装其它应用

UoW里已经包含了很多常用的命令和工具,包括著名的软件包管理工具apt-get。所以很容易在UoW里安装其它软件包,只要使用以下这些命令就可以了。
sudo apt-get update
sudo apt-get install packagename
sudo apt-get remove packagename
sudo apt-cache search word

对老雷来说,最想安装的当然就是GDB,这只要执行sudo apt-get install gdb就可以了,安装过程如图8所示。

图8 安装GDB

观察Linux实例的创建过程

做好以上准备工作后,我们的下一个目标就是在调试器里理解WSL的工作原理。首先我们要观察的是在WSL中启动Linux实例的过程。

在内核调试会话中对nt!MmInitializeProcessAddressSpace设置断点,然后启动bash.exe,第一次命中后直接放行(bash.exe是普通的Windows进程,不感兴趣),第二次命中时,看到的是services.exe在创建svchost.exe,切换到bash.exe,观察其栈回溯,可以看到它正在构建用以与WSL服务进程通信的SvcComm对象(图9)。此对象的构造函数内部会调用CoCreateInstance创建由WSL服务进程实现的进程外COM对象。这会触发创建COM对象的宿主进程,即svchost.exe。

图9 Bash Launcher进程在与WSL服务进程建立通信

图10是来自WSL团队官方博客的WSL组件协作图,左侧的bash.exe和Linux会话管理服务之间的黑色箭头代表它们之间是通过COM技术交互的。

图10 WSL组件协作图

恢复目标执行后,断点很快又命中,栈回溯如图11所示。

图11 创建Linux实例

从栈帧12-17可以看出,这次命中断点的正是WSL服务进程,它在通过I/O控制(I/O Control)方式与内核空间的LxCore通信。栈帧9-b中的Adss代表的是Android subsystem,是微软放弃了的Astoria项目(用于在Windows上运行Android应用程序)留下的痕迹。

根据笔者的分析和图10、图11所示栈回溯是在创建Linux系统中的init进程。当init进程启动后,会创建真正的bash进程。图12显示了创建bash进程后的WSL有关进程列表。

图12 创建bash进程后的WSL有关进程列表

图12中一共有四个进程,第一个是bash launcher进程,从操作系统的角度看,它是典型的Windows程序。第二个进程是WSL的子系统服务进程,第三个是它发起创建的init进程,第四个是init进程创建的bash进程。通过ParentCid(父进程ID)字段,可以看到后三个进程有父子关系。图13是使用Process Explorer观察的结果。

图13 WSL的进程关系图

最小进程和Pico进程

要深入理解WSL,必须先了解最近几年里NT内核引入的两个新概念:最小进程和Pico进程。最小进程是Windows 8.1引入的,代表一个最小化的进程对象,它具有名字、令牌、保护级别等基本属性,但是进程空间是空的,没有PEB,也没有NTDLL,也没有句柄表。EPROCESS结构体中的Minimal为1代表该进程是最小进程。比如观察图12中的init进程,可以看到它是最小进程。
kd> dt _EPROCESS ffffce8d779b9780 -y Minimal
nt!_EPROCESS
   +0x6c4 Minimal : 0y1

除了WSL使用最小进程外,Windows 10中的内存压缩进程也是最小进程。

Pico进程是最小进程的一种,它的特点是有一个驱动程序与其关联,当这个进程内发生系统调用时,内核会把系统调用转给这个驱动,这个驱动被称为Pico Provider,这样的进程被称为Pico进程。图14是来自WSL官方博客的插图,用以说明NT系统中的三种进程。

图14 三种进程

Pico的意思是微小,常常出现在容器技术中。从容器技术的角度来看,可以把Pico进程看作一个沙盒。事实上,Pico进程便源于Stony Brook University、Cambridge和微软研究院联合开发的Drawbridge项目。在Channel9上可以找到一个名为Drawbridge: A New Form of Virtualization for Application Sandboxing的录像,介绍了Library OS的思想和Drawbridge项目实现的技术原型。

用于WSL的Pico进程空间中可以执行Linux的原生程序,当发生系统调用时,内核会将这些调用转发给与它关联的驱动(Pico Provider)。比如图15所示的栈回溯显示的便是NT内核将系统调用转发给LxCore的过程。

图15 转发系统调用

文章收尾之际再介绍一个调试小技巧。对于已经有20多年历史的NT内核来说,WSL绝对是新生事物,很多配套设施还不完善,比如在WinDBG中列进程时所有Pico进程的名字都显示为System Process(图12中下面两个),很不方便。如何知道它们的Linux进程名呢?是有办法的。在EPROCESS中有个名为PicoContext的字段(目前偏移0x708),指向的是一个记录Pico属性的结构体,它的详细定义没有公开,笔者通过反汇编了解到在它的偏移0x180处存放的便是进程的可执行文件路径。基于此,便可以使用如下命令来显示了:
kd> dU poi(poi(ffffce8d779b9780+708)+180)
ffffa782`0e43d960  "/init"
kd> dU poi(poi(ffffce8d78f31080+708)+180)
ffffa782`19840fa0  "/bin/bash"

如果有人问执行uname -a会返回什么,试一下便知道了。
gedu@DESKTOP-4NBEECU:/mnt/c/Windows/System32$ uname -a
Linux DESKTOP-4NBEECU 3.4.0+ #1 PREEMPT Thu Aug 1 17:06:05 CST 2013 x86_64 x86_64 x86_64 GNU/Linux


在LXCORE!LxpSyscall_NEWUNAME设个断点便可以跟踪这个结果的产生过程,有些来自字符串常量,有些是动态拼接的。预知其详,笔者强烈建议读者亲自动手试一下。

回望历史,微软一度对Linux充满恐惧和仇恨,想趁其未壮而屠之于襁褓。2002年9月,被称为视窗之父的微软高管Jim Allchin在与很多列客户交流和调查后,写了封很长的邮件给微软的另一些高管,其中有这样一段:
引用
My conclusion: We are net on a path to win against Linux We must change some things and we must do it immediately. The current white papers, etc. are too high level and they are not going to cut it, Here are specific actions that I have concluded that we must take.

接下来详细部署了一系列任务……

但事实上,Linux一天天壮大了。那只好成为盟友吧,一起拥抱新的时代,一起干杯(背后也可能骂娘)!

无论如何,一个新的时代开始了,二进制的Linux程序可以以原生形式直接运行在NT内核之上,这是件多么激动人心的事啊。它具有划时代的意义,开一代先河。它在封闭的视窗系统上打开一扇门,代表自由开发的小企鹅走了进去,有了新的乐园。它会激发很多想象,很多创新,当然也可能有很多邪念(你懂的,我在说病毒、勒索和安全)……
  • 大小: 39.3 KB
  • 大小: 23.3 KB
  • 大小: 19 KB
  • 大小: 13 KB
  • 大小: 29.4 KB
  • 大小: 37.9 KB
  • 大小: 9.4 KB
  • 大小: 94.3 KB
  • 大小: 13.7 KB
  • 大小: 293.6 KB
  • 大小: 20.6 KB
  • 大小: 9.2 KB
  • 大小: 5.7 KB
  • 大小: 103.5 KB
  • 大小: 6.3 KB
0
1
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 在调试器里看Windows10的Linux子系统

    在众多新特征中,Linux环境子系统(WSL)无疑是最具开创性和最拉风的一个。在2016年3月30日开幕的Build大会上,微软向广大开发者宣布Windows10将支持Linux应用。在2016年4月7号推送的Windows10build14328fastring中...

  • 【Windows11系统】在win11里完美运行安卓子系统和Linux子系统

    本文写了博主在安装Linux子系统安卓子系统的安装教程和问题,比如出现Linux系统找不到文件系统,安卓应用安装不上怎么办等等

  • 【Windows 11】安装 Android子系统 和 Linux子系统

    Win11 安装 Android子系统 和 Linux子系统

  • WSL-manager:Windows Linux子系统(WSL)的非官方gui管理器

    WSL经理一种管理多个Linux子系统的简便方法现在,我的应用程序允许您删除或将WSL的所有已安装实例设置为默认值 它在通知区域中支持极其有用的图标,可让您在不打开应用程序的情况下设置默认分发 您需要做的就是下载...

  • Windows官方Linux子系统C/C++开发环境搭建

    关于利用 Windows 10 适用于 Linux 的 Windows 子系统 (WSL) 安装 Linux 在 Windows 平台直接运行而不依赖虚拟机并通过 Visual Studio Code 在 Windows 平台直接开发并调试Linux程序这件有趣的事情 1 前言 1.1 ...

  • Windows 10安装Linux子系统、可视化Linux、子系统中openfoam

    Windows 10安装Linux子系统、可视化Linux、子系统中openfoam

  • windows卸载linux系统,Windows和Linux双系统下完美卸载linux

    装了Windows和linux双系统的朋友,在后期要删除linux是个比较头痛的问题,因为MBR已经被linux接管,本文的目的是如何在windows 和linux双系统下,简单,完美地卸载linux。使用MbrFix.exe卸载Windows双系统Linux不用...

  • xshell连接Windows中通过wsl(Windows Subsystem for Linux)安装的linux子系统-Ubuntu 22.04

    xshell连接Windows中通过wsl安装的linux子系统-Ubuntu 22.04。

  • 2022CTF培训(三)windows&linux&安卓平台调试机制原理

    使用 CreateProcess 函数创建待调试进程,创建时指定 dwCreationFlags 参数为 DEBUG_ONLY_THIS_PROCESS 将会告诉操作系统我们需要让当前调用者(线程)接管所有子进程的调试事件,包括进程创建、进程退出、线程创建...

  • 利用 Windows 子系统 Linux(WSL)开发 Python 环境搭建

    利用 Windows 子系统 Linux(WSL)开发 Python一、启用适用于 Linux 的 Windows 子系统二、安装 Linux 分发版三、安装并配置 Visual Studio Code四、创建一个新项目五、安装 Python、pip 和 venv六、创建虚拟环境七...

  • 适用于Linux的Windows子系统的完整开发人员指南2

    This tutorial demonstrates how to install, manage, and use a full Linux environment on your Windows 10 PC with WSL2. You’ll be running a Linux kernel and executing native applications while ...

  • ida远程调试linux_使用IDA从Windows到Linux进行远程调试

    ida远程调试linuxSometimes it happens, in my case, in CTF challenge - the day when you received an ELF binary but your host machine is Windows and your IDA+license is already installed on your host....

  • windows 10 linux 子系统 WSL 调用Windows资源

    硬盘 windows下的盘符 挂载到了/mnt的路劲下...其中有提到在设备管理器中端口的端口号“COMx”对应在wsl中的“/dev/ttySx”,比如在设备管理器中的COM2口在wsl中就对应着“/dev/tty/S2”。 这样我在wsl中验证一下...

  • Win11彻底卸载WSL2系统(去除导航窗格Linux图标)

    本教程其实主要为了是去除导航窗格上面的Linux图标。主要原因是安装了Windows版的Docker,然后装了WSL2,安装完发现并不满足需求。就想着卸载,全部卸载完结果发现这个图标还在。作为强迫症来说,简直是噩耗。如下图...

  • Windows 10 安装安卓子系统 WSA(Magisk/KernelSU)使用 WSA 工具箱安装 APK

    1. 在 Microsoft Store 中安装 Ubuntu LTS。 2. 使用 MagiskOnWSALocal 打包 WSA。 3. 使用 WSAPatch 让 WSA 支持 Win10。 4. 使用 WSA 工具箱安装 APK。

  • 手把手教你在windows10下进行openFoam调试

    参考 :... 首先,跟着官网教程先下好openFoam:https://www.openfoam.com/download/openfoam-installation-on-windows-10 在这里首先你要下载好linux子系统,在微软

  • 学习一下windows系统的的目录结构,对比一下Linux系统的目录结构

    “/usr”目录下比较重要的部分有: /usr/X11R6 X-WINDOWS系统(version 11, release 6) /usr/X11 同/usr/X11R6 (/usr/X11R6的符号连接) /usr/X11R6/bin 大量的小X-WINDOWS应用程序(也可能是一些在其它子目录下大执行...

  • 利用Windows11安卓子系统对APP进行渗透测试

    这是继他们之前的版本之后,适用于 Linux或 WSL 的 Windows 子系统。这样我们可以在Windows11上原生运行Android子系统。这篇文章将向大家展示如何使用 WSA 进行 Android 移动应用程序渗透测试,这样我们就可以只使用...

  • 【java毕业设计】智慧社区教育服务门户.zip

    有java环境就可以运行起来 ,zip里包含源码+论文+PPT, 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上

Global site tag (gtag.js) - Google Analytics