首页
社区
课程
招聘
[旧帖] KiFastCallEntry的一点不解 0.00雪花
发表于: 2012-2-21 22:11 4434

[旧帖] KiFastCallEntry的一点不解 0.00雪花

2012-2-21 22:11
4434
在KiFastCallEntry开始处构造了一个KTRAP_FRAME,iretd返回时发现代码如下:
804df36c 83c404          add     esp,4			; 指向KTRAP_FRAME.Eip
804df36f cf              iretd		; pop KTRAP_FRAME.Eip, KTRAP_FRAME.SegCs, KTRAP_FRAME.EFlags

iretd后会到下面
ntdll!KiFastSystemCallRet:
7c92e514 c3              ret		; 与call dword ptr [edx]相对应

不解这中间内核栈是如何切换到用户栈了,查了资料没说iretd会pop出 KTRAP_FRAME.HardwareSegSs和KTRAP_FRAME.HardwareEsp,因此KiFastSystemCallRet的ret怎么会在用户栈了呢?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
楼主看过这个了么:
http://bbs.pediy.com/showthread.php?p=630730

在 Ring0 代码执行完毕,调用 SYSEXIT 指令退回 Ring3 时,CPU 会做出如下操作:
1. 将 SYSENTER_CS_MSR 的值加 16(Ring3 的代码段描述符)装载到 cs 寄存器
2. 将寄存器 edx 的值装载到 eip 寄存器
3. 将 SYSENTER_CS_MSR 的值加 24(Ring3 的堆栈段描述符)装载到 ss 寄存器
4. 将寄存器 ecx 的值装载到 esp 寄存器
5. 将特权级切换到 Ring3
6. 继续执行 Ring3 的代码
2012-2-21 22:56
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看过,我这里的是iretd,不是sysexit。
2012-2-22 09:48
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
本来,进入KiFastCallEntry的时候就是在用户栈,返回的时候自然也是在用户栈。
sysenter和sysexit之间的代码才是在使用内核栈的。

所以楼主一定是哪里搞错了,或者是没有详细了解sysenter指令。
2012-2-22 17:10
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
如果是sysenter与sysexit配套使用了我是明白的,关键是进入时是sysenter,而某些返回时是iretd,我就没明白这种情况是如何切换回去了。
2012-2-22 17:19
0
游客
登录 | 注册 方可回帖
返回
//