Windows内核--子系统(3.5)

article/2025/10/5 16:41:54

到底什么是子系统?

        子系统是用户层概念。在Windows内核之上,如果想要执行类UNIX应用程序,就是POSIX子系统,如果要类似OS/2环境,就是OS/2子系统。

        如何能模拟出不同子系统呢? 一般需要子系统用户态应用程序和相关DLL支援。

        对于Windows子系统,作为亲儿子,其他子系统是依赖它才能活。

        Windows子系统既有内核模式,又有用户模式。

        内核模式包括图形和窗口管理部分,以win32k.sys存在,主要负责收集和分发消息,控制窗口显示和屏幕输出,同时处理不同形状绘制和文本输出。

        用户模式包括子系统进程(csrss.exe)和系统DLL(kernel32.dll, user32.dll, gdi32.dll...).

        刚刚提到子系统是用户层概念,为什么Windows子系统又有内核模式? Windows为了提高图形处理效率,把本应该放在用户模式的图形部分移到内核模式,才有了这个结果。

Windows NT三大子系统

        OS/2、POSIX和Windows子系统

        OS/2子系统

                核心文件: os2.exe/os2srv.exe/os2ss.exe.

                OS/2是IBM可与DOS/Windows早期版本竞争的操作系统,因为商业模式、技术和市场有错失,最终败在Windows脚下。

        POSIX子系统

                核心文件: psxss.exe/psxdll.dll.

                在Windows 7不是默认开启,作为系统功能可开关。

                从Windows 8.1开始, POSIX子系统被移除。

Windows 10 WSL

        Windows Subsystem For Linux, 准确的说不算是上面提到的NT子系统。但因为名称上带有subsystem, 很容易与之混淆。

可执行程序和子系统对应关系

        PE文件头部有个subsystem, 它表明应用程序在哪个子系统运行。

        MS VC链接器提供选项/SUBSYSTEM指定最终可执行文件的subsystem数值。

        dumpbin工具可以看到subsystem.

子系统进程csrss.exe

        csrss全称: Client/Server Runtime Server Subsystem. 主要负责控制台窗口功能,以及创建、删除进程和线程等。每个进程在csrss进程中都有一个CSR_PROCESS结构, csrss可以由此控制Windows各个进程。

子系统内核部分win32k.sys

        任何线程,只要调用win32k.sys的任何一个系统服务,就会变成GUI线程,最终会被纳入Windows子系统管理范畴。win32k负责用户层图形操作的内部处理, 比如Eng接口。

        文本输出 win32k API: EngTextOut

ntdll.dll属于子系统DLL吗?

        不属于。它是各子系统DLL共用的基础DLL.

ntdll.dll

        它是连接用户模式和内核服务的桥梁。ntdll基本与系统服务对应,保留系统服务stub.

        比如NtCreateProcess, NtCreateFile等。

ntdll!NtCreateFile和nt!NtCreateFile

        二者分别属于用户模式和内核模式API, 前面最终会调用到后面, 后面是实作。

ntdll!NtCreateFile和ntdll!ZwCreateFile

        二者是等同的。如下,ZwCreateFile其实就是NtCreateFile.

1: kd> u ntdll!ZwCreateFile
ntdll!NtCreateFile:
00007ff9`0776d7b0 4c8bd1          mov     r10,rcx
00007ff9`0776d7b3 b855000000      mov     eax,55h
00007ff9`0776d7b8 f604250803fe7f01 test    byte ptr [SharedUserData+0x308 (00000000`7ffe0308)],1
00007ff9`0776d7c0 7503            jne     ntdll!NtCreateFile+0x15 (00007ff9`0776d7c5)
00007ff9`0776d7c2 0f05            syscall
00007ff9`0776d7c4 c3              ret
00007ff9`0776d7c5 cd2e            int     2Eh
00007ff9`0776d7c7 c3              ret
1: kd> u ntdll!NtCreateFile
ntdll!NtCreateFile:
00007ff9`0776d7b0 4c8bd1          mov     r10,rcx
00007ff9`0776d7b3 b855000000      mov     eax,55h
00007ff9`0776d7b8 f604250803fe7f01 test    byte ptr [SharedUserData+0x308 (00000000`7ffe0308)],1
00007ff9`0776d7c0 7503            jne     ntdll!NtCreateFile+0x15 (00007ff9`0776d7c5)
00007ff9`0776d7c2 0f05            syscall
00007ff9`0776d7c4 c3              ret
00007ff9`0776d7c5 cd2e            int     2Eh
00007ff9`0776d7c7 c3              ret

        IDA看到二者是不同导出Index, 同一个API.

        

ntdll大部分存根API实现都类似

        用户模式下,Nt*和Zw*代表同一个程式,不过在内核中它们有差异。Windows的设计,是Nt*主要为了用户模式调用, 内核Nt*实作用户模式Nt*, 而Zw*在内核模式主要为了内核本身或驱动程序使用,不希望从用户模式调进来。

        


http://chatgpt.dhexx.cn/article/qpKy4wId.shtml

相关文章

无法正常进入Windows也能开启Windows内核调试

1 背景 Windows的启动的早期阶段,大致分为3步:bootmgr,winload,nt内核加载。 下图是Winload阶段的一个报错。 如果出现Windowslogo,一般就是进入nt内核加载了。 我们经常开的调试功能是nt内核加载后的调试。无法调试…

windows内核开发学习笔记二十四:windows内核架构

从上图上可以看出,windows内核主要层次划分为三个层次,以及windows子系统、文件系统、网络、设备驱动程序等几个部分。 硬件抽象层(Hardware Abstraction Layer,简称HAL):主要是把所有与硬件相关联的代码隔…

Windows内核--内核空间和用户空间(3.6)

内核喜欢抽象出句柄给用户空间 句柄, Handle, 表达处理、控制之意。内核不会直接暴露指针给用户空间,这样会增大内核风险。相反,内核抽象出Handle给用户态,不管是文件、进程、线程等对象,通过Handle可以隐藏内核细节,统…

Windows内核基础之权限级别

权限级别是CPU中的一个概念,CPU中包含4个权限级别,分别是0环,1环,2环,3环,CPU设计制造商最初希望0环用于运行内核,1环和2环运行设备驱动,3环运行应用程序,但是系统设计者…

Windows内核--调试内核源代码(1.5)

Kernel编译和普通应用程序编译有差异吗? 最终Kernel二进制档是给CPU执行的,只要用普通的C编译器能正常编译出给CPU执行的二进制程序即可,从编译角度,内核和应用程序无差别。Windows内核是exe文件。 内核与用户应用程序运行环境有…

Windows内核驱动Hook入门

文章目录 Hook框架选择基于微软规范的框架微软规范以外的框架简单介绍一下InfinityHook 获取内核中的函数地址内核中导出的函数内核未导出的函数获取 SSDT ShadowSSDT 地址获取系统服务号手动获取获取并判断系统版本 代码自动获取 获取GUI相关的函数地址,还需附加GU…

Windows内核编程(二)-第一个内核程序

第一个内核程序 通过 Visual Studio新建工程 注意事项: 大部分widnows驱动程序都是内核驱动(Kernel Driver),所以本笔记不分"驱动程序"与"内核编程",也不区分"内核模块"(Kernel Module)、“驱动程序”(Drive…

Windows内核原理与实现之Windows研究内核(WRK)

Windows并非一个开放源码的操作系统,但正如上一章所提,Microsoft开放了一份以Windows XP x64和Windows Server 2003 SP1为基础的内核源代码,它可以编译和运行,作为教育科研机构的教学实践和研究的平台使用,称为WRK&…

Windows内核结构

Windows内核结构 第一篇博客,随便写下练练手:) Windows内核总共分为三层: 与硬件直接打交道的这一层叫做硬件抽象层简称HAL,这一层的用意就是把所有与硬件相关联的代码逻辑隔离到一个专门的模块中,从而做到尽可能的独立于硬件平…

WINDOWS内核对象及其理解

一.前言 Windows中有很多像进程对象、线程对象、文件对象等等这样的对象,我们称之为Windows内核对象。内核对象是系统地址空间中的一个内存块,由系统创建并维护,这个内存对象是一个数据结构,维护着与对象相关的信息&a…

windows内核——基石

友链 内存布局 用户内存空间和内核内存空间之间的gap是为了避免不经意的越界而导致安全问题 CPU的初始化 系统启动期间,会对所有的处理器进行初始化操作 大部分初始化操作我们都不必了解,因为你了不了解都不影响你的逆向,毕竟你又不是开发…

Windows内核原理与实现--Windows基本结构概述

一、Windows系统结构概述 1、Windows采用双模式来保护操作系统本身,内核模式和用户模式。在Windows中,用户代码和内核代码有各自的运行环境,而且它们可以访问的内存空间也并不相同。在x86中,内核代码可以访问当前进程的4GB虚拟地址空间,而用户代码只能访问底端2GB虚拟地址…

《Windows内核原理与实现笔记》(一)Windows系统结构和基本概念

Windows内核结构 上图是windows内核的组成结构 如图Windows内核分三层,与硬件直接打交道的是硬件抽象层HAL,这一层把所有与硬件相关代码逻辑隔离到一个专门模块中,从而是上层尽可能独立于硬件平台。HAL是一个独立动态链接库,wind…

windows内核基础

windows分层模型 硬件抽象层屏蔽了硬件实现功能的细节。 IRP为内核层重要的数据结构。 物理地址和虚拟地址 x64的cpu仅仅支持64位地址中的前48位。其中若虚拟地址为内核,则前16位为ffff;若虚拟地址为用户模式,则前16位为0000。用户能看到的…

WebService的工作原理

WebService的工作原理如下: 服务提供者WebService2和WebService3通过UDDI协议将服务注册WebService目录中服务消费者WebService1通过UDDI协议从WebService目录中查询服务,并获得服务的WSDL服务描述文件服务消费者WebService1通过WSDL语言远程调用WebSer…

WebService原理

1、WebService实际上就是两个应用程序之间的远程调用,而且这种调用是跨语言的。 2、应用程序调用WebService的接口,实际上就是解析XML语言。也就是说两个应用程序之间的交流实际上就是通过XML来交流的。 3、WebService内部的实现是基于HTTP协议的&…

Web Service 的工作原理

Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。…

JavaScript高级程序设计(第三版)pdf版 下载

分享关于JavaScript高级程序设计(第3版)[美] Nicholas C.Zakas著 李松峰 曹力 译 一书供大家学习!!! 链接: https://pan.baidu.com/s/1RD4EXuQnTqH3kUfHWFaOYw 提取码: vias 复制这段内容后打开百度网盘手机App&#…

JS高级程序设计(14)

DOM 文档对象模型(DOM)是HTML和XML文档的编程借口。DOM表示由多层节点构成的文档,通过它开发者可以添加、删除和修改页面的各个部分。 文章目录 DOM一、节点层级1.Node类型2.Document类型3.Element类型4.Text类型5.Comment属性6.CDATASectio…

javascript高级程序设计(红宝书)记录

故心故心故心故心小故冲啊 文章目录 第3章.语法基础第4章.变量作用域与内存第5章.基本引用类型第6章.集合引用类型第8章.对象、类与面向对象编程第10章.函数第11章.期约与异步函数第12章.BOM第17章事件第24章.网络请求与远程资源第25章.客户端存储 第3章.语法基础 undefined 值…