_KUSER_SHARED_DATA
/*这是一个结构体,翻译过来就是:
Kernel与User分享的一块数据。
0环与3环共享的一块内存
*/
  1. 在User层和Kernel层分别定义了一个_KUSER_SHARED_DATA结构区域,用于User层和Kernel层共享某些数据
  2. 它们使用固定的地址值映射,_KUSER_SHARED_DATA结构区域在User和 Kernel层地址分别为:
    User层地址为: 0x7ffe0000
    Kernnel层地址为: 0xffdf0000

他们两个线性地址对应的物理页是一样的,只不过映射了两份

特别说明:
虽然指向的是同一个物理页,但在User层是只读的,在Kernnel层是可读可写的.



我们来看看这个结构

回顾之前的

也就是说我们用了SystemCall的方式进入0环,下面我们来看看0x7FFE0300储存的是什么

当通过eax=1来执行cpuid指令时,处理器的特征信息被放在ecx和edx寄存器中, 其中edx包含了一个SEP位(11位) ,该位指明了当前CPU知否支持-sysenter/sysexit指令(快速调用)
SEP位=1:支持快速调用
SEP位=0:不支持快速调用
支持:ntdll.dl!KiFastSystemCall()
不支持:ntdll.dl!lkilntSystemCall()


我的是支持的,当操作系统启动的时候就会提供cpuid指令来查看你支不支持sysenter/sysexit指令,当你支持的时后它会把ntdll.dl!KiFastSystemCall()这个函数的地址写到_KUSER_SHARED_DATA结构+300的处,如果不支持就写ntdll.dl! lkilntSystemCal()

进入0环需要修改的寄存器

  1. CS的权限由3变为0意味着需要新的CS
  2. SS与CS的权限永远一致需要新的SS,
  3. 权限发生切换的时候,堆栈也一定会切换,需要新的ESP
  4. 进0环后代码的位置,需要EIP

ntdll.dl!KiFastSystemCall()与ntall.dl!lkilntSystemCall()就是提供了两种不同的找法

API通过中断门进0环

当你的CPU不支持快速调用是用以下方法进入0环的

eax里的值是内核操作码,edx存的是参数的指针,api统一中断号0x2e(idt 表2e位置)

int 0x2e进ring0

  1. 在IDT表中找到0x2E号门描述符
  2. 分析CS/SS/ESP/EIP的来源
  3. 分析EIP是什么

    0008 就是CS,高4字节+低4字节就是EIP:8053e481,ss与esp是从Tss(任务段)提供的


EIP:KiSystemService();,这个函数是内核模块里的

  1. 固定中断号为0x2E
  2. CS/EIP由门描述符提供ESP/SS由TSS提供
  3. 进入0环后执行的内核函数: NT!KiSystemService
  4. 通过iret/iretd指令返回到用户模式 (从内核栈中pop eip,cs,eflags,esp,ss。然后将控制权交给eip所值的用户代码)



sysenter进0环


eax是操作码,edx是返回地址以及参数的指针

为什么叫快速调用?
中断门进0环,需要的CS, EIP在IDT表中,需要查内存(SS与ESP由TSS提供)

而CPU如果支持sysenter指令时,操作系统会提前将CS/SS/ESP/EIP的值存储在 MSR寄存器中, sysenter指令执行时, CPU会将MSR寄存器中的值直接写入相关,寄存器,没有读内存的讨程,所以叫快速调用,本质是一样的!

在执行sysenter指令之前,操作系统必须指定0环的CS段、SS段、EIP以及ESP.

MSR寄存器是非常大的,0x174位置存放新的CS,0x175存放新的ESP,0x176存放新的EIP。SS并没有存放在MSR寄存器中,执行sysenter后cs+8就是ss了

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

windbg 查看这这几个值

   rdmsr 174  //查看CSrdmsr 175    //查看ESPrdmsr 176    //查看EIP


EIP:KiFastCallEntry();

用户代码调用sysenter指令以前,必须将要返回的指令地址和栈指针值保存到edx和ecx寄存器中,否则,内核模式代码将来无法设置正确的值,以使sysexit还能返回到用户模式代码原来的位置。

API通过sysenter指令进0环:

  1. CS/ESP/EIP由MSR寄存器提供(SS是算出来的)
  2. 进入0环后执行的内核函数: NT!KiFastCallEntry
  3. 通过sysexit指令返回用户模式

sysexit:
将IA_32_SYSENTER_CS+16装载到CS寄存器;将edx寄存器中的指针装载到eip寄存器中;(指定用户模式代码段)
将IA_32_SYSENTER_CS+24装载到SS寄存器;将ecx寄存器中的指针装载到esp寄存器中;(指定用户模式栈段)
切换到特权级3,执行eip寄存器中指定的用户代码。

C:\Windows\System32
内核模块: ntoskrnl.exe/ntkrnlpa.exe
2-9-9-12分页用:ntkrnlpa.exe
10-10-12用:ntoskrnl.exe

2.API的调用过程(3环进0环)相关推荐

  1. Windows系统调用学习笔记(二)—— 3环进0环

    Windows系统调用学习笔记(二)-- 3环进0环 要点回顾 基本概念 _KUSER_SHARED_DATA 0x7FFE0300 实验:判断CPU是否支持快速调用 第一步:修改EAX=1 第二步: ...

  2. [转](45)中断门和快速调用进0环详解,重写 WriteProcessMemory

    一.本文大纲 系统调用的两种方式:中断门和快速调用 _KUSER_SHARED_DATA 结构 使用 cpuid 指令判断当前CPU是否支持快速调用 3环进0环需要更改的4个寄存器 以 ReadPro ...

  3. (45)中断门和快速调用进0环详解,重写 WriteProcessMemory

    一.本文大纲 系统调用的两种方式:中断门和快速调用 _KUSER_SHARED_DATA 结构 使用 cpuid 指令判断当前CPU是否支持快速调用 3环进0环需要更改的4个寄存器 以 ReadPro ...

  4. 1.API的调用过程(3环部分)

    Application Programming Interface,简称API函数. 主要是存放在C:\WINDOWS\system32下面所有的dll 几个重要的DLL Kernel32.dll:最 ...

  5. 4.API的调用过程(系统服务表)

    SystemServiceTable(系统服务表) typedef struct _KSYSTEM_SERVICE_TABLE {PULONG ServiceTableBase; //这个指向系统服务 ...

  6. 3.API的调用过程(保存现场)

    _KTrap_Frame 结构 kd> dt _KTrap_Frame ntdll!_KTRAP_FRAME//调试系统服务+0x000 DbgEbp : Uint4B+0x004 DbgEip ...

  7. 泛微E9后端学习笔记 - API接口调用过程

    参考:E9BackendDdevelopmentGuide.pdf (e-cloudstore.com) 根据文档指引在E9安装目录下可找到如下两个文件夹 com.engine目录是核心业务逻辑类所在 ...

  8. Windows TerminateThread终止线程过程(从3环到0环)

  9. 跟着Code走,详解Symbian OS API调用过程

    作为一个被Symbian开发折磨过的人,当得知Symbian开源时,忍不住马上跑到developer.symbian.org上瞧一瞧,看看自己具体是怎样被折磨的.看了一段时间之后,想想还是把有些东西记 ...

最新文章

  1. 秉承着一位代码艺术家的分享精神
  2. 【wikioi】1022 覆盖(匈牙利)
  3. 电商搜索推荐业务词汇表
  4. 创造思维方法训练_数学思维方法训练课程:每日一题11.24
  5. 腾讯 深圳 25928-PHP开发工程师(深圳)
  6. 日语学习-多邻国-饮食
  7. 一分钟读懂java的super关键字
  8. 扔掉目标检测器,实现真正的端到端多模态预训练!阿里提出E2E-VLP(ACL2021)...
  9. windows mobile 开发 web service 未能建立与网络的连接、无法连接到远程服务器
  10. Makefile 函数
  11. Android之多种Bitmap效果
  12. 数据源Display方法
  13. python人流热力图_高德地图热力图插件实现人流量监控,如何实现人流数据实时刷新...
  14. 如何装计算机网络驱动,网卡驱动安装,详细教您电脑网卡驱动怎么安装
  15. 海康威视监控摄像头大华摄像头webrtc监控低时延无插件直播页面播放毫无延迟
  16. c语言组播源码_CLAA Class C简单组播业务的实现
  17. 腾讯云企业邮箱设置别名
  18. 树莓派 配置USB麦克风声卡
  19. 【软件测试】企业测试面试题9道,从自我介绍到项目考察+回答......
  20. BZOJ1415: [Noi2005]聪聪和可可

热门文章

  1. 成功解决ValueError: setting an array element with a sequence.
  2. 【综述】深度长尾学习
  3. 蓝桥杯_算法训练_关联矩阵
  4. Ubuntu18.04 Numix
  5. [总结] 动态DP学习笔记
  6. 检测你处于程序员的哪个层级
  7. 设计新Xlator扩展GlusterFS[转]
  8. 中间代码生成器-5-编译原理
  9. 人的执念真的是非常的可怕
  10. WML元素及其语法格式一览表