首页 > 系统相关 >Windows内核基础理论笔记

Windows内核基础理论笔记

时间:2024-03-07 14:01:20浏览次数:30  
标签:调用 R3 Windows dll 对象 API 内核 基础理论

内核理论基础

特权级别

​ 现代计算机的CPU设计中有四个特权级别:R0、R1、R2、R3

​ 内核运行在R0(拥有最高权限),用户程序运行在R3

例如:Windows XP体系结构图中

Hardware Abstraction Layer(硬件抽象层):用于提供硬件的低级接口

Windows XP的执行体是NTOSKRNL.EXE的上层

ntdll.dll:暴露给用户态的接口,通过win32API进行调用

显示计算机系统中用户模式和内核模式组件之间的通信的关系图。

Windows R3与R0通信

API调用的结构关系:

  • 结构关系:用户态中调用的底层API(如I/O操作),其封装一般在kernel32.dll或user32.dll中,这两个dll含有指向ntdll.dll的指针

ntdll.dll中的Native API函数是成对出现的,分别以Nt、Zw开头。

  • 在用户态下,Nt和Zw的API本质上是一样的,没什么区别

  • 在内核态中,Nt开头的函数是真正执行功能的函数。Zw函数则需要通过KiSystemService最终找到Nt函数

79Z_[YZWIILD]T2754ZOMR_tmb

从用户态到内核态的大体过程如下:

  • kernel32.dll中的API通过ntdll.dll执行时,完成参数检测工作

  • 调用中断从R3进入R0(比如int 2Eh或者SysEnter指令)

R0和R3下调用Nt*和Zw*API的情况分析:

  • 从用户模式调用Nt*和Zw* API,连接的是ntdll.lib:

​ 二者没有区别,都是通过设置系统服务表中的索引和在栈中设置参数,经有syscall指令进入内核态(Windows 2000 下使用 int 0x2e 指令中断),最终由KiSystemService跳转到KiServiceTable对应的系统服务例程中,R3进入R0时,代码会严格检查参数

  • 从内核模式下调用Nt*和Zw*API,连接ntoskrnl.lib

​ 关于Previous Mode:如果从用户模式调用Native API,则Previous Mode是用户态;如果从内核模式调用Native API,则Previous Mode,则Previous Mode为内核态。Native API会根据Previous Mode是否为用户态,来确定是否要进行严格的检查。

驱动

​ 内核主要由各种驱动(在磁盘上是.sys文件)组成,这些驱动有的是Windows系统自带的(例如ntfs.systcpip.syswin32k.sysc)等,当驱动加载后,会生成对应的设备对象, 并可以选择向R3提供一个可供访问和打开的符号链接。常见的盘符C、D、E等其实都是文件系统驱动创建的设备对象的符号链接,对应的符号链接分别是\??\C:\\??\D:\\??\E:\,应用程序可以根据这个符号链接名通过调用CreatFile接口获得句柄,程序就可以调用应用层函数与内核驱动进行通信。

内核驱动模块

​ Windows内核驱动模块是内核的重要组成部分,既有微软自己开发的内核驱动,也有第三方开发的内核驱动;既有硬件的驱动,也有软件的驱动。

​ 内核在磁盘上的文件拓展名为.sys,是PE文件

​ 此部分开发需要搭建内核驱动开发环境,后续一定。。

内核数据结构

内核对象

Windows内核中使用一种很重要的数据结构管理机制,称为内核对象

应用层的进程、线程、文件、驱动模块、事件、信号量等对象或者打开的句柄在内核中都有对应的内核对象

  • 内核对象的一般结构:一般分为对象头和对象体两部分。

image-20240307130556529

类型

  • Dispatcher对象

此类对象在对象体开始位置一般有共享的数据结构DISPATCHER_HEADER

typedef struct _DISPATCHER_HEADER {
    UCHAR Type;			// DISP_TYPE_*
    UCHAR Absolute;
    UCHAR Size;
    UCHAR Inserted;
   	LONG SignalState;
    LIST_ENTRY WaitListHead;
}
DISPATCHER_HEADER,
*PDISPATCHER_HEADER,
**PPDISPATCHER_HEADER;

特性:这些对象都是可等待的(这些内核对象可以作为参数传给内核的KeWaitForSingleObject()KeWaitForMultipleObjects()函数,以及应用层的WaitForSingleObject()WaitForMultipleObjects()函数)

  • I/O对象

I/O对象在对象体开始位置并未放置DISPATCHER_HEADER结构,常见的I/O对象有DEVICE_OBJECTDRIVER_OBJECTFILE_OBJECTIRPVPBKPROFILE

  • 其他对象

这里着重记录下EPROCESSETHREAD这两个内核对象

EPROCESS:内核态下的进程控制块

每个进程都对应于一个EPROCESS结构,关键的数据结构:

image-20240307133025592

所有进程的EPROCESS都会被放入一个双向链表中,R3中可以调用API访问到内核进程的列表。

ETHREAD:内核态下的线程管理对象

  • EPROCESS、KPROCESS、ETHREAD、KTHREAD结构的关系:

image-20240307135055367

SSDT

SSDT(System Service Descriptor Table):系统服务描述表符,在内核中的名称为KeServiceDescriptorTable,该表已通过内核ntoskrnl.exe导出

SSDT在API调用时的处理

kernel32.dll中的API通过ntdll.dll时,会完成对参数的检查,再调用一个中断(int 2E 或者 SysEnter指令),从而实现从R3进入R0

然后通过SSDT数组找到对应的服务(具体是将服务号index放入eax寄存器中),然后调用指定的服务(Nt*系列函数)

image-20240307120955462

SSDT表的结构体

#pragma pack(1)
typedef struct ServiceDescriptorEntry
{
    unsigned int *ServiceTableBase;
    unsigned int *ServiceCounterTableBase;
    unsigned int NumberOfServices;
    unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t,
*PServiceDescriptorTableEntry_t;
#pragma pack()

TEB

TEB:线程环境块。用于用户模式下。

进程中的每个线程都有一个自己的TEB(系统线程除外)。一个进程的所有TEB都存放在从0x7FFDE000开始的线性内存中,每4KB为一个完整的TEB。

PEB

PEB:进程环境块。用于用户模式下。

线程环境块和进程环境块的关系如下:(x86)

img

参考文献

  1. 《加密与解密》

  2. https://bbs.kanxue.com/thread-202203.htm

标签:调用,R3,Windows,dll,对象,API,内核,基础理论
From: https://www.cnblogs.com/icfh/p/18058760

相关文章

  • python控制windows命令行程序
    有一些现成的库,比如WExpect,是开源的,在github上可以搜索到.但是,不知道为什么,在我自己的笔记本上不能正常工作.而其源码也比较多,懒得定位了.于是自己实现了一个,用法如下.启动和停止命令行importmy_cmdascmdcmd.start()cmd.stop()prompt命令行提示符匹......
  • 08Windows系统安装的准备工作2
    Windows系统安装的准备工作2安装虚拟机VMWareWorkStation17Pro虚拟机是一种能够模拟真正电脑的各种软硬件的软件.在对操作系统的安装不明了清晰的情况下,虚拟机是一个做实验的极佳的工具和平台.在虚拟机软件里,你可以把自己的所有操作当做在真正的电脑上一样.拥有一款虚拟机......
  • Pycharm的安装以及如何跳过试用设置永久使用?(Windows专业版2023-2024)
    目录一.Pycharm安装包下载二.Pycharm安装包安装三.设置永久使用一.Pycharm安装包下载官网下载(较慢),直接点击Download即可。也可以直接使用baidu网盘下载Pycharm官网地址Pycharm安装包网盘下载(内含安装视频及pojie包)二.Pycharm安装包安装直接双击第一步下载的安装......
  • VMware中的Ubuntu虚拟机中实现与windows宿主机的复制粘贴互通
    背景如果经常需要用到虚拟机的话,就肯定需要虚拟机和宿主机之前能够任意的交换数据,能够方便的无障碍复制粘贴以前用windows虚拟机的时候,可以通过安装VMwareTools实现但是在使用ubuntu桌面版式,发现,无法安装VMwareTools或者虽然通过其他方法安装了也还是无法做到无障碍的......
  • windows添加防火墙规则
    bat脚本如下,涉及到的函数主要是netshadvfirewallfirewalladdrule和netshadvfirewallfirewalldeleterule需要注意的一个坑是program的路径不能存在斜杠/,需要使用\,然而很多软件都会自动把路径生成为类似于C:/User/...这种形式,需要在脚本里转换一下remCheckifbothpr......
  • [转帖]linux-windows文件实时同步:Rsync使用教程
    http://luomuren.top/articles/2021/04/06/1617641017252.html#:~:text=linux-windows%E6%96%87%E4%BB%B6%E5%AE%9E%E6%97%B6%E5%90%8C%E6%AD%A5%EF%BC%9ARsync%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%201%20%E4%B8%80%20%E3%80%81%E4%BB%80%E4%B9%88%E6%98%AFrync%20%EF%BC%9F......
  • Windows使用SIDCHG64 修改SID
    1、网站下载工具:https://www.stratesave.com/html/sidchg.html2、执行命令:sidchg64-3.0j.exe/KEY="************"/F/R注意:(1)sidchg有2个版本,标准版sidchg64和轻量版sidchgl64轻量版无需关闭defender实时防护,但是sid改得不彻底标准版执行之前需要关闭defender实时......
  • windows 查询占用端口进程并清理
    查找占用端口的进程号:netstat-ano|findstr9000根据进程号查找占用端口的进程信息(16240为进程号):tasklist|findstr16240关闭占用端口的进程:使用进程号(16240为进程号):taskkill/f/pid16240 2.使用进程名:taskkill /f ......
  • windows编译ZLMediaKit流媒体服务webrtc
    环境说明ZLMediaKit编译需要的软件visualstudio2022cmake3.29.0-rc2OpenSSL1.1.1w(不想踩坑的话安装这个版本)libsrtp2.6.0ZLMediaKit编译后运行需要libsrtp编译后且配置环境变量ZLMediaKit编译后文件visualstudiocmakevisualstuid......
  • Windows 下 强制修改 MySQL的 root 账号密码
    更新记录点击查看2024年3月6日发布。2024年2月6日初始化。关闭MySQL服务netstopMySQLnetstopMySQL57netstopMySQL80netstop自定义的服务名启动MySQL但不带权限转到mysql/bin目录然后执行mysqld–console–skip-grant-tables–shared-memory如果遇到......