《深入解析Windows操作系统》第5章节学习笔记

news2024/12/23 12:46:07

1、每个Windows进程都是由一个执行体进程EPROCESS结构来表示的,EPROCESS和相关数据结构位于系统空间,但是进程环境控制块PEB是个例外,它位于进程空间地址中(因为它包含了一些需要由用户模式代码来修改的信息)。对于每一个执行了Win32程序的进程,WIn32子系统进程Crss为它维护了一个平行的结构CSR_PROCESS。最后,Windows子系统的内核模式部分(Win32.sys)有一个针对每个进程的数据结构W32PROCESS,当一个线程第一次调用Windows的USR或GDI函数(它们是在内核模式中实现的)时,W32PROCESS结构就会被创建。除空闲进程外,每个EPROCESS结构会被执行体对象管理器封装为一个进程对象。一个进程句柄通过进程相关的API提供EPROCESS结构中部分数据以及它的相关结构中数据的访问。一个简化版的关于进程和线程数据结构的框图如下:

下图显示了EPROCESS结构中的关键域:

执行体进程结构的第一个字段称作PCB,代表进程控制块,它是一个KPROCESS类型的结构,代表内核进程。虽然执行体的例程往EPROCESS中保存数据,但是分发器、调度器和终端/时间记账代码——作为操作系统内核的一部分——使用KPROCESS。这使得执行体的高层功能和下面的底层特定功能实现之间能有一层抽象,避免二者之间不必要的依赖。

2、PEB:位于它所描述的进程的用户模式地址空间,包含了映像加载器、堆管理器以及其他需要从用户模式访问它的Windows组件所需的信息。EPROCESS和KPROCESS结构只能从内核模式访问。EPB的字段如下图所示:

3、CSR_PROCSS结构包含专用于Windows子系统(Crsss)的进程信息。这样,只有Windows应用程序才有CSR_PROCESS结构关联到它们。另外,因为每个会话都有它自己的Windows子系统,所以CSR_PROCESS结构会有它自己的Windows子系统,所以CSR_PROCESS结构由每个会化的Crss来维护。CRSS_PROCESS的基本结构如下图所示:

4、WIN32PROCESS:该结构包含内核(Win32k)中的Windows图像和窗口管理代码需要维护的有关GUI进程的状态信息,其基本结构如下图所示:

5、受保护进程:在哪Windows安全模型中,任何一个进程的令牌只要有调试权限就能对机器上其他任何进程请求任意的访问权限(如读写任意进程的内存、注入代码,挂起和恢复线程)。但有时候有些进程需要避免被拥有调试权限的进程随意修改和访问,因此Windows引入了受保护进程(这类进程大多与多媒体相关)。受保护进程与普通进程并存,但是它们对系统其他进程(即以管理员特权运行)可申请的访问权限上增加了重要的限制。受保护进程可以由任何应用程序创建,然而操作系统仅在以下条件允许一个进程被保护:它的映像已经被一个特殊的Windows Media证书数字签名过。

在内核层面上对受保护进程的支持分为两块,首先,进程创建过程完全在内核模式进行以避免注入攻击;其次,受保护进程会在PROCESS结构中设置一个特殊的位,它修饰了进程管理器中安全方面例程的行为,会拒绝某些通常授予管理员的访问权。事实上,对受保护进程仅有的访问权是PROCESS_QUERY、SET_LIMIT_INFORMATION、PROCCESS_TERMINATE和PROCESS_SUSPEND_RESUME。某些特定的访问权对于受保护进程内的线程也是禁用的。

由于Process Explorer使用普通的用户模式Windows API来查询进程内部的信息,它对于受保护进程无法进行某些操作。另一方面,Windbg这样的工具运行于内核调试模式下,使用内核模式基础设施来获取这些信息,得到的信息会更加完整。

6、线程的局部原理:在操作系统层次上,Windows线程是一个由执行体线程对象来表示的。执行体线程对象封装了一个ETHREAD结构体,而ETHREAD结构又含有一个KTHREAD结构作为它的第一个成员,如下图所示:

ETHREAD结构和它指向的结构都位于系统地址空间,唯一的例外是线程环境快TEB,它位于进程地址空间中(同样地,也是因为用户模式组件需要访问它)。并且Windows子系统Crss为Windows进程中创建的每个线程维护了一个平行的结构称为CSR_THREAD。另外,对于那些已经调用了任一Windows子系统USER或者GDI函数的线程,Windows子系统的内核模式部分(Win32.sys)为每个这样的线程维护了一个数据结构,称为W32THREAD结构,线程的KTHREAD结构指向了W32THREAD结构。

ETHRED的第一个字段是Tcb,也称为线程控制块,其类型是KTHREAD。KTHREAD结构包含了Windows内核为这些正在运行的线程执行线程调度、同步和计时而需要访问的信息。

TEB内部有一个称为TIB(线程信息块)的头,主要作用是为了保证OS/2和Win9X应用程序的兼容性。当通过一个初始TIB创建新线程的时候,它也允许异常和栈信息被保存进一个较小的TIB中。TEB存储了有关映像加载器和各种Windows DLL的环境信息。因为这些组件运行在用户模式下,所以它们需要一个在用户模式下可写的数据结构。

Windows实现了一个优先级驱动的、抢占式调度系统——具有最好有限的就绪线程运行,而该线程可能仅限于在允许它运行(或者设定为偏好的)的处理器上运行,这种现象称为处理器亲和性。

Windows调度代码是在内核中实现的,然而,内核中不存在单独的“调度器”模块或者例程——调度代码散步在内核中凡是会发生与调度相关的事件的各处,执行这些任务的例程合起来称为内核的“分发器”。

7、线程环境切换:一个线程的环境和用于环境切换的过程随处理器体系结构的不同而不尽相同。一个典型的环境切换需要保存和加载以下数据:指令指针EIP、内核栈的指针、指向该线程运行所在的地址空间(该进程的页表目录)的指针。内核把老线程的这些信息保存起来:将这些信息压入到老线程的内核栈中,更新站指针,然后将此栈指针保存到老线程的KTHREAD块中。然后内核栈指针被设置为新线程的内核栈,新线程的环境被加载进来。如果新线程位于另外一个进程中,那么,内核还会降新进程的页目录表加载到一个专门的处理器寄存器中,从而使用新进程的地址空间。如果一个需要被交付的内核APC正在等待处理器,则一个IRQL为1的中断就会产生。否则处理器的控制被传递给新线程中已经被恢复的指令指针,于是新线程开始运行。

一个线程可能会通过调用某个Windows等待函数来等待某个对象(如事件、互斥体、信号量、IO完成端口、进程、线程、窗口消息等)从而进入等待状态,主动放弃对处理器的使用。但是放弃处理器的线程并不是降低优先级了,该线程只是被内核移动到了它正在等待的对象的等待队列中。

8、理想处理器:一个线程的理想处理器是该线程被创建的时候,利用进程控制块中的一个种子来选定的。每当一个线程被创建时,该种子就会递增。所以,一个进程中的每个新线程的理想处理会循环经理当前系统上所有可用的处理器。但是这种分配方法假定了一个进程内的线程完成的是等量的工作。然而在现实中这个往往是不可能的,更常见的是,由一个或者多个线程做事务管理工作,其他另有一组工作者线程。因此,一个多线程程序想要充分利用底层平台的优势,使用SetThreadIdealProcessor函数来为它的线程指定理想的处理器编号是更有用的,或者使用SetThreadIdealProcessorEx函数为线程选择一个亲和处理器组号。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jvm面试题30问

什么是JVM的跨平台? 什么是JVM的语言无关性? 什么是JVM的解释执行 什么是JIT? JIT:在Java编程语言和环境中,即时编译器(JIT compiler,just-in-time compiler)是一个把Java的字节码(…

基于springboot实现英语知识应用网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现英语知识应用网站系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了英语知识应用网站的开发全过程。通过分析英语知识应用网站管理的不足,创建了一个计算机管理英语知识应…

Mysql中索引的概念

索引相关概念 基础概念: 在MySQL中,索引是一种数据结构,用于加快数据库查询的速度和性能。索引可以帮助MySQL快速定位和访问表中的特定数据,就像书籍的索引一样,通过存储指向数据行的指针,可以快速…

cmake的使用方法: 编译生成库文件

一. 简介 前面文章学习了针对单个 .c文件,cmake 工具是如何编译的? 针对包含多个 .c文件,cmake工具又是如何编译的?文章如下: cmake的使用方法: 单个源文件的编译-CSDN博客 cmake的使用方法: 多个源文件的编译-CS…

Allegro如何删除死铜

Allegro如何删除死铜 敷铜说明 敷铜后铜皮会避让与自己不同的信号,避让后有的铜皮就会变成很小一块,这个最小形状的设置如下, 首先点击: 然后选中对应的铜皮: 在鼠标右键,选择“Parameters…” 改变上图红色框中的数值就能设置最小死铜的大小。 删除死铜的方法 1、首…

设计模式之装饰者模式DecoratorPattern(四)

一、概述 装饰者模式(Decorator Pattern)是一种用于动态地给一个对象添加一些额外的职责的设计模式。就增加功能来说,装饰者模式相比生成子类更为灵活。装饰者模式是一种对象结构型模式。 装饰者模式可以在不改变一个对象本身功能的基础上增…

前端开发报错:Extension context invalidated

这个错误一般是由浏览器的插件导致的 直接卸载 就没有问题了 注意检查 可能不是你自己的代码问题哦~

【如何使用SSH密钥验证提升服务器安全性及操作效率】(优雅的连接到自己的linux服务器)

文章目录 一、理论基础(不喜欢这部分的可直接看具体操作)1.为什么要看本文(为了zhuangbility)2.为什么要用密钥验证(更安全不易被攻破)3.密码验证与密钥验证的区别 二、具体操作1.生成密钥对1.1抉择&#x…

DataTrove:一款针对大规模文本数据的处理、过滤和消除重复数据工具

关于DataTrove DataTrove是一款针对大规模文本数据的处理、过滤和消除重复数据工具,该工具可以通过提供一组平台无关的可定制管道处理块,帮助广大研究人员从各种复杂脚本中解放出来,同时还允许我们轻松添加自定义功能。 DataTrove所实现的数…

再生龙clonezilla使用方法

目录 本文相关内容的介绍服务器窗口重定向引导进入再生龙系统检查本机操作系统的引导模式 再生龙基础功能选择选择 device-image选择ssh_server 网络配置ssh_server 配置ssh_server 镜像存储路径 再生龙抓取操作系统抓取镜像的命名 再生龙恢复操作系统拉取镜像的选择 本文相关内…

OpenCV4.9的点多边形测试(65)

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV的图像矩(64) 下一篇:OpenCV4.9的基于距离变换和分水岭算法的图像分割(66) Point Polygon Test(点多边形测试)是 OpenCV 库中的一个功能,用于判…

Windows安装mysql8.0.20

目录 1.下载安装包mysql8.0.20 2.配置MySQL环境变量 3.开始安装 ​编辑4.打开cmd命令行 5.Navicat测试连接 1.下载安装包mysql8.0.20 MySQL :: Download MySQL Community Server (Archived Versions) 2.配置MySQL环境变量 3.开始安装 将压缩包安装到指定路径 编辑my.ini文件…

一起Talk Android吧(第五百五十八回:lombok用法)

文章目录 1. 概述2. 使用方法3. 内容总结 各位看官们大家好,上一回中介绍了如何获取文件读写权限的知识,本章回中将介绍lombok相关的知识。闲话休提,言归正转,让我们一起Talk Android吧! 1. 概述 这是一个java库,用来…

[系统安全] 六十.威胁狩猎 (1)APT攻击检测及防御与常见APT组织的攻击案例分析

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…

踏上R语言之旅:解锁数据世界的神秘密码(五)

线性与非线性模型及R使用 文章目录 线性与非线性模型及R使用一、数据的分类与模型选择1.变量的取值类型 二、广义线性模型广义线性模型概述Logistic模型 总结 一、数据的分类与模型选择 1.变量的取值类型 因变量记为y,解释变量记为x1,x2,… 因变量y一般…

Coursera: An Introduction to American Law 学习笔记 Week 05: Criminal Law

An Introduction to American Law 本文是 https://www.coursera.org/programs/career-training-for-nevadans-k7yhc/learn/american-law 这门课的学习笔记。 文章目录 An Introduction to American LawInstructors Week 05: Criminal LawKey Criminal Law TermsSupplemental Re…

边沿JK触发器

边沿JK触发器 电路组成 & 逻辑符号 工作原理 Q n 1 D Q^{n1}D Qn1D J Q n ‾ K Q n ‾ \overline{\overline{JQ^n}KQ^n} JQn​KQn​ ( J Q n ) ( K ‾ Q n ‾ ) (JQ^n)(\overline{K}\overline{Q^n}) (JQn)(KQn​) J K ‾ J Q n ‾ K ‾ Q n Q n ‾ Q n J\over…

解救应用启动危机:Spring Boot的FailureAnalyzer机制

目录 一、走进FailureAnalyzer 二、在Spring Boot中如何生效 三、为什么可能需要自定义FailureAnalyzer 四、实现自定义基本步骤 (一)完整步骤要求 (二)注册方式说明 通过Spring Boot的spring.factories文件(建…

Java中的字符流

字符流字节流编码表 Java为什么可以区分字母和汉字 package day3; ​ import java.io.UnsupportedEncodingException; import java.lang.reflect.Array; import java.util.Arrays; ​ public class Test {public static void main(String[] args) throws UnsupportedEncoding…

文件批量高效管理,批量将PDF类型文件移动到指定文件夹里,实现文件高效管理

文件的管理与整理成为了我们生活中不可或缺的一部分。面对堆积如山的PDF文件,你是否也曾感到手足无措、焦头烂额?现在,有了我们的批量文件管理工具,PDF文件的管理将变得前所未有的高效与简单! 首先,我们要…