<软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?

Windows内核

<软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?


Alex.xu 2009-09-03, 15:28 下午
hi 各位牛人,

问题如题, 我感觉ring 3下也可以使用这个汇编指令?
不知道是作者的失误还是我的问题.


thanks



Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?


王宇 2009-09-03, 17:31 下午
楼主没错~

SIDT is only useful in operating-system software; however, it can be used in application
programs without causing an exception to be generated.

Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?


Alex.xu 2009-09-03, 17:45 下午
谢谢 王宇~~

随便问一下, 有没有办法可以让用户态程序读取内核保护模式下的数据?
因为我用sidt找到了IDT的地址,我想把它的所有信息拷贝出来.

希望给个思路
能不能将自己的程序跳入系统ring 0

Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?


MJ0011 2009-09-03, 17:58 下午
sidt当然可以在RING3下使用。

如果要从用户态读取内核态保护模式的数据,可以用ZwSystemDebugControl或PhysicalMemory的方法来获取。
也可以使用某种方式给GDT添加一个CALLGATE,然后CALL CALLGATE,让程序跳入RING0执行
这是我常用的一个代码:
void AddCallGate()
{
ULONG Gdt_Addr;
BYTE CallGateData[0x10];
ULONG Icount;


__asm
{


pushfd
pushad


push edx
sgdt [esp-2]
pop edx



mov Gdt_Addr,edx

push 0xc3
push Gdt_Addr
call WriteMemory

;write the call gate type

mov eax,Gdt_Addr
mov word ptr[CallGateData],ax
shr eax,16
mov word ptr[CallGateData+6],ax
mov dword ptr[CallGateData+2],0x0ec0003e8
mov dword ptr[CallGateData+8],0x0000ffff
mov dword ptr[CallGateData+12],0x00cf9a00

;fill the call gate data

xor eax,eax
LoopWrite:
movzx edi,byte ptr CallGateData[eax]

push edi
mov edi,Gdt_Addr
add edi,0x3e0
add edi,eax
push edi

mov Icount,eax
call WriteMemory
mov eax,Icount
inc eax
cmp eax,0x10
jnz LoopWrite


popad
popfd

}

}


void IntoR0(PVOID function)
{
WORD Callgt[3];
Callgt[0] = 0;
Callgt[1] = 0;
Callgt[2] = 0x3e3;
__asm
{
call fword ptr[Callgt]
mov eax,esp
mov esp,[esp+4]
push eax
call function
pop esp
push offset ring3Ret
retf
ring3Ret:
nop
}
return ;

}
调用IntoR0(你要执行的跳RING0代码函数地址)即可。

当然也可以使用一些kernel mode memory disclose 0day

Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?


Alex.xu 2009-09-03, 18:20 下午
谢谢了, 虽然看不太懂(汇编很烂)~~
但是大致是理解了,就是加了一个中断门,然后自己手动触发该中断,这时候就进入ring 0 了.

当我的程序进入ring 0 了之后是不是意味着,我可以随便读取内核内存了?

Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?


王宇 2009-09-03, 19:06 下午
我以前喜欢用 NtSystemDebugControl 虽然它基本会被拦
代码参考 randnut 的

PhysicalMemory 也一样
代码参考 Mark 的

Call Gate 可供参考的更多
我还看过吴岩峰前辈放出的一段演示代码 也很强大

最后
王道还是 kernel mode memory disclose 0day

嘿嘿~~

Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?


格蠹老雷 2009-09-04, 09:46 上午

是的,这里疏忽了,原话是LIDT和SIDT指令......,应该不包括SIDT。

在早期的手册中,关于这条指令的描述是:

SGDT and SIDT are used only in operating system software; they are
not used in application programs.

后来改成王宇引用的样子。

本来是不希望应用层使用的,但是“希望”没管什么用......

Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?


Alex.xu 2009-09-05, 11:33 上午
多谢各位前辈了~~
以前自己太俗了,一直在搞游戏开发,搞服务器开发,以为已经够底层了。后来,李建忠老师给我们做了一个培训,让我学会了从底层思维考虑问题。加上最近两年都在用windbg分析解决问题,让我体会到底层真的好美。为什么以前没有关注呢。
最近在看 linux内核和window internal5还有张老师的 软调。真的很难啃,个人感觉每本书侧重点都不同,而且不是每个点都非常深入(please correct me if I am wrong),还得求助各位牛人 希望自己能够坚持到底~~

上次还碰到一个问题:
就是全页堆模式下使用heap -s查看内存块的问题。为什么vista下面始终输出不了?难道需要打开某些参数? 因为我明明创建了1.5G的内存。但是heap -s看不到任何相关的堆信息。让我很诧异。但是我明明在XP下面测试成功过了。

Powered by Community Server Powered by CnForums.Net