首页
社区
课程
招聘
[讨论]手动切换ring3的可能性
发表于: 2014-7-29 22:49 5258

[讨论]手动切换ring3的可能性

2014-7-29 22:49
5258
通常程序都是借着sysenter和sysexit来切换环权限

这几天为了搞定ring0下调用ring3函数的稳定方案 一直在想方法

我原本的方法是修改trapframe 但偶尔会莫名蓝屏  觉得不稳定(http://bbs.pediy.com/showthread.php?p=1304645#post1304645)

因此想到了在ring0下先KeStackAttachProcess到指定的进程  再利用sysexit 进入ring3 执行ring3函数

但在尝试过程 发现执行sysexit会莫名的蓝屏.... (http://bbs.pediy.com/showthread.php?p=1304652&posted=1#post1304652)

所以现在想尝试看看 手动切换ring3  也就是手动修改cs和ss寄存器

但是mov ss,ax   确立刻蓝屏...嗯..为什么阿

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 138
活跃值: (306)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
如果只是为了执行ring3代码.参考 http://bbs.pediy.com/showthread.php?t=190599
2014-7-29 23:10
0
雪    币: 52
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你这篇文的所需要知识已经在我的认知之外了哈哈...

不过我主要是追求 "直接 准确 简单 无硬编码"  所以你的方法对我可能不太合适...
2014-7-29 23:22
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
4
参考KeUserModeCallback的代码~
2014-7-29 23:37
0
雪    币: 1651
活跃值: (1425)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
sysexit的环境是不是被你破坏了。其他线程回到r3也会跑到你那里吧。
2014-7-30 00:22
0
雪    币: 52
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
sysexit执行的细节在这里可以看到 http://x86.renejeschke.de/html/file_module_x86_id_314.html

前三项会触发Exception的条件我都没符合才对...

而SYSENTER_CS_MSR寄存器通常也没人会去修改

sysexit是靠着windows自己写的返回机制 来填充edx和ecx
2014-7-30 08:52
0
雪    币: 52
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
cvcvxk

我看过了..因为知识不足 所以卡在kicallusermode 呜哈哈
2014-7-30 11:18
0
雪    币: 52
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
在这里说不定能找到答案  正在读 但读不是很懂..
http://x86.renejeschke.de/html/file_module_x86_id_176.html
2014-7-30 11:50
0
雪    币: 52
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
答案找到..!

如果使用mov指令来修改段寄存器   不能改变level

mov 指令的详细动作

(来自intel手册 http://www.intel.com.tw/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-2a-manual.pdf)

IF SS is loaded
THEN
IF segment selector is NULL
THEN #GP(0); FI;
IF segment selector index is outside descriptor table limits
or segment selector's[B][I][U][COLOR="Red"] RPL ≠ CPL[/COLOR][/U][/I][/B]
or segment is not a writable data segment
or DPL ≠ CPL
THEN #GP(selector); FI;
IF segment not marked present
THEN #SS(selector);
ELSE
SS ← segment selector;
SS ← segment descriptor; FI;
FI;
IF DS, ES, FS, or GS is loaded with non-NULL selector
THEN
IF segment selector index is outside descriptor table limits
or segment is not a data or readable code segment
or ((segment is a data or nonconforming code segment)
or ((RPL > DPL) and (CPL > DPL))
THEN #GP(selector); FI;
IF segment not marked present
THEN #NP(selector);
ELSE
SegmentRegister ← segment selector;
SegmentRegister ← segment descriptor; FI;
FI;
IF DS, ES, FS, or GS is loaded with NULL selector
THEN
SegmentRegister ← segment selector;
SegmentRegister ← segment descriptor;
FI;


我引发蓝屏的指令:
MOV AX,0X23
MOV SS,AX

RPL也就是0X23的第0和1位 =>3
CPL是当前SS(0X10)里的0和1位 => 0

3!=0  所以引发 GP

所以想要操作段寄存器来改变LEVEL是不被允许的 因为MOV指令会检查CPL是否等于RPL
而透过SYSEXIT和SYSENTER能够切换 是因为这两个指令没有检查
这样的结果是INTEL设计的
2014-7-30 16:54
0
游客
登录 | 注册 方可回帖
返回
//