API函数的调用过程

2023-10-26

API函数的调用过程(ring3)

Windows API

  1. Application Programing Interface (应用程序接口) 简称API函数

  2. Windows 有多少个API?
    主要是存放在C:\WINDOWS\system32下面所有的dll

  3. 几个重要的dll
    Kernel32.dll:最核心的功能模块,比如管理内存,进程和线程相关的函数等.

User32.dll:是Windows用户界面相关的应用程序接口,如创建窗口和发送消息等.

GDI32.dll全称是Graphical Device Interface(图形设备接口),包含用于画图和显示

Ntdll.dll:大多数API都会通过这个dll进入内核(0环)

绝大部分核心功能是在0环实现的,3环只是使用了0环提供给他的一个接口.

Kernel32.dll ->ReadProcessMemory

在C:\WINDOWS\system32\目录下找到kernel32.dll模块,放到IDA中 查看ReadProcessMemory的代码

在这里插入图片描述

我们看到在用户层的核心功能模块中的ReadProcessMemory函数再将参数压栈后,又调用了另一个模块的函数NtReadVirtualMemory

ReadProcessMemory:
ring3所做的事情:
在这里插入图片描述

接下来看看NtReadVirtualMemory函数 (ring 0)所做的事情

这时候再打开另一个ntdll.dll模块 查看其中的NtReadVirtualMemory函数:

在这里插入图片描述

这个函数传进去一个调用号,以及一个地址,再去call这个地址中的值,这个值就是存在于内核的一个函数.


//这个函数的功能:  

提供编号
找到函数
通过函数进入ring 0

也就是说ntdll也只是做了个引荐人的功能,引荐进ring 0

真正对内存读写是在ring 0实现的
那就再继续跟跟看7FFE0300处的值是什么?

在这里插入图片描述

7c92e4f0

再继续跟7c92e4f0:

在这里插入图片描述

这就跟到了sysenter 汇编指令:
该汇编指令的作用是?:

通过寄存器,切换EIP,ESP

  1.将IA32_SYSENTER_CS 和IA32_SYSENTER_EIP分别装到cs和eip寄存器中
  2.将IA32_SYSENTER_CS+8 和IA32_SYSENTER_ESP 分别装载到ss和esp寄存器中,切换特权级0;

之后程序在ring 0环境下跳转到指定eip去执行,执行结束后使用sysexit 汇编指令返回,这条指令功能与sysenter相反:

 1.将IA32_SYSENTER_CS+16装载到cs寄存器,将edx寄存器中的指令的指针装载到eip;
 2.将IA32_SYSENTER_CS+24装载到ss寄存器中;
 3.cx寄存器中的指针装载到esp中,切换到特权3
 IA32_SYSENTER_CS之类的属于MSR寄存器

KiFastSystemCall,KiIntSystemCall

操作系统会检测CPU支不支持快速调用,如果支持,就会调用KiFastSystemCall 进ring 0,如果CPU比较老旧不支持快速调用 就会调用 KiIntSystemCall去进入ring 0

在ntdll.dll模块中找到该函数

在这里插入图片描述
发现他的本质其实还是调用了int 2e 号中断进入的ring 0

我们现在尝试在ntoskrnl.exe模块中查看一下int 2e是怎么进ring 0的?

在这里插入图片描述
在这里插入图片描述

SEP位

那CPU到底是怎么验证支不支持KiFastSystemCall的呢?

CPUID 指令
//该指令需要传入一个参数
//当eax = 1 来执行cpuid指令时,处理器的特征信息被放在ecx,和edx寄存器中,其中edx包含了一个SEP位(11位),该位指明了当前处理器是否支持

在这里插入图片描述

当SEP位 == 1 时,说明是支持的

1 1 1 1 1 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
15                              11                    0

这两种的区别

KiIntSystemCall:

这个主要是使用INT 2E 中断门去做,中断门中CS,EIP都已经在IDT表中存储好了,SS与ESP需要TSS提供,所以使用一次int 2e 会读取IDT中的CS,和查找TSS

KiFastSystemCall:

sysenter : 系统会提前将CS/SS/ESP/EIP的值存储在MSR寄存器中,sysenter指令执行时,会将MSR寄存器值直接写入相关寄存器,直接就是寄存器的读,没有读内存的过程,这是快速调用的本质。

_KUSER_SHARED_DATA

  1. 这个结构体是在User层和Kernel层分别定义了一个_KUSER_SHARED_DATA结构体 用于User和Kernel层共享某些数据

  2. 他们使用固定的地址值映射,_KUSER_SHARED_DATA结构区域在User和Kernel层地址分别为:
    User 层地址为:0x7ffe0000
    Kernel层地址为:0xffdf0000

注意:虽然指向同一个物理页,但在User层是只读的,在Kernel层是可读写的

回到上面的内容:

在这里插入图片描述

也就是说,call这个地址里的内容,我们并不能武断的就说这里面一定是什么,CPU新旧不同,可能会导致调用的函数是不同的.有可能是KiFastSystemCall,也有可能是KiIntSystemCall

附件

MSR 地址
IA32_SYSENTER_CS 174H
IA32_SYSENTER_ESP 175H
IA32_SYSENTER_EIP 176H

SS = CS + 8

在这里插入图片描述

可以通过RDMSR/WRMST 来进行读写(操作系统使用WRMST写该寄存器)

内核模块:

ntoskrnl.exe(CPU以10-10-12分页模式启动)
ntkrnlpa.exe(CPU以2-9-9-12分页模式启动)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

API函数的调用过程 的相关文章

  • 关于vscode头文件出现红色波浪曲线问题

    关于vscode头文件总显示红色波浪曲线解决 方法1 可以在设置中直接关掉 方法2 没有添加编译器的路径 我们可以找到gcc exe所在的路径 或者重新安装官网下载 解压到c盘非中文路径 复制路径 主要是看gcc g 所在的路径
  • 环信iOS使用步骤及使用总结

    环信iOS使用步骤及使用总结 第一步 集成 请参照环信官方文档http docs easemob com im 300iosclientintegration 20iossdkimport 集成 iOSSDK 在您阅读此文档时 我们假定您已
  • OpenAI最新官方ChatGPT聊天插件接口《插件部署上生产》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(五)(附源码)

    Plugins in production 插件部署上生产 前言 Rate limits 速率限制 Updating your plugin 更新您的插件 Plugin terms Domain verification and secur
  • TCP与UDP的区别

    一 前言 TCP IP 中有两个具有代表性的传输层协议 分别是 TCP 和 UDP 二 TCP IP网络模型 计算机与网络设备要相互通信 双方就必须基于相同的方法 比如 如何探测到通信目标 由哪一边先发起通信 使用哪种语言进行通信 怎样结束
  • 因果推断4--Causal ML(个人笔记)

    目录 1 安装教程及官方文档 1 1 pip安装 1 2 API文档 1 3 代码仓库 2 Uplift模型与主要方法介绍 2 1 发放代金券 2 2 多treatment 2 3 实验方法 3 causalml inference tre
  • IDEA中使用单元测试(Junit)Scanner控制台无法输入问题解决 2022.12.13

    步骤 Help Edit Custom VM options 在idea64 exe vmoptions文件中最后一行添加如下内容 Deditable java test console true 操作完成保存后一定要重启IDEA ps 通
  • Vue中读取本地图片实现预览和上传

    先看效果图 上面展示了两张从本地添加的准备上传服务器的预览图片 效果还不错吧 哈哈哈 下面是该页面中紫色框的布局与实现代码 我想有些人也不喜欢HTML中默认的上传文件样式 实在辣眼睛
  • C\C++ 中的绝对值函数:abs()、cabs()、fabs()、labs()

    不同类型的数据使用不同类型的绝对值函数 整型 int abs int i 返回整型参数i的绝对值 复数 double cabs struct complex znum 返回复数znum的绝对值 双精度浮点型 double fabs doub
  • egg-swagger token验证无效解决方案

    先看效果 注意 我这边只讲重点 1 首先 egg swagger 怎么安装看我的这篇egg swagger demo 无数据库版 2 无swagger的 token 验证 我的这篇eggjs token生成和验证demo 3 我这边只讲 重
  • Raft一致性算法

    摘要 Raft 是一种为了管理复制日志的一致性算法 它提供了和 Paxos 算法相同的功能和性能 但是它的算法结构和 Paxos 不同 使得 Raft 算法更加容易理解并且更容易构建实际的系统 为了提升可理解性 Raft 将一致性算法分解成
  • Prometheus详解(四)——Prometheus简单使用

    今天继续给大家介绍Linux运维相关知识 本文主要内容是Prometheus简单使用 在上文Prometheus详解 三 Prometheus安装部署中 我们介绍了Prometheus的安装和部署 今天 我们就来介绍一下Prometheus
  • fork()父子进程变量之间的关系与信号的响应

    1 变量关系 根据 unix 高级环境编程 中的一句话 子进程和父进程继续执行fork调用之后的指令 子进程是父进程的副本 例如 子进程获取父进程数据空间 堆和栈的副本 注意 这是子进程所拥有的副本 父子进程并不共享这些存储空间部分 父子进
  • 尚品汇细节分析-Vue项目中如何实现自定义校验规则

    需求 当用户登录时 会输入用户名和密码 用户名不能为空 密码的长度不能小于6位 需要在用户在点击登录按钮前 进行验证是否通过我们设定的规则 如果通过则放行 如果不通过则会进行提示 效果图 结合Element UI来实现校验规则 1 页面元素
  • SQL SERVER 2000 遍历父子关系数据的表(二叉树)获得所有子节点 所有父节点及节点层数函数

    SQL SERVER 2000 遍历父子关系數據表 二叉树 获得所有子节点 所有父节点及节点层数函数 Geovin Du 涂聚文 建立測試環境 Create Table GeovinDu ID Int fatherID Int Name V
  • 课程设计-基于Java web的网吧管理系统

    项目编号 B01 项目名称 基于Java jsp Servlet的网吧管理系统 源码编号 BK05 项目类型 Java web项目 JavaEE 当前版本 V1 0 0版本 用户类型 只有管理员 单角色 项目架构 B S架构 设计思想 MV
  • IDEA快捷键(WIN10,持续更新)

    IDEA快捷键 以下所说的都是windows下的默认快捷键 可以通过File gt Settings gt Keymap 对快捷键进行修改 查看源码 ctrl 鼠标左键 重写父类方法 ctrl o 快速写for循环 20 for或fori
  • python给图片加雾

    调用的是cv2的addWeighted函数 增雾结果来看效果还蛮不错的 import numpy as np import cv2 as cv import os import random file C Users Ilearn Desk
  • C++图书管理系统(简单版)

    1 系统需求 图书管理系统是一个可以记录图书借记和存储的工具 本教程主要利用C 来实现一个图书管理系统 系统中需要实现的功能如下 添加书籍 向图书管理系统中添加新书 信息包括 书名 书的价格 书的编号 最多记录1000本 显示书籍 显示图书
  • STC15单片机实战项目 - 硬件调试

    硬件调试 一 调试工具 1 直流电源 测试5 28V供电 2 手机充电线 测试USB供电 程序烧录 3 万用表 测量电压 4 示波器 测量开关波形 纹波等 二 焊接样机 焊接好的样机如下图 说明 作为硬件工程师 平时要多练焊接 练就一流的焊

随机推荐

  • 第二课 什么是norm game?(An Evolutionary Approach to Norms)

    文章目录 前置课程 An Evolutionary Approach to Norms Simulation of the Norms Game first step second step third step fourth step f
  • 【论文笔记】Darts-可微神经架构搜索(一)

    是什么 darts是什么 全称 Differentiable ARchiTecture Search 它是一种新 2018 的NAS 神经架构搜索 方法 NAS是什么 全称 neural architecture search 神经架构搜索
  • JS逆向时碰到了恶心的死代码怎么办?手把手教你解决!

    文章作者 夜幕团队 NightTeam 蔡老板 Loco 润色 校对 夜幕团队 NightTeam Loco 你是否也曾有过 在逆向时看到一大坨代码 但自己却无从下手 的遭遇 你是否也曾有过 跟着代码跳了很久之后 才发现那一大坨代码其实没有
  • MySQL的运行机制是什么?它有哪些引擎?

    目录 整个 SQL 的执行流程 1 查询缓存的利弊 2 如何选择数据库引 3 InnoDB 自增主键 整个 SQL 的执行流程 首先客户端端先要发送用户信息去服务端进行授权认证 如果使用的是命令行工具 通常需要输入如下信息 mysql h
  • 《Flutter入门疑难杂症》 Flutter的UI适配方案

    本文后面已经被我用新的extension大法替代咯 有兴趣的可以看我写的这篇文章 https blog csdn net WZAHD article details 111404843 spm 1001 2014 3001 5501 话不多
  • TimeLine 的使用说明

    一 关于 TimeLine Timeline是一套基于时间轴的多轨道动画系统 它支持可视化编辑 实时预览 这一个技术相对于其他动画系统 最大的区别就是 Timeline可以针对多个游戏物体做出的一系列动画 主要用于过场动画的制作 实现电影级
  • 如何记录键盘SIGQUIT次数

    Unix信号 在计算机科学中 信号 英语 Signals 是Unix 类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式 它是一种异步的通知机制 用来提醒进程一个事件已经发生 当一个信号发送给一个进程 操作系统中断了进
  • EOS与以太坊有哪些区别?

    以太坊是一个专门为开发和运行去中心化应用 DAPP 搭建的智能合约平台 EOS与以太坊类似 同样是基于智能合约和区块链而搭建 但是 从技术和设计理念等方面来看 这两者之间实际上存在明显的区别 那么EOS和以太坊到底有什么区别呢 这个问题要从
  • 深入了解接口测试:Postman 接口测试指南

    在现代软件开发生命周期中 接口测试是一个至关重要的部分 使用 Postman 这一工具 可以轻松地进行 接口测试 以下是一份简单的使用教程 帮助你快速上手 安装 Postman 首先 你需要在电脑上安装 Postman 你可以从官网上下载并
  • python如何取0到无穷大_python如何表示无穷大

    float inf 表示正无穷 float inf 或 float inf 表示负无穷 其中 inf 均可以写成 Inf 起步 python中整型不用担心溢出 因为python理论上可以表示无限大的整数 直到把内存挤爆 而无穷大在编程中常常
  • 使用 Mapbox 在 Vue 中开发一个地理信息定位应用

    本文首发自 前端修罗场 点击加入 是一个由 资深开发者 独立运行 的专业技术社区 我专注 Web 技术 Web3 区块链 答疑解惑 面试辅导以及职业发展 博主创作的 前端面试复习笔记 点击订阅 广受好评 已帮助多人提升实力 拿到 offer
  • 20210601

    一 调整系统的共享内存上限 今天遇到创建32个大小为100MB的共享内存失败 原因是创建的共享内存总大小超过了系统允许的共享内存上限 查询系统共享内存上限的命令是 ipcs l ops g null kernel ipcs l Shared
  • nodejs原生搭建后端服务

    node nodejs原生搭建后端服务 nodejs写后端 默默的小跟班的博客 CSDN博客
  • CentOS8下安装配置Wireguard

    1 CentOS8 0服务端安装 yum update y yum install epel release https www elrepo org elrepo release 8 el8 elrepo noarch rpm yum i
  • nova policy overide (by quqi99)

    作者 张华 发表于 2023 05 19 版权声明 可以任意转载 转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 Problem ExternalNetworkAttachForbidden will be thrown w
  • 【无标题】

    C bug记录 request for member endTime in something not a structure or union 粗心的时候经常遇到这个问题 但有时候就想不起来原因 这是因为对指针结构体的成员变量使用了 但应
  • 学习记录679@scp 拷贝当前主机某目录下某段时间内的文件到另一台服务器

    要按拷贝当前服务器的下的某个文件夹下的某段时间内的文件到另一台服务器 需要结合find exec scp命令 如下 我在当前主机下执行 拷贝此目录下的时间介于2020 12 24和2020 12 31之间的文件 注意不包括2020 12 3
  • Linux软件安装管理:在VMware挂载本地iso光盘镜像、配置yum软件仓库

    在操作VMware安装Linux系统后由于安装CentOS 7的最小化安装少了一些工具 比如 ifconfig 及 netstat 等 由于没问外部在线网络环境访问下载相关依赖包 则我们需要配置离线依赖库 本次操作是在Vmware上操作的
  • 在cesium中使用3D地形数据terrain builder的打开步骤

    本来题目名字叫做 大龄无经验程序员终成正果 纪念上班第三天 后加之后再 不行 必须把这篇博文发出去了 本篇用cesium terrain builder生成cesium可以使用的地形数据并用cesium terrain server发布 使
  • API函数的调用过程

    API函数的调用过程 ring3 Windows API Application Programing Interface 应用程序接口 简称API函数 Windows 有多少个API 主要是存放在C WINDOWS system32下面所