[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,用来唯一标识。
主令牌:进程自己的令牌
客户令牌:也即模拟令牌。每个线程默认使用进程的令牌,但也可模式使用其他进程的令牌
[1]windows 内核情景分析---说明的更多相关文章
- 几个常用内核函数(《Windows内核情景分析》)
参考:<Windows内核情景分析> 0x01 ObReferenceObjectByHandle 这个函数从句柄得到对应的内核对象,并递增其引用计数. NTSTATUS ObRefer ...
- windows内核情景分析之—— KeRaiseIrql函数与KeLowerIrql()函数
windows内核情景分析之—— KeRaiseIrql函数与KeLowerIrql()函数 1.KeRaiseIrql函数 这个 KeRaiseIrql() 只是简单地调用 hal 模块的 KfRa ...
- [14]Windows内核情景分析 --- 文件系统
文件系统 一台机器上可以安装很多物理介质来存放资料(如磁盘.光盘.软盘.U盘等).各种物理介质千差万别,都配备有各自的驱动程序,为了统一地访问这些物理介质,windows设计了文件系统机制.应用程序要 ...
- [7] Windows内核情景分析---线程同步
基于同步对象的等待.唤醒机制: 一个线程可以等待一个对象或多个对象而进入等待状态(也叫睡眠状态),另一个线程可以触发那个等待对象,唤醒在那个对象上等待的所有线程. 一个线程可以等待一个对象或多个对象, ...
- [4]Windows内核情景分析---内核对象
写过Windows应用程序的朋友都常常听说"内核对象"."句柄"等术语却无从得知他们的内核实现到底是怎样的, 本篇文章就揭开这些技术的神秘面纱. 常见的内核对象 ...
- [11]Windows内核情景分析---设备驱动
设备驱动 设备栈:从上层到下层的顺序依次是:过滤设备.类设备.过滤设备.小端口设备[过.类.过滤.小端口] 驱动栈:因设备堆栈原因而建立起来的一种堆栈 老式驱动:指不提供AddDevice的驱动,又叫 ...
- [15]Windows内核情景分析 --- 权限管理
Windows系统是支持多用户的.每个文件可以设置一个访问控制表(即ACL),在ACL中规定每个用户.每个组对该文件的访问权限.不过,只有Ntfs文件系统中的文件才支持ACL. (Ntfs文件系统中, ...
- [2]windows内核情景分析--系统调用
Windows的地址空间分用户模式与内核模式,低2GB的部分叫用户模式,高2G的部分叫内核模式,位于用户空间的代码不能访问内核空间,位于内核空间的代码却可以访问用户空间 一个线程的运行状态分内核态与用 ...
- [13]Windows 内核情景分析 --- 网络通信
典型的基于tcpip协议套接字方式的网络通信模块层次: 应用程序 socket api WS2_32.dll socket irp Afd.sys tdi irp Tcpip.sys 回调函数接口 各 ...
随机推荐
- 关于服务器时区BEIST-8、GMT-8、Asia/Shanghai、CST、GMT+8:00等缩写的含义
http://www.talkwithtrend.com/Article/147961 AIX系统时区总结 字数 2078阅读 5844评论 0赞 0 前几天NTP的问题牵涉出时区问题,大家可能被眼花 ...
- fiddler抓包常用功能详解
一.基础部分: 1.设置代理ip及端口,tools --> telerik fiddler options --> connections -->勾选 “ Allow romote ...
- 终于解决“Git Windows客户端保存用户名与密码”的问题(转载)
add by zhj:不建议用这种方法,建议用SSH,参见 TortoiseGit密钥的配置 http://www.cnblogs.com/ajianbeyourself/p/3817364.html ...
- [转载]智能科普:VR、AR、MR的区别
智能科普:VR.AR.MR的区别 http://news.zol.com.cn/553/5534833.html news.zol.com.cn 2015-11-23 16:00 近日, 获得谷歌5亿 ...
- mysql触发器:插入数据前更新创建时间为服务器的时间
DROP TRIGGER IF EXISTS `upd_patientquestionnaire`; create trigger upd_patientquestionnaire BEFORE in ...
- 所使用的“System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35”版本高于所引用的程序集“System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”的版本
System.Web.Mvc.dll引用是感叹号. 解决方法:新建mv3应用程序,右键选择System.Web.Mvc.dll 查看所引用的路径. 在旧程序中重新引用即可.C:\Program Fil ...
- MYSQL的历史
MYSQL的历史 见证MySQL发展历程 各分支版本溯源 http://tech.it168.com/a2012/0621/1363/000001363446.shtml [IT168 技术]毫无疑问 ...
- 各大知名区块链交易所链接及API文档链接
区块链交易所链接 火币网(Huobi):https://www.huobi.br.com/zh-cn/ API文档:https://github.com/huobiapi/API_Docs/wiki ...
- 字符串转 多行 ,判断给定一组id ,查库中不存在用
SELECT REGEXP_SUBSTR('17,20,23', '[^,]+', 1, LEVEL, 'i') AS STR FROM DUAL CONNECT BY LEVEL < ...
- 将常用的T-CODE收藏进 文件夹
1:选中文件夹,右键>insert transaction>输入相应的t-code.