Joe1sn's Cabinet

【win内核原理与实现】I. Windows系统结构

Windows系统结构还有引导过程

I.a 大致结构

windows内核是从windows NT内核发展过来的,从开始就和硬件的发展息息相关。

Windows采用双模式(dual mode)结构来保护操作系统内核不受应用程序的错误而出现崩溃

img

windows的原始设计是一个支持多环境子系统的os,它还支持POSIX和OS/2环境子系统.为他们提供仿真执行环境

I.b windows内核组成结构

内核组成结构.drawio

关于函数的开头

  • nt:内核提供的服务
  • Ldr:映像加载器函数
  • Csr:Windows子进程通讯函数
  • Dbg:调试函数
  • Etw:系统时间函数
  • Rtl:运行支持函数

执行体API函数接收的参数来自各种应用程序,通常会在程序的最开始处,对所接受的参数逐一探查他们的可访问性。

II. windows内核关键组件

HAL 硬件抽象层

HAL通常是一个独立的动态链接库,windows自身携带多种HAL,但是在系统安装的时候只会选择一种,改名为hal.dll。涉及中断控制器、单处理器/多处理器硬件断点。

内核(微内核)

在内核模块ntoskrnl.exe中的上层部分为执行体,下层最接近HAL的就是内核。负责进程调度、中断和异常处理,核心任务是尽可能让系统中的所有处理器变得高效。

windows内核使用抢占式调度,由于采用面向对象的设计,使得它主要面向两个对象:分发器控制 两个对象

  • 分发器对象:实现各种同步功能。影响线程调度,主要用于 事件(event) 突变体(mutant) 信号量(semaphore) 进程(process) 线程(thread) 队列(query) 门(gate) 定时器(timer)
  • 控制对象:用于控制内核的操作,不影响线程调度。包括 异步调用(APC) 延迟过程调用(DPC) 中断对象

执行体

在内核模块ntoskrnl.exe中的上层部分,包含5种类型的函数

  • 被导出的、可以在用户模式下调用的函数。位于 ntdll.dll 中。一般就是win API
  • 没有被导出、可以在用户模式下调用的函数。比如常见的反调试函数,包括各种LRC(Local Process Call,本地调用过程)、各种查询函数和专业函数。
  • 只能在内核模式下调用的导出函数。在windows DDK中有文档。
  • 执行体之间内部调用,未被文档化的函数
  • 一个组件的内置函数

其中组件包括

  • 进程和线程管理器:负责进程/线程的CURD
  • 内存管理:虚拟内存
  • 安全引用监视器(SRM):维护本地计算机的安全策略
  • I/O管理器
  • 缓存管理器:允许磁盘将文件映射到内存中
  • 配置管理器:负责注册表的实现
  • 即插即用管理器

还有的函数负责对执行体进行管理

  • 对象管理器:执行体对象的CURD
  • LPC设施:负责同一设备的的客户进程和服务进程的消息传递,对应的是远程过程调用(RPC)
  • 运行时库函数
  • 执行体支持例程:内存的分配、互锁内存的转换

设备驱动程序

驱动文件(.sys),漏洞挖掘存在于IOCTL

文件系统/存储管理

主要是ntfs.sys。漏洞挖掘存在于CLFS(通用日志文件系统)。

网络

windows套接字、winInet、NetBIOS、RPC

III. windows子系统

在上面的内核部分已经实现了对硬件的简单访问控制,那么就会在次基础上进行跟高层次的建设。

在PE文件的头部域Subssytem中指定了该程序会在那个子环境中运行。

子系统也分为用户模式和内核模式,核心部分是 win32k.sys。子系统的DLL链接到应用程序中,包括kernel32.dll user32.dll gdi32.dll advapi.dll,负责实现文档化的windows函数。

win32k.sys同时也负责向内核注入一系列出调函数(callout),一旦调用了win32k.sys的任何一个系统服务,这个程序就会变成一个GDI线程

核心功能可以分为:

  • 窗口管理

    由windows子进程csrss.exe负责控制台窗口功能

    1
    2
    3
    4
    子系统会话--->交互式窗口站--->默认桌面--->顶级窗户口列表->子窗口
    | |_>登录窗口
    | |_>屏幕保护窗口
    |->非交互式窗口-->不可见桌面
  • 图形设备接口(GDI)

    主要是图形支持,设计Direct3D等

IV. 安全性管理

三个核心组件:winlogonSRMlsass

winlogon 和 lsass 是两个用户模式进程, 而 SRM 是 Windows 执行体中的组件

image-20230601094755027

  • SRM(Security Reference Monitor安全引用监视器),负责执行对象的安全访问检查、管理用户特权、生成安 全审计消息,并且定义了访问令牌数据结构来表示一个安全环境。
  • Winlogon,负责响应 SAS(安全注意序列),以及管理交互式登录会话。当用户登 录到系统中时,winlogon 创建一个初始进程,并进一步由它创建外壳(shell)进程。
  • Lsass(Local Security Authentic SubSystem本地安全权威子系统),负责本地系统的安全策略,同时,它也认证用户的 身份,以及将安全审计消息发送到系统的事件日志中。
  • SAM(安全账户管理器)数据库,包含了本地用户和用户组,以及它们的口令和其 他属性。它位于注册表的 HKLM\SAM 下面。由于 HKLM\SAM 键只允许本地系统账 户访问,所以,除非用户在 Local System 账户下运行 regedit.exe 工具,否则无法访问 HKLM\SAM 子树。
  • LSA 策略数据库,包含了有关当前系统的一些信息,譬如谁允许访问系统以及如何 访问(交互式登录、网络登录或者以服务方式登录);分配给谁哪些特权;安全审计 如何进行等。如同 SAM 数据库一样,LSA 策略数据库也存储在注册表中,位于 HKLM\SECURITY 下面。同样地,除了 Local System 账户以外的其他账户均无法访 问 HKLM\SECURITY 子树。

winlogon 负责系统登录,包括对用户身份的认证;lsass 负责管理系统本地安全策略,并且将这些策略通知到内核中的 SRM。在内核 中,SRM 负责实现基于对象的访问控制以及系统全局安全策略的实施。

关于一些提权

在 Windows 中,特权是由 LUID 对象来标识的,LUID 代表一个本地唯一标识符(Locally Unique Identifier)

1
2
3
4
5
6
7
8
typedef struct _LUID_AND_ATTRIBUTES { 
LUID Luid;
ULONG Attributes;
} LUID_AND_ATTRIBUTES, * PLUID_AND_ATTRIBUTES;
#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
#define SE_PRIVILEGE_ENABLED (0x00000002L)
#define SE_PRIVILEGE_REMOVED (0X00000004L)
#define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)

image-20230601100327861

Windows 内核中定义了一组特权,即类型为 LUID 的 Se全局变量。Windows 内核中,与安全相关的函数以“Se”作为前缀,有一些安全函数还存在对应的系 统服务。这些系统服务函数的名称以“Nt”作为前缀,后面部分与“Se”函数相同。

V. Windows的引导过程

最开始也是从经典的MBR开始,然后是ntldr的osloader。

在osloader中将物理地址转为虚拟地址,该过程可见:windows_kernel_driver_2中对CR3、CR4寄存器的控制。

之后osloader加载NTDETECT.COM程序,利用系统BIOS查询系统基本设备,在引导过程的后期被存放到注册表 HKLM\HARDWARE\DESCRIPTION

os loader 加载内核模块映像文件,默认为 ntoskrnl.exe,以及 HAL 映像文件,默 认为 hal.dll。再加载注册表的 SYSTEM 储巢,即\WINDOWS\system32\config\system 文件。

image-20230601100916238

然后是内核的初始化,此入口函数为 KiSystemStartup

为了解决在初始化过程中的相互依赖 性问题,内核的初始化分两个阶段进行,称为阶段 0 和阶段 1。大多数内核组件的初始化函 数相应地带有一个整数参数,以指明一次调用是阶段 0 初始化还是阶段 1 初始化,而有些组 件的初始化函数通过检查一个全局变量 InitializationPhase 的值来判断当前处于哪个阶段。

阶段 0 初始化的目的是,将阶段 1 初始化所要用到的基 本数据结构建立起来。这时中断被禁止,调整IDT、TSS、PCR等。接着调用 KiInitializeKernel 函数,执行内核初始化。最后,当前线程蜕变成一个空闲线程。

image-20230601101312886

V. Windows发布历史

MicroSoft在操作系统领域中最开始起源于MS-DOS,随后演变出了两个分支,最开始的Win 95/98/Me,之后就是基于Windows NT的内核版本的Window XP/7/8/10/vista的版本。

版本 发布日期 主要特点 内核版本
Windows 1.0 1985年11月 初始版本,提供基本的图形用户界面和应用程序支持 1.0
Windows 2.0 1987年12月 引入了窗口重叠、图标和键盘快捷键等改进 2.0
Windows 3.0 1990年5月 支持多任务处理和TrueType字体,用户界面大幅改进 3.0
Windows 95 1995年8月 具有开始菜单、任务栏和32位应用程序支持的重要版本 4.0
Windows 98 1998年6月 引入了对USB设备和DVD光盘的支持,改进了系统稳定性 4.10
Windows 2000 2000年2月 强化了系统稳定性和安全性,提供了企业级特性 5.0
Windows XP 2001年10月 引入了全新的用户界面、系统恢复功能和多用户支持 5.1
Windows Vista 2007年1月 全新的用户界面、更高的安全性和系统稳定性 6.0
Windows 7 2009年10月 优化了用户界面和性能,改进了任务栏和窗口管理 6.1
Windows 8 2012年10月 引入了全新的开始屏幕和触摸优化的用户界面 6.2
Windows 10 2015年7月 统一了桌面和移动设备平台,引入了Windows应用商店 10.0
Windows 11 2021年10月 新的用户界面设计、改进的性能和安全性,支持Android应用 10.0