[Windows内核源码分析5] 引导过程(对象管理器初始化在Phase1部分的分析)

news/2024/5/14 17:58:33/文章来源:https://blog.csdn.net/qq_37232329/article/details/127268313

在第1阶段, ObInitSystem首先对每个处理器的PRCB结构的lookaside链表进行初始化。
在这里插入图片描述
在全局名字空间中创建根目录\
在这里插入图片描述
来看一下NtCreateDirectoryObject这个函数实际上是ObCreateObjectObInsertDirectory的封装。其内部执行的操作很简单,一个是创建一个目录对象, 接着将该目录对象插入到全局名字空间中。
在这里插入图片描述
而函数ObCreateObject之前分析过,内部主要调用ObpAllocateObject, 初始化一个对象头部。
在这里插入图片描述
接着就是ObInsertObject在当前进程中的句柄表中插入该目录的句柄,并获该句柄的值, 其内部主要的工作流程如下:
调用ObpLookupObjectName确认在全局名字空间中是否存在该名称的目录。
在这里插入图片描述
如果存在但是并非是我们需要定位的对象类型,就不能重复插入,确认具体的原因后返回。这里有3种
在这里插入图片描述
如果说我们都没有找到该对象,就直接进行收尾工作后返回
在这里插入图片描述
如果定位到了该对象, 并且是我们需要插入的对象类型,首先需要做一些安全方面的工作。
在这里插入图片描述
为该对象在进程中创建句柄表项,并获取该句柄。
在这里插入图片描述
接着做了一些释放工作后ObInsertObject返回,并获取对象句柄。

在这里插入图片描述
句柄获取后NtCreateDirectoryObject便返回了。所以其内部创建了对应类型的对象后,返回指代该对象的句柄。接着调用了ObReferenceObjectByHandle来通过句柄引用了这个对象, 获取指向该对象的指针。
成功创建了该对象后, 为其制定DACL并再其中加入了ACE规则。
在这里插入图片描述
可以清晰的看到安全描述符身份为World时DACL规定其拥有查询遍历和读取权限。安全描述符身份为Admin或者System权限时DACL规定其拥有所有权限。
在这里插入图片描述
接着用同样的套路创建了KernelObjectsObjectTypes目录
在这里插入图片描述
接着就把这几种新创建的目录类型插入全局名字空间里, 但要确保不能重复插入。调用ObpLookupDirectoryEntry检查全局名字空间中是否存在该目录,如果不存在就调用ObpInsertDirectoryEntry插入
在这里插入图片描述
最后调用了ObpCreateDosDevicesDirectory为驱动器盘符和Win32设备名创建了\DosDevices 目录对象
在这里插入图片描述
下面进入ObpCreateDosDevicesDirectory内看看里面到底做了什么:
为\DosDevices设定访问的DACL规则,即创建安全描述符。
在这里插入图片描述
创建全局\??目录对象
在这里插入图片描述
为刚刚的\??目录对象创建一个符号链接名, 即\??\GLOBALROOT
在这里插入图片描述
进入NtCreateSymbolicLinkObject内部查看一下是如何创建符号链接名的:
内部首先创建了符号链接名对象:
在这里插入图片描述
将目标对象的一些信息保存到符号链接对象的结构体内:
在这里插入图片描述
最后把符号链接对象插入到当前进程的句柄表内并获取代表该对象的句柄。这样就结束了。
在这里插入图片描述
用同样的方法创建了\??\Global符号链接, 在用户层如果想要访问这些内核对象只能通过这些符号链接来访问。
在这里插入图片描述
最后创建了\??\DosDevices符号链接对象
在这里插入图片描述
所以 ObpCreateDosDevicesDirectory 最终创建了一个\??目录对象并创建了3个指向它的符号链接。到这里对象管理器的阶段1初始化工作已经完成了。
(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_21938.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

y160.第九章 GitOps从入门到精通 -- Tekton Trigger(九)

8.Tekton Trigger 8.1 Tekton Trigger 基础 Tekton Triggers简介 监控特定的事件,并在满足条件时自动触发Tekton Pipeline; 例如,代码仓库上的创建pull request、push代码,以及合并pull request至main分支等Tekton Triggers为用户提供了一种声明式API 它允许用户按需定义监…

客户管理系统(SSM版):解除线索关联市场活动

一、客户需求: 用户在线索明细页面,点击某一个"解除关联"按钮,弹出确认解除的窗口; 用户点击"确定"按钮,完成解除线索关联市场活动的功能. *解除成功之后,刷新已经关联的市场活动列表 *解除失败,提示信息,列表也不刷新 二、功能实现 1.首…

openjdk源码准备编译和依赖

在Windows系统上进行openjdk的源码编译 一、准备编译需要的装备 1.首先下载一个软件Cygwin。这个软件是一个在Windows平台下模拟Linux运行环境的软件,提供了一系列的Linux的运行命令。(解释这些,有兴趣的自己百度) 下载的路径点…

Web APIs:事件基础

事件三要素 1.事件是有三部分组成 事件源 事件类型 事件处理程序 (1)事件源 事件被触发的对象 谁 按钮 (2)事件类型 如何触发 什么事件 比如鼠标点击(click),经过 还是键盘按下 &…

TRC丨艾美捷TRC D-Abequose说明书

艾美捷TRC D-Abequose是一种甜味剂和增味剂配方,适用于食品、饮料、药物和化妆品用途。 艾美捷TRC D-Abequose化学性质: 目录号A010205 化学名称D-Abequose CAS 编号56816-60-5 分子式C₆H₁₂O₄ 分子量148.16 贮存4C 溶解度甲醇(少许…

【蓝桥杯国赛】H 机房

蓝桥杯2022年第十三届决赛真题-机房 - C语言网 (dotcpp.com) 题意: 一共有n个结点,n-1条边,因此这是棵树 信息经过一个结点,就会产生一定的延迟,具体延迟的时间等于该结点的度数 每次询问树上两个结点,问…

c++学习

C学习Static变量生存期和作用域静态局部变量类的继承多态虚函数纯虚函数(接口)可见性数组字符串constmutable成员初始化列表三元操作符在堆、栈上创建C实例化对象C运算符和其重载thisC对象的生存期智能指针uniqueptr(作用域指针)s…

Ubuntu安装微信

1.安装wine sudo dpkg --add-architecture i386 sudo mkdir -pm755 /etc/apt/keyrings sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key//根据你的系统执行不同的命令 Ubuntu 22.04 sudo wget -NP /etc/apt/sources.list.d/…

快乐刷课---Tampermonkey下载使用

TampermonkeyChrome插件伴侣下载资源: 链接:https://pan.baidu.com/s/1IIzB8N2iPW2RjUO2pqDVHw?pwd6666 提取码:6666 1. 下载 Tampermonkey 进入油猴的官网Tampermonkey,下载你使用的浏览器对应的版本 以谷歌浏览器为例&am…

如何计算维吉尼亚密码?Java实现维吉尼亚密码的加密解密算法

文章目录如何计算维吉尼亚密码?Java实现加密算法Java实现解密算法参考博客如何计算维吉尼亚密码? 计算维吉尼亚密码有2种方式,一种是根据密码表查找,另一种是手动计算方法。 1.密码表查找法 第一行是密钥,第一列是明文…

CH579 Cortex-M0 内核低功耗蓝牙 MCU 集成 ARM 内核 32 位微控制器

概述 CH579 是集成 BLE 无线通讯的 ARM 内核 32 位微控制器。片上集成低功耗蓝牙 BLE 通讯模块、以太网控制器及收发器、全速 USB 主机和设备控制器及收发器、段式 LCD 驱动模块、ADC、触摸按键检测模块、RTC 等丰富的外设资源。 特点 32 位 ARM Cortex-M0 内核,…

Arduino常用函数(二)

数学函数 1、min(x,y)函数的作用是返回x,y两者中较小的。 2、max(x,y)函数的作用是返回x,y两者中较大的。 3、abs(x)函数的作用是获取x的绝对值。 4、constrain(amt,low,high)函数的工作过程是,如果amt小于low,则返回low&…

Pytho07--面向对象2

之前我们已经知道了面向对象的概念及在python中创建空类,带方法的类,带初始化方法的类,带实例化方法的类等并认识了类的成员。在我们将其与Java的代码进行对比后发现了python确实有它的方便之处。面向对象的内容不止之前文章中提到的那些&…

IDEA+Tomcat——前端输入数据乱码问题

IDEATomcat——前端输入数据乱码问题 给别人远程部署项目的时候,发现比较老的项目会出现接收前端数据是乱码的问题,但这个项目在我自己的电脑上却是正常的,通过对比发现,IDEA版本或Tomcat版本不同及过低是造成此问题的主要原因&am…

【数学与算法】最小生成树Spanning Trees

链接 无向图: 无向图的意思是,边没有方向。 树: 树是一类特殊的图,树是由节点和无向边构成的; 所有的树都是无向图,但是无向图未必是树; 树有一些性质,但并非所有图都有这些性质…

webrtc防抖动策略NetEq

什么是NetEq:进行抖动控制和丢包隐藏,让音频更平滑。 NetEq的位置 消除抖动的基本原理 NetEq整体架构 NetEq用到的几种缓冲区 NetEq的MCU与DSP NetEq的位置: 网络抖动的计算方式: 两个包在发送端的时间间隔为S,在接收端的间隔为R,那么抖动为J=S-R。 NetEq缓冲区设置多…

golang中struct

前面已经介绍的数组,slice,map有一定的相同之处,即处理的都是相同类型的元素,map中的key和value属于相同的类型,但如果要把多个类型的元素放到一起进行处理,则要使用go语言为我们提供的数据结构struct struct非常适合定…

【Arcgis操作】模块化(批量、自动化)计算多个图层的面积

有很多个图层的面积要计算,如果采用普通的方法,需要给每个图层添加【字段】,然后再挨个计算,图层少的话还好,图层太多的话,很麻烦,很累。 那么,有没有一种方法,能够批量…

OpenCV-Python学习(7)—— OpenCV 轨迹栏操作和键盘响应操作

1. 知识点 cv.namedWindow() 创建一个窗口;cv.createTrackbar() 创建一个轨迹栏;cv.getTrackbarPos() 获取对应轨迹栏的轨迹位置;cv.waitKey() 键盘操作返回对应的key。 2. cv.namedWindow() 函数说明 函数使用 cv.namedWindow(winname, …

【每日算法题】最后一个单词的长度(简单)

今天开始学一学算法✨,前两天研究了下算法,发现算法和数据结构是程序的灵魂,这句话可真没错。 今天先从简单的开始吧😁,LeetCode 第 58 题:最后一个单词的长度 题目:给你一个字符串 s&#xf…