Windows提供了API接口供程序使用,可以使用操作系统提供的功能。

大部分的API具体实现代码都在内核态R0层,用户态R3层的接口仅仅只有一小部分代码,用于调用内核态的代码。

在Windows 2000中通过中断指令int 2E进入内核态,EAX寄存器保存函数编号,用于在系统服务表中找到对应的函数。

int 2E会找到IDT表中索引为0x2E对应的函数,在windbg中可以使用!idt 2E指令查看分发系统服务函数的函数为nt!KiSystemService

通过中断调用系统服务,切换过程繁琐,CPU必须从内存中分别加载门描述符和段描述符才能得到KiSystemService()的地址,速度慢,还需要进行权限检查。

为了实现快速系统调用,奔腾Ⅱ处理器引入了Sysenter/SYSEXIT指令,AMD K7引入了SYSCALL/SYSRET指令。

在全局描述符中存放了建立四个断描述符。

供SYSENTER指令使用的MSR寄存器如下:

SYSENTER_CS_MSR    MSR地址为174h     含义为:目标代码段的CS选择子   在windbg中使用  rdmsr 174

SYSENTER_ESP_MSR  MSR地址为175h     含义为:目标ESP    在windbg中使用  rdmsr 175

SYSENTER_EIP_MSR   MSR地址为176h     含义为:目标EIP     在windbg中使用  rdmsr 176   对应nt!KiFastCallEntry

下面是系统调用的指令分别对应入口函数及返回指令、函数

INT 2E    对应KiSystemService   返回指令 iret  返回时的内核函数 KiSystemCallExit

sysenter 对应KiFastCallEntry      返回指令  sysexit  返回时的内核函数 KiSystemCallExit2

syscall    对应KiFastCallEntry      返回指令  sysret  返回时的内核函数 KiSystemCallExit2

 

从内核态到用户态可以通过如下方式:

nt!KeUserModeCallback   这是通过传入一个索引值,然后在PEB中的kernelcallbacktable表中寻找对应函数,调用完成后通过CallBackReturn类似函数中的 int 2B指令返回内核。

原文地址:http://www.cnblogs.com/ps12345678/p/16830263.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性