2.API的调用过程(3环进0环)
_KUSER_SHARED_DATA
/*这是一个结构体,翻译过来就是:
Kernel与User分享的一块数据。
0环与3环共享的一块内存
*/
- 在User层和Kernel层分别定义了一个_KUSER_SHARED_DATA结构区域,用于User层和Kernel层共享某些数据
- 它们使用固定的地址值映射,_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环需要修改的寄存器
- CS的权限由3变为0意味着需要新的CS
- SS与CS的权限永远一致需要新的SS,
- 权限发生切换的时候,堆栈也一定会切换,需要新的ESP
- 进0环后代码的位置,需要EIP
ntdll.dl!KiFastSystemCall()与ntall.dl!lkilntSystemCall()就是提供了两种不同的找法
API通过中断门进0环
当你的CPU不支持快速调用是用以下方法进入0环的
eax里的值是内核操作码,edx存的是参数的指针,api统一中断号0x2e(idt 表2e位置)
int 0x2e进ring0
- 在IDT表中找到0x2E号门描述符
- 分析CS/SS/ESP/EIP的来源
- 分析EIP是什么
0008 就是CS,高4字节+低4字节就是EIP:8053e481,ss与esp是从Tss(任务段)提供的
EIP:KiSystemService();,这个函数是内核模块里的
- 固定中断号为0x2E
- CS/EIP由门描述符提供ESP/SS由TSS提供
- 进入0环后执行的内核函数: NT!KiSystemService
- 通过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环:
- CS/ESP/EIP由MSR寄存器提供(SS是算出来的)
- 进入0环后执行的内核函数: NT!KiFastCallEntry
- 通过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环)相关推荐
- Windows系统调用学习笔记(二)—— 3环进0环
Windows系统调用学习笔记(二)-- 3环进0环 要点回顾 基本概念 _KUSER_SHARED_DATA 0x7FFE0300 实验:判断CPU是否支持快速调用 第一步:修改EAX=1 第二步: ...
- [转](45)中断门和快速调用进0环详解,重写 WriteProcessMemory
一.本文大纲 系统调用的两种方式:中断门和快速调用 _KUSER_SHARED_DATA 结构 使用 cpuid 指令判断当前CPU是否支持快速调用 3环进0环需要更改的4个寄存器 以 ReadPro ...
- (45)中断门和快速调用进0环详解,重写 WriteProcessMemory
一.本文大纲 系统调用的两种方式:中断门和快速调用 _KUSER_SHARED_DATA 结构 使用 cpuid 指令判断当前CPU是否支持快速调用 3环进0环需要更改的4个寄存器 以 ReadPro ...
- 1.API的调用过程(3环部分)
Application Programming Interface,简称API函数. 主要是存放在C:\WINDOWS\system32下面所有的dll 几个重要的DLL Kernel32.dll:最 ...
- 4.API的调用过程(系统服务表)
SystemServiceTable(系统服务表) typedef struct _KSYSTEM_SERVICE_TABLE {PULONG ServiceTableBase; //这个指向系统服务 ...
- 3.API的调用过程(保存现场)
_KTrap_Frame 结构 kd> dt _KTrap_Frame ntdll!_KTRAP_FRAME//调试系统服务+0x000 DbgEbp : Uint4B+0x004 DbgEip ...
- 泛微E9后端学习笔记 - API接口调用过程
参考:E9BackendDdevelopmentGuide.pdf (e-cloudstore.com) 根据文档指引在E9安装目录下可找到如下两个文件夹 com.engine目录是核心业务逻辑类所在 ...
- Windows TerminateThread终止线程过程(从3环到0环)
- 跟着Code走,详解Symbian OS API调用过程
作为一个被Symbian开发折磨过的人,当得知Symbian开源时,忍不住马上跑到developer.symbian.org上瞧一瞧,看看自己具体是怎样被折磨的.看了一段时间之后,想想还是把有些东西记 ...
最新文章
- 秉承着一位代码艺术家的分享精神
- 【wikioi】1022 覆盖(匈牙利)
- 电商搜索推荐业务词汇表
- 创造思维方法训练_数学思维方法训练课程:每日一题11.24
- 腾讯 深圳 25928-PHP开发工程师(深圳)
- 日语学习-多邻国-饮食
- 一分钟读懂java的super关键字
- 扔掉目标检测器,实现真正的端到端多模态预训练!阿里提出E2E-VLP(ACL2021)...
- windows mobile 开发 web service 未能建立与网络的连接、无法连接到远程服务器
- Makefile 函数
- Android之多种Bitmap效果
- 数据源Display方法
- python人流热力图_高德地图热力图插件实现人流量监控,如何实现人流数据实时刷新...
- 如何装计算机网络驱动,网卡驱动安装,详细教您电脑网卡驱动怎么安装
- 海康威视监控摄像头大华摄像头webrtc监控低时延无插件直播页面播放毫无延迟
- c语言组播源码_CLAA Class C简单组播业务的实现
- 腾讯云企业邮箱设置别名
- 树莓派 配置USB麦克风声卡
- 【软件测试】企业测试面试题9道,从自我介绍到项目考察+回答......
- BZOJ1415: [Noi2005]聪聪和可可