windows ssdt

news2024/11/14 2:13:00

前言

我们 ring 3 跳转 ring0 另一种方式使用sysenter命令。

sysenter 相比起jmp,int xx方式相比速度更快,因为sysenter指令大量的使用了MSR寄存器 存储跳转地址等。

MSR寄存器相关读/写命令

//读取msr寄存器
rdmsr xxxx
//写入msr寄存器
wrmsr xxxx

其中xxx是msr寄存器的编号比如174h等

为方便记忆我们约定了一些编号的名字
IA32_SYSENTER_CS (MSR address 174H)
IA32_SYSENTER_EIP (MSR address 176H)
IA32_SYSENTER_ESP (MSR address 175H)

上面上个寄存器就是sysenter指令会涉及的msr寄存器。

sysenter 规范

以32位操作系统举例说明这个指令相关流程.

sysenter 段描述符约定

使用这个intel 指令操作系统必须要做出如下妥协:
ring0 的ds段描述符必然是ring0 的 cs+8.我们可以简述成: ds0=cs0+8
ring3 的cs和ds描述如下: cs3= CS0 + 16 ,ds3= CS0 + 24.
也就是我们可以通过任意一个段描述符下标反推出其他段描述符下标。
我们可以利用windbg验证win32系统是否按照如此规定。
在这里插入图片描述
上图编号是16进制。

0008 00000000 ffffffff Code RE Ac 0 Bg Pg P  Nl 00000c9b
0010 00000000 ffffffff Data RW Ac 0 Bg Pg P  Nl 00000c93
0018 00000000 ffffffff Code RE Ac 3 Bg Pg P  Nl 00000cfb
0020 00000000 ffffffff Data RW Ac 3 Bg Pg P  Nl 00000cf3

第一个序号0x8是cs0,第二个序号是ds0 也就是 0x8+0x8=0x10.往后递推。

sysenter 调用约定

调用sysenter 前需要准备给以下寄存器准备数据
IA32_SYSENTER_CS (MSR address 174H) 存储跳转到ring0 的cs段描述符下标
IA32_SYSENTER_EIP (MSR address 176H) 存储跳转 ring0 的eip
IA32_SYSENTER_ESP (MSR address 175H) 存储跳转 ring0 的ESP

当调用SYSEXIT 时需要提前填充如下数据
edx 存储返回到ring3 EIP
ecx 存储返回到ring3 ESP

上述便是intel中的一些规范,在windwow中在这个基础做了一层封装。

window 封装sysenter

windowsysenter 构建了一个复杂的数据结构(内部包含函数地址表,参数数量表),所有在sysenter 会首先统一跳转到相同内核处理函数,在跳转前需要将参数提前压入栈中以及调用的函数下标以及服务表数组下标放入eax。内核分发函数首先会读取eax服务表下标,然后读取服务表的下标,然后从这表中( 系统服务描述表(system service descriptor table))根据eax传入的函数下标取出函数地址,以及对应的参数数量,然后拷贝ring3 栈参数到ring0 在执行跳转。

首先需要知道的知识:
window服务表数组,当前有两个数组我们分别取名为KeServiceDescriptorTable,KeServiceDescriptorTableShadow,数组长度上限大小为4。
KeServiceDescriptorTable内部包含非ui内核函数,当前这个数组元素数量只有1个。
KeServiceDescriptorTableShadow包含了ui内核函数和非ui函数,当前元素元素数量只有2个且其中一个元素和KeServiceDescriptorTable相同。

类似结构如下

typedef struct _SYSTEM_SERVICE_TABLE
{
	PVOID ServiceTableBase; //这个指向系统服务函数地址表
	PULONG ServiceCounterTableBase;
	ULONG NumberOfService; //服务函数的个数
	ULONG ParamTableBase;
}SYSTEM_SERVICE_TABLE,*PSYSTEM_SERVICE_TABLE;

typedef struct _SERVICE_DESCRIPTOR_TABLE
{
	SYSTEM_SERVICE_TABLE ntoskrnel; //ntoskrnl.exe的服务函数
	SYSTEM_SERVICE_TABLE win32k; //win32k.sys的服务函数,(gdi.dll/user.dll的内核支持)
	SYSTEM_SERVICE_TABLE NotUsed1;
	SYSTEM_SERVICE_TABLE NotUsed2;
}SYSTEM_DESCRIPTOR_TABLE,*PSYSTEM_DESCRIPTOR_TABLE;

 SYSTEM_DESCRIPTOR_TABLE KeServiceDescriptorTable = { ntoskrnel=itemAddr };
 SYSTEM_DESCRIPTOR_TABLE KeServiceDescriptorTableShadow = { itemAddr,itemAddr2 };

当然需要注意的是KeServiceDescriptorTable 是一个被ntoskrnel导出的变量(KeServiceDescriptorTableShadow并没有在win32k.sys导出)
在这里插入图片描述
所以你可以在代码中直接使用类似如下的代码直接找到地址

    extern SYSTEM_DESCRIPTOR_TABLE KeServiceDescriptorTable;

关于如何获取另一个表可参阅:
Windows下如何获得KeServiceDescriptorTableShadow地址

我们用windbg验证我们的想法
在这里插入图片描述
我们查看这个两个数据结构第一个地址的存储的函数地址

在这里插入图片描述
你会发现当前进程对应的ui函数地址都是空的,是因为当前进程是没有ui的只有KeServiceDescriptorTable表,因此第二个选项地址无法查询。
我们可以切换到一个有ui进程的程序上

在这里插入图片描述

传入eax规范:
eax会传入两个参数,服务表的下标,以及函数下标:
在这里插入图片描述
图片从转载

bits 0-11: the system service number (SSN) to be invoked.(译 被调用所在服务表的函数下标)
bits 12-13: the service descriptor table (SDT).(译 服务表下标)
bits 14-31: not used. (未使用)

查看一个记事本的案例:
我们断点一个记事本ntdll.dll的createFile函数在这里插入图片描述
在这里插入图片描述

ntdll!NtCreateFile:
# 赋值对应的函数下标 和服务表
77313820 mov     eax,16Eh
77313825 call    ntdll!NtCreateFile+0xd (7731382d)
7731382a ret     2Ch

7731382d mov   edx,esp 
7731382f sysenter # 这行运行完成后跳转到7731382a 

首先我们先分析 eax的数值
在这里插入图片描述
从上面可以得知这个函数会调用最原始非UI的函数表,下标为0x16。

call ntdll!NtCreateFile+0xd目的为了作为一个桩代码,存储返回地址7731382a到栈中,而后在内核中可以轻易读取到返回地址方便调用SYSEXIT 读取ring 3返回地址。

77313825 call  ntdll!NtCreateFile+0xd
//存储到edx寄存器中,方便内核读取ring 3 读取到栈区地址
7731382d mov edx,esp

当我们运行到7731382f代码时,一些寄存器堆栈数据

7731382f sysenter
msr寄存器:
msr[174] = 00000000`00000008
msr[175] = 00000000`89f7d000
msr[176] = 00000000`8234ba50

寄存器:
edx = 03d7f614
esp = 03d7f614
ebp = 03d7f6e0

栈区信息:
03d7f614  7731382a 74696b04 03d7f664 80100080
03d7f624  03d7f6a8 03d7f674 00000000 00000000
03d7f634  00000000 00000001 00000040 00000000
03d7f644  00000000 03d7f808 03d7f850 000004e8
03d7f654  00000000 00000040 00000000 00000001
03d7f664  000001bc 80100080 00000000 00000000
03d7f674  00000384 0000038c 00000000 00120010
03d7f684  03fad9f0 03fad9f0 00000000 00000000

然后我们在执行sysenter后跳转到msr[176] 地址,这个是一个内核地址
在执行windbgt命令,不会跳转到内核,而是到7731382a ret 2Ch

这个函数会跳入内核nt!KiFastCallEntry函数。

这个函数分析不想写了。。。。网上有


参考命令


//寻找内核的notepad程序
!process 0 0

//切换到notepad程序
.process /r /p b060d780

//下断点
bp ntdll!NtCreateFile

//条件断点
bp 773e3825  ".if (@eax & 0x0`ffffffff) = 0x0`16E  { r eax} .else {gc}"

参考

操作系统 实验2 windbg双机调试+系统调用过程

System_Service_Descriptor_Table

wiki Model-specific_register

rdmsr–read-msr-

osdev SYSENTER

sysenter

System Service Descriptor Table - SSDT

静态分析nt!KiFastCallEntry

x86 CPU的MSR寄存器

hooking-system-service-dispatch-table-ssdt

HOOK SSDT

系统调用篇——SSDT

What is REX prefix in Instruction Encoding?

Model_Specific_Registers

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/176822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

轻量实时操作系统学习(一)

306xH系列产品基于高性能RISC-V CPU核,工作频率最高到200MHz,集成了FPU浮点处理单元,支持浮点乘法,支持浮点乘法,除法和开方等复杂数学运算指令,支持16KB的SRAM和最高160KB的flash存储单元。 该MCU集成最多…

【My Electronic Notes系列——二极管】

目录 序言: 🏮🏮新年的钟声响,新年的脚步迈,祝新年的钟声,敲响你心中快乐的音符,幸运与平安,如春天的脚步紧紧相随,春节快乐!春华秋实,我永远与…

【目标检测论文解读复现NO.25】基于改进Yolov5的地铁隧道附属设施与衬砌表观病害检测方法

前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

【Unity Shader 赛博小人01】UV准备 SD制作特效贴图

写在前面 Unity 卡通渲染 程序化天空盒提到了——“再整个uv1将云片平铺,将uv1对应到世界坐标x轴旋转角、y轴旋转角,消散信息放到顶点色。”,就是这句话!我又遇到了几个问题(本菜鸡不知道的东西太多太多了&#xff09…

Spring的使用

开篇点题:为什么要用到Spring?参考这篇文章:http://t.csdn.cn/oR5lM一、创建一个Maven项目1.创建一个Maven项目2.添加Spring依赖/框架支持在pom.xml中添加框架的支持,xml配置如下:(下载失败参考&#xff1a…

设计模式_自定义Spring框架(IOC)

设计模式_自定义Spring框架(IOC) 笔记整理自 黑马程序员Java设计模式详解, 23种Java设计模式(图解框架源码分析实战) Spring使用回顾 自定义spring 框架前,先回顾一下 Spring 框架的使用,从而分…

acwing基础课——快速幂

由数据范围反推算法复杂度以及算法内容 - AcWing 常用代码模板4——数学知识 - AcWing 基本思想: 求一个数的n次时,我们的时间复杂度为O(n),当n特别大时,效率会很低可能超时,此时我们就需要运用到快速幂,将我们的时间…

基于PHP和MySQL的新闻发布系统——【功能优化】

前言 2023年第一篇文章,祝大家在新的一年里“卯”足干劲,在技术上 “兔”飞猛进! 上一篇文章 基于PHP和MySQL的新闻发布系统 给大家介绍了制作一个新闻发布系统的主要功能的实现,在文章的末尾还提出了一些需要完善的方面。那么…

Vue3【style-scoped、style-module、类和内联样式、props、练习】

文章目录style-scopedstyle-module类和内联样式props练习style-scoped 可以直接通过style标签来编写样式, 如果直接通过style标签写样式,此时编写的样式是全局样式会影响到所有的组件 可以为style标签添加一个scoped属性,这样样式将成为局部…

为什么会有右值引用?(移动构造、移动赋值)

目录 1、左值引用的缺陷 2、移动构造:解决临时对象的深拷贝 3、拓展:移动赋值 1、左值引用的缺陷 左值引用作为函数参数传递,减少了参数拷贝;但是作为函数返回值,并不适用于所有场景,比如要返回一个临…

Linux——innode

目录 回顾缓冲区 标准错误流的理解 文件系统 Inode VS 文件名 创建/删除/查看文件系统做了什么 软硬链接 动静态库 习题 回顾缓冲区 关掉1,log.txt中没文件是因为,字符串在缓冲区当中,缓冲区还没刷新,我们把fd给关了…

堆的实现及应用

下面用C语言介绍堆的实现以及应用 文章目录1. 堆的简介2. 堆的实现HeapInitHeapDestroyHeapPushHeapPop3. 堆的应用堆排序TopK问题1. 堆的简介 堆是一颗完全二叉树。这里所说的堆是一种非连续的数据结构,与操作系统内存分布的堆是两回事,它们没有任何联…

金融帝国实验室(Capitalism Lab)官方中文汉化包下载(v4.03)

<FCT汉化小组>Vol.001号作品 ————————————— ◎作品名称&#xff1a;金融帝国实验室&#xff08;CapLab&#xff09;官方汉化包 ◎汉化作者&#xff1a;FCT汉化小组&#xff08;Enlight Software认证&#xff09; ◎发布版本&#xff1a;CapLab Simplifi…

POJ 1845 Sumdiv题解(C++ 整数惟一分解定理+分治法求等比数列之和+快速幂)

文章目录整数惟一分解定理分治法求等比数列和完整代码传送门&#xff1a; POJ 1845 SumDiv 整数惟一分解定理 任何一个大于1的整数n都可以分解成若干个质因数&#xff08;素因数&#xff09;的连乘积&#xff0c;如果不计各个素因数的顺序&#xff0c;那么这种分解是唯一的&a…

王者荣耀入门技能树

前言 最近在学习技能树&#xff0c;我也试着写一写技能树&#xff0c;放松一下。 这里附上一张可爱的兔兔应景。仔细看&#xff0c;后边题目会提到&#xff0c;哈哈。 职业 以下哪个不属于王者荣耀中的职业&#xff1a; 射手法师辅助亚瑟 技能 以下哪个技能可以加快打野…

春节假期后,如何快速让员工恢复上班的元气和状态?

每当假期过后&#xff0c;总有一些员工无法快速恢复工作状态&#xff0c;团队的氛围也很难一下子热起来。而春节假期既是长假&#xff0c;又是过节氛围最浓厚的假期&#xff0c;节后返工的涣散问题自然更明显一些。但对于服装店铺来说&#xff0c;年后开工正处于旺季&#xff0…

【Vue】我的尚品汇项目笔记---20230109~20230120

014之前可参考官方笔记 https://blog.csdn.net/weixin_43424325/article/details/121684101 015-axios二次封装 api/index.js 设定 //当前模块&#xff0c;API进行统一管理&#xff0c;即对请求接口统一管理 import requests from "/api/request";//首页三级分类…

通达信插件获取并存储通达信商品指数的实时数据

一、引子 通达信商品指数一共有23个&#xff0c;如下图所示&#xff1a; 如果想获取历史数据&#xff0c;只需要通过通达信的数据下载和导出功能即可&#xff0c;现在我们需要获取这23个指数的实时数据&#xff0c;通过导出功能就没有办法了。 在最初的阶段&#xff0c;考虑的…

微服务自动化管理【IDEA使用Docker插件进行一键部署】

本章目标 IDEA使用Docker插件实现springboot项目的一键部署 要开两个虚拟机 server registry server上进行操作 Docker开启远程api端口(注意这种配置方式只适用于开发和学习&#xff0c;在公共网络中不要这样配置&#xff0c;容易引发安全问题) 默认情况下dokcer是不支持远程…

linux基本功系列之find命令实战

文章目录前言&#x1f680;&#x1f680;&#x1f680;一. find命令介绍二. find常用参数及语法格式三. 示范案例3.1 查找符合文件名规则的文件3.2 根据文件类型类查找文件3.3 按照更改时间或访问时间等查找文件3.4 查找并执行相应的命令3.5 按照文件大小来查找3.6 按照文件所有…