系统调用

进程 ——> 调用OS API;OS进程管理 ——> 调配进程。

仅从用户进程角度,OS就像是一个被动响应的运行时库。Windows提供了一个系统调用界面作为外层,即Win32API;Linux的CRuntime库标准,Windows也支持。用户进程通过调用这些OS接口,可以部分操作系统内核。

硬件] 设备驱动] 核心层] 管理层] 系统服务界面,中断入口(不公开)] 系统DLL(公开)] ——>API

用户进程没有调用内核函数(特权指令)的权限,只有调用API,通过API函数内的“自陷中断”进入“系统态”调用系统函数。或者是“异常中断”出错进入OS运行。

Win32API{
    __asm{
      push  ebp                     KiSystemService()
      mov  eax,  151  //系统函数号           {  中断,保护CPU环境,进入系统态
      lea    edx, 9[ebp] //用户区参数栈地址         copy栈参数块到系统内存
      int    0x2e  //中断id,进入IDT表对应函数 ——>    执行eax寄存器里的id调用函数
      pop  ebp                       返回结果,copy回用户区
      ret   10  //返回结果参数,9+1           关中断,基本是开头的逆操作                  }
    }

} //如果用户参数少,可以直接在寄存器中传,用户指定fastcall方式
  
    除外部IO外,自陷和异常也是IDT表中的中断项(255个,外设中断预留100个左右),自陷中断有:
  int  0x3 (2c\ 2d)   KiTrap3() ,DEBUG调试用
    0x2e     KiSystemService() ,系统函数调用
    0x2b   内核可以调用用户空间的子程序,子程序执行完再返回内核,就用这个中断
    0x2a   获取精确CPU时间,轻型调用,普通中断开销大,无法取到精确的时间

通常的特权指令调用都通过KiSystemService() ,通过系统函数调用号id跳转到函数地址上。Windows核心和Liunx类似,有200多个核心函数,但MS又把视窗界面函数也移入内核中。

另外:不同的用户进程,有各自的系统堆栈空间,供其调用的内核函数使用(是彼此独立的)。

windows内核情景分析--系统调用

Windows的地址空间分用户模式与内核模式,低2GB的部分叫用户模式,高2G的部分叫内核模式,位于用户空间的代码不能访问内核空间,位于内核空间的代码却可以访问用户空间

一个线程的运行状态分内核态与用户态,当指令位于用户空间时,就表示当前处于内核态,当指令位于内核空间时,就处于内核态.

一个线程由用户态进入内核态的途径有3种典型的方式:

1、 主动通过int 2e(软中断自陷方式)或sysenter指令(快速系统调用方式)调用系统服务函数,主动进入内核
2、 发生异常,被迫进入内核
3、 发生硬件中断,被迫进入内核

现在讨论第一种进入内核的方式:(又分为两种方式)
1、 通过老式的int 2e指令方式调用系统服务(因为老式cpu没提供sysenter指令)

如ReadFile函数调用系统服务函数NtReadFile
Kernel32.ReadFile()  //点号前面表示该函数的所在模块
{
//所有Win32 API通过NTDLL中的系统服务存根函数调用系统服务进入内核
NTDLL.NtReadFile();
}

NTDLL.NtReadFile()
{
   Mov eax,152   //我们要调用的系统服务函数号,也即SSDT表中的索引,记录在eax中
   If(cpu不支持sysenter指令)
   {
      Lea edx,[esp+4] //用户空间中的参数区基地址,记录在edx中
      Int 2e  //通过该自陷指令方式进入KiSystemService,‘调用’对应的系统服务
   }
   Else
   {
      Lea edx,[esp +4] //用户空间中的参数区基地址,记录在edx中
      Sysenter //通过sysenter方式进入KiFastCallEntry,‘调用’对应的系统服务
   }
   Ret 36 //不管是从int 2e方式还是sysenter方式,系统调用都会返回到此条指令处
}

Int 2e的内部实现原理:
该指令是一条自陷指令,执行该条指令后,cpu会自动将当前线程的当前栈切换为本线程的内核栈(栈分用户栈、内核栈),保存中断现场,也即那5个寄存器。然后从该cpu的中断描述符表(简称IDT)中找到这个2e中断号对应的函数(也即中断服务例程,简称ISR),jmp 到对应的isr处继续执行,此时这个ISR本身就处于内核空间了,当前线程就进入内核空间了

Int 2e指令可以把它理解为intel提供的一个内部函数,它内部所做的工作如下
Int 2e
{
   Cli  //cpu一中断,立马自动关中断
   Mov esp, TSS.内核栈地址 //切换为内核栈,TSS中记录了当前线程的内核栈地址
   Push SS
   Push esp
   Push eflags
   Push cs
Push eip  //这5项工作保存了中断现场【标志、ip、esp】
Jmp  IDT[中断号]  //跳转到对应本中断号的isr
}

明白了IDT,就可以看到0x2e号中断的isr为KiSystemService,顾名思义,这个中断号专用于提供系统服务。

https://www.cnblogs.com/jadeshu/articles/10663613.html

利用Windbg初步解析系统调用
https://cloud.tencent.com/developer/news/240246

Windbg初步解析系统调用

其实我以前没怎么用过,编程的时候很少调试,即便调试也是依赖编译器的调试。

最近要解析系统调用,解析的时候出了点问题,没有办法解析到NtReadFile系统调用中读的内容。这事儿很奇怪,其他的系统调用都可以解析到,这个就不行。

于是,我写了一个简单的读文件程序进行测试。代码如下

代码很简单,就不说了。64位debug模式下编译通过后,用windbg打开,

设置断点:bu ntdll!ZwReadFile

执行g命令,开始运行

连续按F10执行到syscall完成

R命令查看寄存器值

dq rsp+0x30得到buffer地址

da [buffer地址] 就可以看到buffer的内容了。如下所示,内容很简单,是“1 2 3 4 5 6 7 8 9 0”,和我在hello.txt中写入的一样。

Windows内核系统调用分析相关推荐

  1. windows 内核情景分析

    原文很长:先转部分过来,有时间看一下: 一 windows 内核情景分析---说明 说明 本文结合<Windows内核情景分析>(毛德操著).<软件调试>(张银奎著).< ...

  2. Gloomy对Windows内核的分析(对象管理器)

    Gloomy对Windows内核的分析(对象管理器) 目录 Inside WINDOWS NT Object Manager 00."对象化的" Windows NT 01.Win ...

  3. Gloomy对Windows内核的分析

    /Files/ddlzq/Gloomy对Windows内核的分析.pdf 转载于:https://www.cnblogs.com/ddlzq/archive/2010/09/03/1817244.ht ...

  4. [转贴]Gloomy对Windows内核的分析(研究CreateProcess)

                          (转载)Gloomy对Windows内核的分析(研究CreateProcess) 我给出一个反汇编Win32 API函数CreateProcess的例子,来 ...

  5. [14]Windows内核情景分析 --- 文件系统

    文件系统 一台机器上可以安装很多物理介质来存放资料(如磁盘.光盘.软盘.U盘等).各种物理介质千差万别,都配备有各自的驱动程序,为了统一地访问这些物理介质,windows设计了文件系统机制.应用程序要 ...

  6. windows内核情景分析 --- 文件系统

    文件系统 一台机器上可以安装很多物理介质来存放资料(如磁盘.光盘.软盘.U盘等).各种物理介质千差万别,都配备有各自的驱动程序,为了统一地访问这些物理介质,windows设计了文件系统机制.应用程序要 ...

  7. Windows内核情景分析-概述

    现在的Windows 现在的windows内核包含了两大部分,一部分是本来意面上的操作系统内核,另一部分则是移到了内核中的视窗服务,前者对应ntoskrnl.exe后者win32k.sys:后者部分为 ...

  8. windows内核情景分析读书笔记-----HYPERSPACE

    主要介绍HYPERSPACE的创建映射函数 赏光看我这一系列文章的朋友最好结合毛德操老师的书来看,具体的细节我这里就不阐述了 简单说下这个函数功能 Windows内核有时候需要把某些物理页面临时映射到 ...

  9. Gloomy对Windows内核的分析(内核反汇编技术)

    内核反汇编技术 =============================== Windows  NT主要是由C写成的,所以总的来说进程本身的反汇编不是很复杂.通常对局部变 量和参数的使用是通过地址和 ...

最新文章

  1. 数据库连接工具HeidiSql介绍(支持MySQL,MariaDB,Microsoft SQL或PostgreSQL)
  2. SpringBoot 使用(三): 配置文件详解
  3. 安卓模拟器运行python_利用python+Appium 之 如何在设备(模拟器)上自动安装并启动APP...
  4. Subsequence Hate CodeForces - 1363B(前缀和+dp)
  5. Linux ps aux查看进程
  6. 【VIJOS - P1037】搭建双塔(dp)
  7. 新版vue-cli搭建多页面应用
  8. prompt不生效之解决
  9. 【题解】【A % B Problem(P1865)】-C++
  10. codeforces 768 C. Jon Snow and his Favourite Number(思维+暴力)
  11. Go 关键字 Select
  12. 《PMBOK第六版》章节知识点
  13. 计算机分析桁架受力,结构力学教学中桁架的概念分析与实践
  14. 看拉扎维《模拟CMOS集成电路设计》的一些总结和思考(八)——反馈
  15. skimage图像加噪声
  16. dw怎么在框架中加入网页_DW中制作框架网页.ppt
  17. Linux关闭swap
  18. 计算机中c语言的应用特点,计算机中C语言的应用特点分析
  19. vue2与vue3的实例销毁,有什么区别。
  20. 51单片机实现用一个定时器输出可调PWM

热门文章

  1. 破解32位NT6内核系统(vista/win7 8G以上)的内存限制,完美支持4GB至128GB内存,全新教程!
  2. 复旦计算机考研19年录取线,2019年复旦大学考研复试分数线已公布
  3. web静态资源访问规则||webjars的访问配置——webjars是maven库里面对css js image打的一个jar包
  4. python的函数的定义与调用
  5. Python 技术篇-如何打印一段文字,用友云霸气控制台颜文字打印
  6. C# 学习笔记(17)操作SQL Server 上
  7. poj 3579 Median 中间值(二分搜索)
  8. HuMoments函数
  9. Tensorflow学习教程集合
  10. ssm的报错问题------You must configure either the server or JDBC driver (via the serverTimezone conf)