Windows系统机制之对象管理器

根据wrk1.2源码,结合毛批&潘老师的《Windows内核原理与实现》&《Windows Internals》对Windows内核的设计进行归纳。

Windows系统机制之对象管理器

设计的几个目的:

  • 提供一种公共统一的机制来使用系统资源
  • 将对象保护隔离到OS中的一个地方,从而确保统一的一致的对象访问策略
  • 提供一种机制来管理进程对对象的使用
  • 支持各种OS环境需求,比如一个进程能够从父进程继承资源
  • 建立统一的规则来维护对象的保持力
  • 提供为特定的会话隔离对象的能力,以便在命名空间中允许局部和全局对象并存

Windows内部对象分三种:

  • 执行体对象(进程管理器、内存管理器、I/O子系统)
  • 内核对象(最基本的对象,用户模式不可见,执行体内部使用)
  • GDI/User对象(Windows子系统对象,不与内核打交道)

执行体对象

耳熟能详的执行体对象:

类型 描述
Process 执行一组线程对象所必需的虚拟地址空间和控制信息
Thread 进程内部的一个可执行实体
Job 一组进程,通过作业机制,可以像单个实体那样来管理多个进程
Section 共享内存的一个区域(文件映射对象)
File 一个已打开的文件或I/O设备的实例
Token 一个进程或线程的安全轮廓(安全ID、用户权限等)
Event 具有持久状态(有信号或无信号)的对象,用于同步或通知
Semaphore 信号量是计数器,提供资源门控能力
Mutex 互斥量,用于顺序访问一个资源的一种同步机制
Timer 定时机制
IoCompletion I/O完成端口
Key 引用注册表数据的机制
Directory 对象管理器命名空间中的虚拟目录
TpWorkerFactory 执行一组特定任务的线程集合,线程池。
TmRm、TmTx、TmTm、TmEn 内核事务管理器KTM为各种事务登记而使用的对象
WindowStation 包含一个剪贴板、一组全局原子和一组桌面对象
Desktop 包含在窗口站内部的对象。
PowerRequest 关联一个线程,通过SetThreadExecutionState调用请求指定的电源改变。
EtwConsumer 代表一个已连接的ETW实时消费者已经通过StartTrace API进行了注册
EtwRegistration 代表一个注册对象,与某个用户模式或内核模式ETW提供者关联

后面的这些对象不知道都是些什么鬼。

对象结构

header+body。

对象管理器控制了对象头,执行体组件控制了它们创建的对象体。对象头有一个索引,指向一个类型对象,该对象包含的信息对每个实例都是公共的。

知识点:对象可选子头的条件、位置、用途

通用的对象服务:

服务 用途
关闭 关闭指向某个对象的句柄
复制 复制句柄,再将它交给另一个进程的方法来共享对象
使永久/临时 改变对象的保持力
查询对象 获得关于对象的标准属性信息
查询安全性 获取对象安全描述符
设置安全性 改变对象的保护设置
等待一个对象 用一个对象来同步线程的执行
给一个对象发信号,并等待另一个对象 给一个对象发信号,通过另一个对象来同步线程执行
等待多个对象 多个对象来同步线程执行

类型对象

每个对象有它的类型,由头中指针决定,指针指向一张表,表内是所有类型。每种类型由对应的各类操作方法,内核漏洞利用的手法中经常可以看到把该指针指向0x0或者修改类型对象方法的指针等。

对象方法 调用时机
Open 对象句柄被打开
Close 对象句柄被关闭
Delete 对象管理器删除对象前
Query name 线程请求在一个从属命名空间中查询一个对象的名称时
Parse 对象管理器在一个从属命名空间中搜索一个对象名称时
Dump 未用
Okay to close 对象管理器接到指令要关闭句柄时
Security 进程读取或改变一个对象在其从属命名空间中的保护属性时

对象句柄和进程句柄表

对象句柄是个索引值,最终通过句柄表的结构找到对应表项。EPROCESS有一个指向进程句柄表的域。第一个句柄索引为4,第二个是8。

句柄表是一个动态三层结构,类似虚拟地址到物理地址转译的三级结构。

具体跟WRK代码吧,代码已经写得非常清楚了。

知识点:

  • 保留对象:提前分配备用,用于容错,如KAPC。
  • 对象名称:用于方便查找资源(对资源命名),也方便对象管理器查找对象,还可以满足进程之间共享对象(执行体对象名称是全局的)。
  • 对象目录:如\ArcNames, \BaseNamedObjects, \Device, \Driver等,这种目录型结构就开辟了一片私有命名空间,从而解决对象名冲突问题。
  • 符号链接:设备驱动的老朋友了,用于快捷索引设备名称、共享,比如C: 、COM1这类符号名称链到的设备本身都很复杂,在\Global??目录下。
文章目录
  1. 1. Windows系统机制之对象管理器
    1. 1.1. 执行体对象
      1. 1.1.1. 对象结构
,