2.5 windows xp,ReactOS系统快速系统调用的实现
windows xp,ReactOS系统快速系统调用的实现
windows xp,ReactOS系统快速系统调用的实现
文章目录
- **windows xp,ReactOS系统快速系统调用的实现**
- 快速系统调用
- 进入R0
- 我们看MSR寄存器中的内容到底是啥子
- 快速系统调用返回
- PspLookupKernelUserEntryPoints(VOID)
快速系统调用
从奔腾2开始就增设了两条指令和三个寄存器来支持“快速系统调用”sysenter,sysexit指令,MSR寄存器,这样就实现比较轻便和搞笑的系统调用
在快速系统调用时,用户空间的“int 0x2e"自陷指令大体上为一条sysenter指令锁替代,但是sysenter指令不同于int 指令或者call指令。sysexit指令也不同于iret,ret指令,这两条指令并不涉及 到堆栈的操作。而是依赖一组MSR寄存器。
进入R0
当执行sysenter指令时,CPU进入R0,并且:
1,把寄存器SYSTEMER_CS_MSR的内容复制到段寄存器CS中。
2,把寄存器SYSTEMER_EIP_MSR的内容复制到段寄存器EIP中。
3,把(寄存器SYSTEMER_CS_MSR的内容+8)复制到段寄存器SS中。
4,把寄存器SYSTEMER_ESP_MSR的内容复制到段寄存器ESP中。
这样,只要预先设置好三个MSR寄存器的内容,cpu在指向sysenter指令病会进入R0,并预定的地址开始执行程序, 同时开始使用系统空间的堆栈,而不像通过自陷指令进入系统空间那样要执行那么多的操作,效率提高了。
但是此时CPU不想在执行子限制了时那样自动把用户空间的堆栈指针保存在系统空间堆栈上,甚至也不讲返回地址压入堆栈,所有如果需要就要有对象的程序来完成操作。尽管如此,快速系统调用的效率还是要搞很多,因为至少不需要从中断向量表获取程序入口的位置了。
我们看MSR寄存器中的内容到底是啥子
ULONG_PTR
NTAPI
KiLoadFastSyscallMachineSpecificRegisters(IN ULONG_PTR Context)
{/* Set CS and ESP */Ke386Wrmsr(0x174, KGDT_R0_CODE, 0);Ke386Wrmsr(0x175, (ULONG)KeGetCurrentPrcb()->DpcStack, 0);/* Set LSTAR */Ke386Wrmsr(0x176, (ULONG)KiFastCallEntry, 0);return 0;
}
其中:
#define KGDT_R0_CODE 0x8
```c
这里可以看出他是一个常量
这里调用了三次Ke386Wrmsr()
#define Ke386Wrmsr(msr,val1,val2) __asm__ __volatile__("wrmsr" : /* no outputs */ : "c" (msr), "a" (val1), "d" (val2))
实际上就是特权指令wrmsr的封装,
第一个参数时目标MSR寄存器的编号。显然这三个端口粉笔为0x174,0x175,x0176
MSR寄存器时64位的,但这三个寄存器时都是32位的,所以第三个参数都为0,
第一次调用把cs设置位8,
第二次用KeGetCurrentPrcb函数获取。
第三次调用指向快速调用的入口地址。这里通过KiFastCallEntry函数获取
快速系统调用返回
与KiFastSystemCall()一样,这是有ntdll.dll导出的一个函数。内核在初始化通过PspLookupKernelUserEntryPoints(VOID)获取ntdll.dll中这两个函数的入口,并将其保存在一个数据结构SharedUserData中,之所以说Shared,是因为其所在的物理页面在系统空间和用户空间都有映射,因此从内核和用户空间都能访问这个数据结构,只是所有的虚拟地址不同
PspLookupKernelUserEntryPoints(VOID)
NTSTATUS
NTAPI
PspLookupKernelUserEntryPoints(VOID)
{NTSTATUS Status;/* Get user-mode APC trampoline */Status = PspLookupSystemDllEntryPoint("KiUserApcDispatcher",&KeUserApcDispatcher);if (!NT_SUCCESS(Status)) return Status;/* Get user-mode exception dispatcher */Status = PspLookupSystemDllEntryPoint("KiUserExceptionDispatcher",&KeUserExceptionDispatcher);if (!NT_SUCCESS(Status)) return Status;/* Get user-mode callback dispatcher */Status = PspLookupSystemDllEntryPoint("KiUserCallbackDispatcher",&KeUserCallbackDispatcher);if (!NT_SUCCESS(Status)) return Status;/* Get user-mode exception raise trampoline */Status = PspLookupSystemDllEntryPoint("KiRaiseUserExceptionDispatcher",&KeRaiseUserExceptionDispatcher);if (!NT_SUCCESS(Status)) return Status;/* Check if this is a machine that supports SYSENTER */if (KeFeatureBits & KF_FAST_SYSCALL){/* Get user-mode sysenter stub */Status = PspLookupSystemDllEntryPoint("KiFastSystemCall",(PVOID)&SharedUserData->SystemCall);if (!NT_SUCCESS(Status)) return Status;/* Get user-mode sysenter return stub */Status = PspLookupSystemDllEntryPoint("KiFastSystemCallRet",(PVOID)&SharedUserData->SystemCallReturn);}else{/* Get the user-mode interrupt stub */Status = PspLookupSystemDllEntryPoint("KiIntSystemCall",(PVOID)&SharedUserData->SystemCall);}/* Set the test instruction */if (!NT_SUCCESS(Status)) SharedUserData->TestRetInstruction = 0xC3;/* Return the status */return Status;
}
这样需要从快速系统调用返回时,只需要从这个数据结构获取目标地址就行了。至于堆栈指针,则显然是保存在寄存器edx中。
当CPU执行sysexit指令时,则返回用户态。并且:
1,把CS设置成(SYSENTER_CS_MSR的内容+16),这实际上是KGDT_R3_CODE,注意:CS中的RPL位段自动设置为3,三环
2,把寄存器EDX的内容复制到EIP.
3,把SS设置成(SYSTENTER_CS_MSR的内容+24),这实际上是KGDT_R3_DATA注意:SS中的RPL位段自动设置为3
4,把寄存器ECX的内容复制到ESP
九十四,只需要ECX持有用户空间的堆栈指针,并把SharedUserData->SystemCallReturn之于EDX,在执行sysexit就可以了。 可见。sysenter,sysexit的组合,再加上三个MSR寄存器的作用,实现了一种十分简便的快速系统调用和返回机制,相比之下int,iret的组合显得太复杂了。
相关文章:
2.5 windows xp,ReactOS系统快速系统调用的实现
windows xp,ReactOS系统快速系统调用的实现 windows xp,ReactOS系统快速系统调用的实现 文章目录 **windows xp,ReactOS系统快速系统调用的实现**快速系统调用进入R0我们看MSR寄存器中的内容到底是啥子快速系统调用返回PspLookupKernelUserE…...
AI助力广交会,人工智能在制造业有哪些应用场景?
随着科技的飞速发展,人工智能(AI)正以前所未有的速度渗透到传统制造业中,为中国传统制造业注入了新的活力与变革,也为中国外贸的持续增长增添了更多底气。 在10月15日—19日举办的第136届中国进出口商品交易会上&…...
ElementPlus-Table表格-单选--TypeScript进阶篇
今天看个例子,这个例子是ElementPlus的组件Table表格下面的单选 <template> <el-table ref"singleTableRef" :data"tableData" highlight-current-row style"width: 100%" current-change"hand…...
三大智能体平台深度对比:字节Coze、百度AppBuilder、智谱智能体优劣解析
字节Coze智能体是一个多功能平台,具备丰富的功能和技能扩展能力。以下是它的一些核心功能和特性: 功能与技能 1. 插件功能 Coze智能体可以通过插件调用外部API,扩展智能体的能力。例如,它可以执行以下操作: 搜索信…...
【Flutter】基础入门:自定义Widget
在 Flutter 开发中,除了使用丰富的内置 Widgets 构建界面外,自定义 Widget 是让你的应用更灵活和个性化的重要手段。Flutter 允许你根据需求自定义 StatelessWidget 和 StatefulWidget,以实现复杂的 UI 组件或功能模块。 本教程将通过实例讲…...
程序员日志之DNF手游装备武器升级55级攻略
目录 传送门正文日志1、概要2、布甲3、皮甲4、轻甲5、重甲6、板甲7、武器 传送门 SpringMVC的源码解析(精品) Spring6的源码解析(精品) SpringBoot3框架(精品) MyBatis框架(精品) M…...
Java项目-基于springcloud框架的分布式架构网上商城系统项目实战(附源码+文档)
作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…...
ComfyUI_LayerStyle节点介绍
✨原作者地址 ComfyUI_LayerStyle是一个很强大的节点组,支持了大量图像处理的基础节点。这篇是简单搬运和翻译原作者的内容,方便大家更方便快速的了解这个节点的价值。 https://github.com/chflame163/ComfyUI_LayerStyle ✨节点描述 节点根据功能分…...
SQL Injection | SQL 注入 —— 时间盲注
关注这个漏洞的其他相关笔记:SQL 注入漏洞 - 学习手册-CSDN博客 0x01:时间盲注 —— 理论篇 时间盲注(Time-Based Blind SQL Injection)是一种常见的 SQL 注入技术,适用于那些页面不会返回错误信息,只会回…...
最新开发项目H5商城小程序源码系统 带源代码安装包以及搭建部署教程
系统概述 在当今数字化迅猛发展的时代,电子商务已成为企业拓展市场、提升品牌影响力的重要手段。H5商城小程序作为一种跨平台、轻量级的应用形式,凭借其无需下载安装、即用即走的特性,迅速赢得了广大用户的青睐。为了满足企业对高质量H5商城…...
5大绝招揭秘:Cursor如何让RESTful API开发效率提升300%?
5大绝招揭秘:Cursor如何让RESTful API开发效率提升300%? 在当今快速迭代的软件开发世界中,高效构建RESTful API已成为开发者的必备技能。今天,我们将为大家介绍一款强大的AI辅助工具——Cursor,它能让您的API开发事半功倍。 Cursor Compos…...
鸿蒙开发,在 ArkTS 中,如何使用 Column 实现垂直居中对齐
面向万物互联时代,华为提出了“一次开发多端部署、可分可合自由流转、统一生态原生智能”三大应用与服务开发理念。针对多设备、多入口、服务可分可合等特性,华为提供了多种能力协助开发者降低开发门槛。HarmonyOS基于JS/TS语言体系,构建了全…...
红日安全vulnstack (一)
目录 环境搭建 本机双网卡 Kali IP 靶机IP Web GetShell 前期信息收集 Yxcms后台模板 Getshell PHPMyAdmin日志 Getshell into outfile写入一句话 X phpmyadmin 日志写入一句话 后渗透 MSF 生成木马上线 提取用户hash值 **hash**加密方式 MSF权限Shell至CS CS …...
为什么SSH协议是安全的?
SSH的传输层协议(Transport Layer Protocol)和用户鉴权协议(Authentication Protocol)确保数据的传输安全,这里只介绍传输层协议,是SSH协议的基础。 本文针对SSH2协议。 1、客户端连接服务器 服务器默认…...
主键 外键
主键 外键 在关系型数据库中,主键(Primary Key)和外键(Foreign Key)是用于维护数据完整性和建立表之间关系的重要概念。 主键(Primary Key) 定义: 主键是一个或多个列的组合,其值能…...
G - Road Blocked 2
G - Road Blocked 2 思路 只有当一条边是从 1 1 1到 n n n的所有最短路构成的图的桥时,去掉这条边,最短路才会变大 所以就可以用最短路加tarjan解决这道题了 怎么判断一条边是否可以构成最短路呢,比如求 1 1 1到 n n n的最短路࿰…...
R语言绘制Venn图(文氏图、温氏图、维恩图、范氏图、韦恩图)
Venn图,又称文氏图,标题中其他名字也是它的别称,由封闭圆形组成,代表不同集合。圆形重叠部分表示集合交集,非重叠处为独有元素。在生物学、统计学等领域广泛应用,可展示不同数据集相似性与差异,…...
【Vue.js】vue2 项目在 Vscode 中使用 Ctrl + 鼠标左键跳转 @ 别名导入的 js 文件和 .vue 文件
js 文件跳转 需要安装插件 Vetur 然后需要我们在项目根目录下添加 jsconfig.json 配置,至于配置的作用,可以参考我的另外一篇博客: 【React 】react 创建项目配置 jsconfig.json 的作用 它主要用于配置 JavaScript 或 TypeScript 项目的根…...
NVM配置与Vue3+Vite项目快速搭建指南
本文目录 1、配置环境1.1 NVM1、nvm常用命令 1.2 Mac配置环境1、安装nvm 1.3 Window配置环境1、安装nvm 2、 项目搭建2.1 项目依赖2.2 安装依赖2.3 配置1、别名配置2、创建样式及图片文件夹3、路由 2.4 项目搭建效果2.5 项目结构 在当今快速发展的前端技术领域中,掌…...
面试“利器“——微学时光
大家好,我是程序员阿药。微学时光是一款专为计算机专业学生和IT行业求职者设计的面试刷题小程序,它汇集了丰富的计算机面试题和知识点,旨在帮助用户随时随地学习和复习,提高自身的技术能力和面试技巧。 主题 随时随地学习&#x…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
