[1]windows 内核情景分析---说明

本文说明:这一系列文章(笔记)是在看雪里面下载word文档,现转帖出来,希望更多的人能看到并分享,感谢原作者的分享精神。

 

说明

 

本文结合《Windows内核情景分析》(毛德操著)、《软件调试》(张银奎著)、《Windows核心编程》、《寒江独钓-Windows内核安全编程》、《Windows PE权威指南》、《C++反汇编与逆向分析揭秘》以及ReactOS操作系统 (V0.3.12)源码,以《Windows内核情景分析》为蓝本,对Windows内核重要框架、函数、结构体进行解析

 

由于工程庞大,我能理解到的只是冰山一角,但本文力求做到让每个读者都能从整体上理解Windows内核的架构,并大量解释一些关键细节。

 

本文适合读者:熟悉C语言、汇编,PE文件格式,有一定驱动/内核程序开发经历的读者

本文阅读顺序:基础较弱的读者请遵循篇章序号,否则可能会吃力。

本文解读方式:1、源码、伪码结合,展示主流程,很多时候忽略权限、错误检查,多线程互斥等旁枝末节

2、函数的参数没有严格排序,很多不重要的参数也省略了,要注意

3、结构体内的成员没有严格排序,成员名称也不严格对应,并只列出一些重要成员

4、一些清理工作,如关闭句柄、释放内存、释放互斥对象等工作省略

5、很多时候,函数体开头声明的那些没有初始值的局部变量我都略去了

(我所做的修改基本不影响从代码层次理解Windows内核的原理)

写作初衷1: 我一直对Rootkit感兴趣,但是以前在不熟悉内核的情况下,总是不知道要在哪个位置挂钩,要Hook哪些函数才能达到我的目的。

写作初衷2:以前在写文件系统过滤驱动、Ndis过滤驱动以及其他驱动时遇到的种种疑惑,因此,总想看一下ddk提供的内核函数到底是怎么实现的。

于是,翻看了毛老师的大作,受益匪浅,在基本理清了原理与细节后,特此做了一番总结,希望这篇文章能够为安全界的朋友尽一点绵薄之力。由于工作原因,我接触到的知识面有限,不可能逐一摸透Windows的方方面面,再说,ReactOS本来就与Windows有一些小差别,因此,希望各位朋友带着批判的态度去阅读本文。(当然,我是尽我所能,认真写完逐篇的)

分析的部分项目截图:

 

 

本文术语约定:

描述符:指用来描述一件事物的“结构体”。如缓冲描述符,描述了一个缓冲的基址、长度等信息。中断描述符,描述了那个中断向量对应的分配状态、isr等信息

Entry:指表中的表项、条目,有时也指函数入口

SSDT:基本系统服务表(其实全称应叫系统服务派遣表)

Shadow SSDT:GUI/GDI系统服务函数表,这是第二张SSDT

SSDTDT:系统服务表描述符表,表中每个元素是一个SSDT描述符(注意内核中有两张SSDT和两张SSDTDT)

IDT:中断描述符表,每个cpu一个。(每个表项是一个描述符,可以简单视为isr)

ISR:中断服务例程,IDT表中的中断描述符所描述的中断处理函数

EPR:异常处理例程,IDT表中的异常描述符所描述的异常处理函数

VA:虚拟地址,    PA:物理地址,   LA:线性地址,   RVA:相对虚拟地址    foa:文件偏移

PDE:页目录中的表项,保存着对应二级页表的物理地址,又叫“二级页表描述符”

PTE:二级页表中的表项,真正记录着每个虚拟页面的映射情况以及其他信息,又叫“映射描述符”

页目录:(又叫一级页表、总页表),一个PDE数组,这个数组的大小刚好占据一个页面

二级页表:一个PTE数组,这个数组的大小也刚好占据一个页面(进程有一个总页表+1024个二级页表)

AREA:地址空间中的一块连续的区段,VirtualAlloc分配内存都是以区段为单位

内存分配:表示从地址空间中用VirtualAlloc预定或者提交映射一块内存,不是指malloc、new、HeapAlloc

PID:进程ID、进程号。(其实也是个句柄)

TID:线程ID、线程号。(其实也是个句柄)

PDO:物理设备对象,相对于fdo而言。Pdo并不一定是最底层的那个硬件pdo

FDO:功能设备对象,相对于pdo而言。Fdo也可能直接访问硬件芯片。fdo与pdo只是一种相对概念。

栈底pdo:又叫‘基石pdo’,‘硬件pdo’,指用作堆栈基石的那个pdo,它是由相应的总线驱动内部创建的 。 

端口设备对象:端口驱动或者小端口驱动中创建的设备对象(他下面是硬件pdo)

总线驱动:用来驱动总线的驱动(总线本身也是一种特殊的设备),如pci.sys总线驱动

端口驱动:由厂家提供的真正用来直接访问硬件芯片的驱动,位于总线驱动上层

功能驱动:指类驱动。如鼠标类驱动mouseclass.sys,磁盘类驱动disk.sys

上层过滤驱动:位于功能类驱动上面的驱动

下层过滤驱动:位于功能驱动下面,端口驱动上面的驱动

顶层驱动:指位于栈顶的驱动

中间驱动:intermediate drivers,凡是夹在顶层驱动与端口驱动之间的那些驱动都叫中间驱动

设备树:由PnP管理器构造的一颗用来反映物理总线布局的‘硬件设备树’。

设备节点:设备树中的节点。每个节点都表示一个真正的‘硬件pdo’

老式驱动:即NT式驱动,指不提供AddDevice或通过NtLoadDriver加载的驱动

WDM驱动:指提供了AddDevice并且不是通过NtLoadDriver加载的驱动

IRP派遣例程:又叫分发例程、派遣函数。驱动程序中用来响应处理irp的函数。(Dispatch)

设备绑定:指将设备‘堆栈’到原栈顶设备上面,成为新的栈顶设备。

文件:指物理介质上的文件(磁盘、光盘、U盘)

文件对象:每次打开设备时生成一个文件对象(文件对象不是文件,仅仅表示对设备的一次打开上下文,因此文件对象又叫打开者)

套接字驱动:afd.sys

套接字设备:\Device\Afd\Endpoint

套接字文件对象:每打开一次套接字设备生成一个套接字文件对象

套接字FCB:每个套接字文件对象关联的FCB,用来描述套接字的其他信息

地址文件对象:每次打开传输层的tdi设备时生成的一个文件对象,用于套接字绑定

地址对象:传输层中为每个地址文件对象创建一个地址对象,用来描述一个地址(IP、端口号、协议等)

Socket irp:发往afd套接字设备(即\Device\Afd\Endpoint)的irp

Tdi irp:发往传输层设备(即\Device\Tcp,\Device\Udp,\Device\RawIp)的irp

物理卷设备:指磁盘卷、光盘卷、磁带卷等物理卷设备,由相应类型的硬件驱动创建

磁盘卷设备:指磁盘分区,设备对象名为\Device\HarddiskN\PartitionN 形式(N从0开始)

文件卷设备:由文件系统内部创建的挂载(即绑定)在物理卷上的匿名设备

Cdo:控制设备对象。一个驱动通常创建有一个cdo,用来与外界通信。

FSD:文件系统驱动,File System Driver缩写。

簇:文件以簇为分配单位。一个文件包含N个簇,簇之间不必物理连续,一个簇一般为4KB

扇区:系统以扇区为单位进行磁盘IO。一个簇包含N个扇区,一个扇区一般为512B

文件块:磁盘文件中的文件块,对应于内核中的文件缓冲段

缓冲段:文件块在内核中的缓冲

ACL:访问控制表。每个Ntfs文件、内核对象都有一份ACL,记录了各用户、组的访问权限

Token:访问令牌。每个线程、进程都有一个Token,记录了包含的特权、用户、组等信息

SID:指用户ID、组ID、机器ID,用来唯一标识。

主令牌:进程自己的令牌

客户令牌:也即模拟令牌。每个线程默认使用进程的令牌,但也可模式使用其他进程的令牌

posted @ 2018-12-17 21:36  jadeshu  阅读(1327)  评论(0编辑  收藏  举报