2.6.ReactOS系统中从内核中发起系统调用

ops/2024/10/24 20:33:23/

ReactOS_0">2.6.ReactOS系统中从内核中发起系统调用

2.6.ReactOS系统中从内核中发起系统调用

文章目录


前言

上面我们已经可以看到用户空间(R3)进行系统调用的全过程即两种方法的具体实现。

系统调用一般时从R3发起的。其实window也运行从内核进行系统调用,不过,一般而言在内核里面不能直接调用NtReadFile()一类函数。这方面是因为windows内核并不导出这些函数。另一方面也是应为这些函数往往要求在系统空间队长上有一个属于本次调用的自陷框架,从而内核中直接调用这些函数时显然没有这么一个口昂加,诚然。既然CPU已经运行在内核中,系统空间堆栈上就已经有这样的框架了。 那可能时自陷框架,中断框架或者异常框架。但都不是味本次调用而形成的。所以内核中一般不能直接调用NtReadFile()一类的函数。这就是为什么在内核中只能通过ZwReadFile()一类函数进行系统调用的原因。那么ZwReadFile()时什么样的函数呢?下面有ReactOS中的代码:

__declspec(naked)__stdcall 
ZwReadFile(int dummy0,int dummy1,int dummy2)
{
asm{mov eax,151lea edx,[esp+4] 		//使EDX指向堆栈的参数块pushf					//EFLAGS	push KGDT_R0_CODE 		//CScall _KiSystemService ret 36					//9个参数}
}

这里中间函数调用KiSystemService(),在哪里构建堆栈上的系统调用框架,这点上与通过“int 0x2e"进入内核相似,但是此时当然无需保证用户空间的CS,SS,ESP等寄存器的映射。这样这里的EDX指向堆栈上的参数块。

到这里系统调用返回时,在TRAP_EPILOG末尾处有这么几条指令。

.if _SystemCall 
/*Check if previous CS is from user-mode*/
test dword ptr[esp+4],1
;it's,so ues Fast Exit
jnz FastExit //来自用户空间(R3)//jump back to stub 		//来自系统空间(R0)
pop edx  						//KiSystemService()的返回地址
pop ecx 						//KGDT_R0_CODE
popf 
jmp edx						//挑战到调用KiSystemService时的返回地址

对于来自R0的系统调用,这里 有4条指令实现返回,队长上面中间函数ZwReadFile()的代码,读者不难理解这4条指令的左右红。

类似ZwReadFile()中间函数有两百多个。ReactOS提供了生成这些函数的工具。以系统调用NtReadFile()为例子,这个工具根据sysfuncs.lst生成其用户空间的(R3)的中间函数NtReadFile()和内核版本的中间函数ZwReadFile()的代码,内核版本的中间函数ZwReadFile()的生成"模板为"

#define KernelModeStub_x86  "    asm { \n" \"        mov eax, %xh\n" \"        lea edx, [esp+4]\n" \"        pushf\n" \"        push KGDT_R0_CODE\n" \"        call _KiSystemService\n" \"        ret %xh\n" \"    }\n"

这里需要填入的参数只有两个,一个时系统调用号,另一个时调用参数的数量,课件这些中间函数的生成时很简单的。 到处这些中间函数而颖仓实际的系统调用函数。就为可能为逆向工程设置了障碍。


http://www.ppmy.cn/ops/128143.html

相关文章

基于netty实现简易版rpc服务-理论分析

1.技术要点 1.1 rpc协议 定义一个rpc协议类,用于rpc服务端和客户端数据交互。 1.2 netty粘包半包处理 由于数据传输使用tcp协议,rpc协议的数据在网络传输过程中会产生三种情况: 1)刚好是完整的一条rpc协议数据 2)不…

【随手笔记】远程升级之如何平衡下载包大小与速率?

1. 远程升级基本信息 使用NB_BC26模组,通过AT指令使用TCP的协议与公司后台交互升级的固件为BIN文件,使用原始固件包升级,未使用差分方式原始固件包有110K,大小左右,固件的存储为外置的FLASH W25Q16,w25q16最小存储单位为页&#…

基于SpringBoot+Vue+uniapp微信小程序的宿舍报修系统的详细设计和实现

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

HuggingFace应用——自然语言处理(1):什么是NLP?什么是Transformer?

本篇文章属于HuggingFace应用——自然语言处理系列本篇文章对自然语言处理任务进行基本介绍参考资料:HuggingFace 文章目录 1 什么是NLP?2 主流算法与模型梳理——时间顺序3 Transformer3.1 Transformer模型能做什么?Sentiment Analysis 语义…

计算广告第三版pdf

需要该书pdf版本的同学点赞,私信我:

Hallo 2:通过单张图像与音频生成1小时4K分辨率人像视频的人工智能技术解析

Hallo 2:通过单张图像与音频生成1小时4K分辨率人像视频的人工智能技术解析 近年来,随着人工智能技术的飞速发展,视频生成领域也在不断突破。特别是在虚拟主播、影视制作等行业中,如何高效地生成高质量人像视频已成为当下的热门话…

Linux命令(ubuntu)安装deb文件

Linux命令(ubuntu)安装deb文件 在Linux中,.deb 文件是 Debian 和基于 Debian 的系统(如 Ubuntu)使用的软件包格式。要安装 .deb 文件,您可以使用 dpkg 命令。以下是安装 .deb 文件的步骤: 打开…

Linux:sh脚本

文章目录 1 标头2 执行脚本文件3 数组4 传递参数5 运算符 && 分支语句6 循环语句6.1 for循环6.2 while循环6.3 until循环6.4 case语句 && read输入6.5 循环控制 7 函数8 文件、文件夹、字符串判断 && 示例 1 标头 #!/bin/sh指明了脚本中命令的解释器 …