本文说明:这一系列文章(笔记)是在看雪里面下载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,用来唯一标识。

主令牌:进程自己的令牌

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

[1]windows 内核情景分析---说明的更多相关文章

  1. 几个常用内核函数(《Windows内核情景分析》)

    参考:<Windows内核情景分析> 0x01  ObReferenceObjectByHandle 这个函数从句柄得到对应的内核对象,并递增其引用计数. NTSTATUS ObRefer ...

  2. windows内核情景分析之—— KeRaiseIrql函数与KeLowerIrql()函数

    windows内核情景分析之—— KeRaiseIrql函数与KeLowerIrql()函数 1.KeRaiseIrql函数 这个 KeRaiseIrql() 只是简单地调用 hal 模块的 KfRa ...

  3. [14]Windows内核情景分析 --- 文件系统

    文件系统 一台机器上可以安装很多物理介质来存放资料(如磁盘.光盘.软盘.U盘等).各种物理介质千差万别,都配备有各自的驱动程序,为了统一地访问这些物理介质,windows设计了文件系统机制.应用程序要 ...

  4. [7] Windows内核情景分析---线程同步

    基于同步对象的等待.唤醒机制: 一个线程可以等待一个对象或多个对象而进入等待状态(也叫睡眠状态),另一个线程可以触发那个等待对象,唤醒在那个对象上等待的所有线程. 一个线程可以等待一个对象或多个对象, ...

  5. [4]Windows内核情景分析---内核对象

    写过Windows应用程序的朋友都常常听说"内核对象"."句柄"等术语却无从得知他们的内核实现到底是怎样的, 本篇文章就揭开这些技术的神秘面纱. 常见的内核对象 ...

  6. [11]Windows内核情景分析---设备驱动

    设备驱动 设备栈:从上层到下层的顺序依次是:过滤设备.类设备.过滤设备.小端口设备[过.类.过滤.小端口] 驱动栈:因设备堆栈原因而建立起来的一种堆栈 老式驱动:指不提供AddDevice的驱动,又叫 ...

  7. [15]Windows内核情景分析 --- 权限管理

    Windows系统是支持多用户的.每个文件可以设置一个访问控制表(即ACL),在ACL中规定每个用户.每个组对该文件的访问权限.不过,只有Ntfs文件系统中的文件才支持ACL. (Ntfs文件系统中, ...

  8. [2]windows内核情景分析--系统调用

    Windows的地址空间分用户模式与内核模式,低2GB的部分叫用户模式,高2G的部分叫内核模式,位于用户空间的代码不能访问内核空间,位于内核空间的代码却可以访问用户空间 一个线程的运行状态分内核态与用 ...

  9. [13]Windows 内核情景分析 --- 网络通信

    典型的基于tcpip协议套接字方式的网络通信模块层次: 应用程序 socket api WS2_32.dll socket irp Afd.sys tdi irp Tcpip.sys 回调函数接口 各 ...

随机推荐

  1. bc https://en.wikipedia.org/wiki/Gossip_protocol

    分布式容错性:分布式网络极其鲁棒,能够容忍部分节点的异常状态: 不可篡改性:一致提交后的数据会一直存在,不可被销毁或修改: 隐私保护性:密码学保证了数据隐私,即便数据泄露,也无法解析. 随之带来的业务 ...

  2. 解决pathForResource返回nil, 无法读取plist文件问题

    有很多人在设置plist文件的时候, 会发现读取不了plist文件里面的内容, 返回值为nil, 下面我们来解决一下这个问题. 首先我们打开工程并且按照下面的步骤来设置: 设置好后, 我们来写一段代码 ...

  3. [cloud][sdn] neutron了解

    了解 neutron 文档:https://yeasy.gitbooks.io/openstack_understand_neutron/content/ LB讲的不细.DVR讲的不清晰. 读了全文之 ...

  4. 转:el表达式获取map对象的内容 & js中使用el表达式 & js 中使用jstl 实现 session.removeattribute

    原文链接: ①EL表达式取Map,List值的总结 ②在jsp中使用el表达式通过键获得后台的一个map<Long,String>的值 ③在javascript中使用el表达式(有图有真相 ...

  5. Django + Redis实现页面缓存

    目的:把从数据库读出的数据存入的redis 中既提高了效率,又减少了对数据库的读写,提高用户体验. 例如: 1,同一页面局部缓存,局部动态 from django.views import View ...

  6. tomcat在Eclipse中和idea中的使用

    在eclipse中的使用 下载 http://tomcat.apache.org/ 部署项目到tomcat 常见问题 访问时如何出掉项目名 中文乱码问题 1.浏览器编码问题,修改浏览器的编码 2.js ...

  7. 函数 call、apply、bind的使用

    [优雅代码]深入浅出 妙用Javascript中apply.call.bind (转载而来)   这篇文章实在是很难下笔,因为网上相关文章不胜枚举. 巧合的是前些天看到阮老师的一篇文章的一句话: “对 ...

  8. 【PyQt5-Qt Designer】QProgressBar() 进度条

    QProgressBar() 进度条 QProgressBar简介 QProgressBar小部件提供了一个水平或垂直的进度条. 进度条用于向用户指示操作的进度,并向他们保证应用程序仍在运行. 进度条 ...

  9. 【PyQt5-Qt Designer】QSlider滑块

    QSlider滑块 QSlider简介 QSlider小部件提供了一个垂直或水平滑块. 滑块是控制有界值的经典控件.它允许用户沿水平或垂直凹槽移动滑块手柄,并将手柄的位置转换为合法范围内的整数值. Q ...

  10. 【PyQt5-Qt Designer】猜数字(小项目)

    参考:https://zhuanlan.zhihu.com/p/28287825 https://www.cnblogs.com/hhh5460/p/5174266.html 最终效果: 本次练习涉及 ...