1 / 19

第二章

第二章. 系统启动引导概述. 概述部分. 2.1 内核对象 2.1.1 什么是内核对象 Windows 操作系统仅能在内核态运行的对象称为内核对象,如信号量对象、文件对象和进程对象等。 每个内核对象是内核分配的内存块,是一种数据结构,负责维护该对象的各种信息,而且只能由内核访问。 如何操作这些内核对象呢 ?—— 系统调用 如何识别这些内核对象呢 ?—— 句柄. 2.1.2 如何管理内核对象. 为了使操作系统变得更加健壮,内核对象必须拥有一些用户对象所没有的安全和访问方面的特性(如何管理) 内核对象使用计数

abedi
Download Presentation

第二章

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第二章 系统启动引导概述

  2. 概述部分 • 2.1内核对象 • 2.1.1什么是内核对象 • Windows操作系统仅能在内核态运行的对象称为内核对象,如信号量对象、文件对象和进程对象等。 • 每个内核对象是内核分配的内存块,是一种数据结构,负责维护该对象的各种信息,而且只能由内核访问。 • 如何操作这些内核对象呢?——系统调用 • 如何识别这些内核对象呢?——句柄

  3. 2.1.2如何管理内核对象 • 为了使操作系统变得更加健壮,内核对象必须拥有一些用户对象所没有的安全和访问方面的特性(如何管理) • 内核对象使用计数 -每个对象都包含一个使用计数,当有一个进程访问时,则增加计数加1 • 安全性 -系统通过安全描述符对内核对象进行保护。

  4. 2.2 中断和异常 • 中断是指CPU不按照正常的处理执行模式,而是对系统发生的某个事件做出的一种反应 Windows系统把中断分为两类进行响应: • 第一类是由CPU外部引起,称为外部中断 -不可屏蔽中断 -可屏蔽中断 • CPU的内部事件或程序执行中的事件引起的称作异常 -微处理器内部操作发生异常引起 -“陷入”(trap)

  5. 2.3 系统调用 • CPU特权级 • 在windows系统中,系统调用像普通C函数调用一样出现在C程序中。当程序通过执行系统调用而陷入系统中时,就使用户级3变为特权级0,这样就可以执行系统操作,如对内核对象的创建,删除和修改等。 • SSDT的全称是System Services Descriptor Table,系统服务描述符表。该表的作用是把Ring3的Win32 API和Ring0的内核API联系起来。

  6. 2.4 动态链接库DLL • 动态链接:就是把一些经常会共享的程序码(静态链接的OBJ程序库)制作成DLL文件,当执行调用到DLL内的函数时,windows操作系统才会把DLL文件加载到内存。通过动态链接方式,内存浪费的情形将可大幅降低。 • 特征: -内存管理 -符号解析 -运行时显示链接

  7. 2.5系统初始化 启动过程分为引导、内核初始化和系统登陆三大阶段。 • 2.5.1 引导阶段 • 引导过程,即把系统从磁盘加载进内存,从自检开始进行启动的最初准备工作。 • 2.5.2内核初始化 • 主要的初始化过程,将完成各个子模块、服务的加载 • 2.5.3系统登陆 • 加载用户设置,开始登陆系统

  8. 实验部分 • 2.1实验概述 • 本章做了两个与系统初始化相关的实验。一个是对系统自举初始化的验证实验。实验中,对概述部分没有详细分析的内核初始化的两个部分进行了全面的、完整的代码级分析,并作正确性验证,最后得出函数调用序列图。 • 另一个是关于系统调用,通过API HOOK实现系统调用控制权的转移。

  9. 2.1验证实验 内核初始化流程大致分为两个阶段:phase0和phase1。 具体所处的阶段是由一个全局变量InitializationPhase标识 要求:验证实验主要就是验证这两个初始化阶段的过程。最后得出流程图,并且能够分析其中的机制,从而掌握设计大型软件的方法。

  10. Phase 0 分析 关键点: • (1)当初始化0号CPU时调用KiInitSystem用于初始化内核数据结构; • (2)调用执行体初始化例程ExpInitializeExecutive,进入Phase0; • (3)在调用ExpInitializeExecutive返回后,首先设置IRQL为DISPATCH_LEVEL级别,以允许线程派发,然后设置当前线程优先级为0

  11. Phase 0 分析 调用ExpInitializeExecutive函数后, phase 0 的初始化工作。 • 调用HalInitSystem,初始化HAL • 调用MmInitSystem,初始化内存管理器; • 调用ObInitSystem,初始化对象管理器; • 调用SeInitSystem,初始化安全引用监视器; • 调用PsInitSystem,初始化进程管理器; • 调用PpInitSystem,初始化即插即用管理器。

  12. Phase 1 分析 • ExpInitializeExecutive返回后,首先设置IRQL为DISPATCH_LEVEL级别,以允许线程派发, Phase1进入多线程环境,开始初始化。 • 结束之后,全局变量InitializationPhase的值为2

  13. Phase 1 分析 • Phase1Initialization: 0% - 25% • 创建各内核对象类型 • 创建各全局变量 • 创建系统工作线程 • 设置时区 • 各子模块和服务的二次初始化

  14. Phase 1 分析 • Phase1Initialization: 25% - 75% • IO管理器初始化并枚举设备 • 加载设备驱动 • IOInitSystem -这个过程比较耗时(50%) • Phase1Initialization: 75% - 100% • 释放初始化占用的资源 • 启动smss.exe进入登陆阶段

  15. 内核初始化流程图

  16. 2.2 API HOOK • 实验的出发点: • 在调用过程中会有一个从用户态陷入到核心态的控制权跳转。由于这个原因,修改对应的查找表结构或函数地址,来间接接管系统调用。 • 要求: • 掌握系统调用的机制,理解为什么需要从用户态陷入核心态。实现用户态下的HOOK API。

  17. API HOOK • 实现Hook 的多种方式 • (1)使用Windows钩子函数实现HOOK。可截获用户或者系统消息 • (2)直接替换函数入口地址代码实现HOOK • (3)替换IAT(PE结构中的输入表)中的函数地址入口实现HOOK; • (4)替换Windows消息处理函数实现HOOK

  18. Hook 原理 • 首先获取目标API地址: 可以从内联汇编中提取出目标转移代码指令,如 _asm{ JMP Label } • 如何计算Label的值? Label = LPNewFUNC – (LPHOOKFUNC + 5);

  19. Hook • 思考: • 为什么Hook代码要写入DLL? • 如何将Hook代码植入到其它进程? • 能否实现其它方式的Hook?

More Related