|  |  |  |  |  |  | 
					            
						            
							            
								            |  | 
	Windows内核帖子发起人: Alex.xu   发起时间: 2009-09-03 15:28 下午   回复: 7
 
	 
		
			| 
					
						|         | 
						      
						        | 帖子排序: |  |  |  |  
				
					| 
							
								| 
										
											|  2009-09-03, 15:28 下午 |  
											| 
													 Alex.xu 
 
   注册: 2009-07-23
 发 贴: 21
 | 
													
														| <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了? 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| hi 各位牛人, 
 问题如题, 我感觉ring 3下也可以使用这个汇编指令?
 不知道是作者的失误还是我的问题.
 
 
 thanks
 
 
 
 
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2009-09-03, 17:31 下午 |  
											| 
													 王宇 
 
  
   注册: 2007-05-08
 发 贴: 306
 | 
													
														| Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了? 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 楼主没错~ 
 SIDT is only useful in operating-system software; however, it can be used in application
 programs without causing an exception to be generated.
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2009-09-03, 17:45 下午 |  
											| 
													 Alex.xu 
 
   注册: 2009-07-23
 发 贴: 21
 | 
													
														| Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了? 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 谢谢 王宇~~ 
 随便问一下, 有没有办法可以让用户态程序读取内核保护模式下的数据?
 因为我用sidt找到了IDT的地址,我想把它的所有信息拷贝出来.
 
 希望给个思路
 能不能将自己的程序跳入系统ring 0
 
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2009-09-03, 17:58 下午 |  
											| 
													 MJ0011 
 
   注册: 2008-04-24
 发 贴: 112
 | 
													
														| Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了? 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 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
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2009-09-03, 18:20 下午 |  
											| 
													 Alex.xu 
 
   注册: 2009-07-23
 发 贴: 21
 | 
													
														| Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了? 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 谢谢了, 虽然看不太懂(汇编很烂)~~ 但是大致是理解了,就是加了一个中断门,然后自己手动触发该中断,这时候就进入ring 0 了.
 
 当我的程序进入ring 0 了之后是不是意味着,我可以随便读取内核内存了?
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2009-09-03, 19:06 下午 |  
											| 
													 王宇 
 
  
   注册: 2007-05-08
 发 贴: 306
 | 
													
														| Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了? 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 我以前喜欢用 NtSystemDebugControl 虽然它基本会被拦 代码参考 randnut 的
 
 PhysicalMemory 也一样
 代码参考 Mark 的
 
 Call Gate 可供参考的更多
 我还看过吴岩峰前辈放出的一段演示代码 也很强大
 
 最后
 王道还是 kernel mode memory disclose 0day
 
 嘿嘿~~
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2009-09-04, 09:46 上午 |  
											| 
													 格蠹老雷 
 
   注册: 2005-12-19
 发 贴: 1,303
 | 
													
														| Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了? 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 是的,这里疏忽了,原话是LIDT和SIDT指令......,应该不包括SIDT。 在早期的手册中,关于这条指令的描述是: SGDT and SIDT are used only in operating system software; they arenot used in application programs.
 后来改成王宇引用的样子。 本来是不希望应用层使用的,但是“希望”没管什么用...... 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
				
					| 
							
								| 
										
											|  2009-09-05, 11:33 上午 |  
											| 
													 Alex.xu 
 
   注册: 2009-07-23
 发 贴: 21
 | 
													
														| Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了? 
 |  
														|  |  |  
											| 
													
														|   | 
																
																	| 多谢各位前辈了~~ 以前自己太俗了,一直在搞游戏开发,搞服务器开发,以为已经够底层了。后来,李建忠老师给我们做了一个培训,让我学会了从底层思维考虑问题。加上最近两年都在用windbg分析解决问题,让我体会到底层真的好美。为什么以前没有关注呢。
 最近在看 linux内核和window internal5还有张老师的 软调。真的很难啃,个人感觉每本书侧重点都不同,而且不是每个点都非常深入(please correct me if I am wrong),还得求助各位牛人 希望自己能够坚持到底~~
 
 上次还碰到一个问题:
 就是全页堆模式下使用heap -s查看内存块的问题。为什么vista下面始终输出不了?难道需要打开某些参数? 因为我明明创建了1.5G的内存。但是heap -s看不到任何相关的堆信息。让我很诧异。但是我明明在XP下面测试成功过了。
 
 
 
 |  |  
														|  | IP 地址: 已记录 | 报告 |  |  |  |  
		
			| 高端调试 » 内核探秘 » Windows内核 » <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了? |  |  
 |  |  |  |