我是靠谱客的博主 正直小蝴蝶,最近开发中收集的这篇文章主要介绍[Windows内核源码分析3] 引导过程(安全管理器初始化在Phase0部分的分析),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文章记录分析安全管理器在windows系统引导的阶段0中的初始化工作。主要是SeInitSystem函数。
进入后首先判定是引导过程的哪个阶段:
在这里插入图片描述
进入后内部调用的实际上是SepInitializationPhase0函数, 看一下这个函数的介绍, 主要进行了:

  1. 初始化LUID
  2. 初始化安全全局变量
  3. 初始化令牌对象
  4. 初始化启动进程/线程时必要的安全组件
    进入后执行了3个函数:
    第一个执行了ExLuidInitialization, 该函数没有源码, 从反汇编上来看其没有执行而是直接返回了TRUE。
    第二个执行了SepVariableInitialization 根据注释可以知道, 这个函数是用来初始化全局安全变量的
    在这里插入图片描述
    该函数首先计算不同类型SID即安全标识符所需要的内存大小,并从分页内存中分配空间
    在这里插入图片描述
    来看一下安全描述符结构体:
    在这里插入图片描述
    接下去初始化SID:
    在这里插入图片描述
    之后的代码还是执行了之前相同的操作,为更多的安全描述符分配分页内存然后初始化, 只不过这些安全描述符是NT下的, 代码太多我截取一部分:
    在这里插入图片描述
    调用SepInitSystemDacls来初始化系统的默认DACL和安全描述符。来查看一下windows中默认的ACL,一共分为5个级别:
    Public, PublicUnrestricted, Public Open, System以及Unrestricted。
    在这里插入图片描述
    分别为这5个分配空间并进行填充初始化ACL:
    在这里插入图片描述这里来解释一下ACL。在这之前先解释一下2个重要的概念就是:
    a. 访问令牌
    b. 安全描述符
    当用户登录时, 系统会对用户密码账号进行身份验证
    登录成功则系统会为用户创建一个访问令牌(ACCESS TOKEN)
    此用户执行的每个进程都具有此访问令牌的副本
    并且访问令牌内包含了安全描述符, 这个安全描述符标识了用户和用户所属的组
    这个令牌还包含了用户和用户组所持有的特权(Privileges)
    当用户创建一个新进程或者试图访问一个安全对象以及执行一些需要特权的系统管理员任务时, windows使用这个令牌来识别是否该用户具有该权限。
    来看一下安全描述符的结构体, 可以看到其中包含了用户和组的SID和ACL, ACL又被分成SACL和DACL
    在这里插入图片描述
    ACL的中文意思是访问控制列表,其分为DACL和SACL分别是自义定访问控制列表和系统访问控制列表。这两种都可以被称为是ACL。每一个ACL都由多条ACE即具体的访问控制权限组成。来看一个具体的例子:
    在这里插入图片描述
    这个例子中,有A和B两个线程都想访问一个对象, 对象含有DACL,其中包含了3条具体的规则, 即ACE。首先ACE1禁止Andrew以读写或执行访问该对象, 而线程A中的访问令牌中指示了Andrew的用户线程所以线程A无权访问该对象。ACE2运行组A的成员以写方式访问该对象, 所以线程B即Jane用户属于组A成功访问了该对象。ACE3规定了除了ACE1和ACE2规定的内容外其他所有都拥有对对象的读和执行的权限。
    完成ACL的创建和初始化后,就开始为ACL分配对应的ACE规则了:
    在这里插入图片描述
    其中RtlAddAccessAllowedAce最重要的过程如下, 利用传入的参数填充Ace后把ACE加入到ACL中。
    在这里插入图片描述
    来举一个具体的例子来解释, 如下图, 其
    在这里插入图片描述
    SeLocalSystemSid代表了要为哪个类型的SID添加权限。
    GENERIC_ALL代表给予什么权限, 这里是为了SeLocalSystemSid给予了所有权限。
    SePublicDefaultDacl代表即将添加ACE的ACL。
    完成创建ACL并为其添加ACE后, 就调用RtlCreateSecurityDescriptor创建了安全描述符, 接着调用了RtlSetDaclSecurityDescriptor设置了安全描述符的DACL
    在这里插入图片描述
    其中RtlSetDaclSecurityDescriptor中最重要的就是如下的代码:
    在这里插入图片描述
    接着初始化各种特权值:
    在这里插入图片描述
    初始化SeExports结构体, 该结构体是用来导出之前的信息出内核:
    在这里插入图片描述
    接着就回到了SeInitSystem函数中继续执行SepRmInitPhase0, 这个函数无需关注。后面执行了SepTokenInitialization
    在这里插入图片描述
    其调用了ObCreateObjectType创造了Token类型的对象
    在这里插入图片描述
    调用SepInitializeWorkList初始化一些自旋锁和链表头以及各类分发器对象, 后面又执行了一些初始化工作后便返回了。
    在这里插入图片描述
    (完)

最后

以上就是正直小蝴蝶为你收集整理的[Windows内核源码分析3] 引导过程(安全管理器初始化在Phase0部分的分析)的全部内容,希望文章能够帮你解决[Windows内核源码分析3] 引导过程(安全管理器初始化在Phase0部分的分析)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(82)

评论列表共有 0 条评论

立即
投稿
返回
顶部