| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1613 人关注过本帖
标题:求教大虾们::ring3进ring0中的一个指针问题
取消只看楼主 加入收藏
lyklyk75124
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-2-19
结帖率:0
收藏
已结贴  问题点数:20 回复次数:9 
求教大虾们::ring3进ring0中的一个指针问题
.586p
.model flat,stdcall
option casemap:none


.code
start:
nop
nop
nop
nop

pushfd
pushad

push edx
sgdt [esp-2]
pop edx
mov eax,edx
mov ecx,3e0h

.if dword ptr [edx+ecx+2]!=0ec0003e8h
mov byte ptr [edx],0c3h

mov word ptr [edx+ecx],ax
shr eax,16
mov word ptr [edx+ecx+6],ax
mov dword ptr [edx+ecx+2],0ec0003e8h;1110 1100 0000 0000 ,03e8h

mov dword ptr [edx+ecx+8],0000ffffh
mov dword ptr [edx+ecx+12],00cf9a00h
.endif

popad
popfd

xor eax,eax
ret 8


end start


把以上的汇编代码保存到文件mywdm.asm,然后用MASM 6.14按照下面的方法编译:

ml /c /coff /Cp mywdm.asm
link /subsystem:windows /driver:wdm /release /out:mywdm.sys mywdm.obj



mywdm.sys的功能是在GDT中创建一个3级调用门和一个0级32位代码段描述符,3级调用
门的选择子是3E3,0级32位代码段的选择子是3E8。

好了,现在执行mywdm.sys,但驱动程序是不能直接执行的,所以要构造它的执行环境。
先在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services中建立一个mywdm
子键,然后建立3个DWORD型的键值:
ErrorControl=0
Start=3 (如果Start=1,mywdm.sys会随电脑启动而自动装入)
Type=1


好了,既然GDT中已经有了我们的调用门,那么意味着我们写的应用程序可以自由地在
RING3和RING0之间切换,但如何使用这个调用门还是有讲究的,它的使用方法是:

...

call 3e3:00000000 ;机器码 9A 00 00 00 00 E3 03
;此时已经进入RING0,CS=3E8,跟着要切换堆栈
mov eax,esp
mov esp,[esp+4]
push eax

;这里加入你要在RING0里执行的代码

;准备返回RING3
pop esp
push offset ring3
retf
ring3:
;此时回到RING3

本人的问题:call 3e3:00000000 返回之后的cs:eip能否定位下条指令mov eax,esp
(cs=3e8了,不再是原cs了)
搜索更多相关主题的帖子: word 
2011-02-19 11:58
lyklyk75124
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-2-19
收藏
得分:0 
call 3e3:0 最终指向的指令是 我们在驱动程式中填充在gdt空描述符中的指令retn  ,而不是retf
2011-02-19 14:27
lyklyk75124
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-2-19
收藏
得分:0 
怎的没人帮我解答?????
call 3e3:0 最终指向的指令是 我们在驱动程式中填充在gdt空描述符中的指令retn  ,而不是retf
call 3e3:0是段间间接调用.用retn返回只能返回eip,cs还是3e8.
如用retf 返回的话指针是没问题了,但这时就不是ring0了.
2011-02-20 17:52
lyklyk75124
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-2-19
收藏
得分:0 
楼上怎不帮我解答哪个指针问题
2011-02-20 18:22
lyklyk75124
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-2-19
收藏
得分:0 
原程序中call 3e3:0的下一条指令mov eax,esp
要用  原cs:原eip 才能读取
但现在是 3e8:原eip  .
这样也能读取吗???
2011-02-20 18:30
lyklyk75124
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-2-19
收藏
得分:0 
楼上是看的哪些书???我只知能寻址4g范围  选择子不同  段基址和cpl都会不同
2011-02-20 18:57
lyklyk75124
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-2-19
收藏
得分:0 
楼上   cs不同  定位出来的线性地址是不同的
2011-02-20 19:20
lyklyk75124
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-2-19
收藏
得分:0 
是可能不同   但在这里我也看不到相同的地方   3e8的基址是0
2011-02-20 20:21
lyklyk75124
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-2-19
收藏
得分:0 
按你说   还要代码段描述符中的32位段基址做什么  不如不要了  都统一了  还分配什么内存
2011-02-21 11:42
lyklyk75124
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-2-19
收藏
得分:0 
楼上  我是真不明的  不过你说的我就更不明了 按你说的cs中除了cpl有用外 别的都没用了
2011-02-21 16:15
快速回复:求教大虾们::ring3进ring0中的一个指针问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014116 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved