wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
阅读:3230回复:9

WINXP-64 GDT初探之灌水篇

楼主#
更多 发布于:2005-03-25 11:42
WINXP-64 GDT初探之灌水篇
首先让我们来看看 WINXP-64下的GDT概貌吧。

       0       0       0       0       0       0       0       0
       0       0       0       0       0       0       0       0
       0       0       0       0       0      9b      20       0
      ff      ff       0       0       0      93      cf       0
      ff      ff       0       0       0      fb      cf       0
      ff      ff       0       0       0      f3      cf       0
       0       0       0       0       0      fb      20       0
       0       0       0       0       0       0       0       0
      68       0      70      10      4e      8b       0       0
       0      f8      ff      ff       0       0       0       0
      ff       f       0       0      fe      f3      40      ff
       0       0       0       0       0       0       0       0
      ff      ff       0       0       0      9a      cf       0
       0       0       0       0       0       0       0       0
GDTR
Limit:  6f   0
BASE:   0   0  4e   0   0  f8  ff  ff

IDTR
Limit:  ff   f
BASE:  70   0  4e   0   0  f8  ff  ff

基本概念我也就不说了,大家可以参考AMD64和INTEL EM64T的技术手册。
先简单说下2者的区别,其实说实在的基本没什么区别,但就目前INTEL 所出来的那
批所谓的INTEL EM64T的CPU,必须要说明的是都不支持NX执行保护,在对应 EM64T的技术手册
中原本应该是NX位的地方,都是RESERVED的,所以建议大家还是先用AMD64的CPU吧,不过估计最近出来的CPU
,INTEL好象开始加入NX保护技术了,至于那个对于SSE3的支持,大家就自己看着办吧,嘿嘿。。。。
言归正传。让我们来看下WINXP -64 1218版本中的GDT吧。
可以看到原来的NULL SELECTOR还是一样,不过好象扩展到16位的。
后面开始就是所谓的正式的东西了,先简单说下,INTEL在PII以后利用的FASTCALL技术,从RING3切换进RING0
利用指令SYSENTER,SYSEXIT来进行切换,而64位下则采用了SYSCALL,SYSRET来切换,提高了系统切换的性能,但
也有了一定的限制,就是不能象9X那样随意了,在GDT中RING0代码段,数据段,RING3代码段,数据段必须连续排列才行。

而SELECTOR 10H估计就是64位下的RING0代码段的SELECTOR了。
0       0       0       0       0      9b      20       0
由于在LONG MODE下代码段只考虑D,L,P,DPL,C位由此可见他属于64位模式的,存在的RING0,非一致代码段

而SELECTOR 18H估计就是64位下的RING0数据段的ELECTOR了。奇怪的是64位下的只考虑P位,其他一概忽略,确实令人费解。
需要说明的是在64位下DS,ES,SS,所引用的数据段根本就不考虑基地址和界限,完全是FLAT模式的,而FS,GS则有些特殊
系统专门培配置了FS。BASE,GS。BASE,的专门的MSR寄存器来存放其基地址,估计在64位WINDOWS下他们有特殊的用途。并专门
配备SWAPGS等指令快速切换RING0,3的GS地址等。。。。。。

后面是相应的RING3代码段和数据段
 ff      ff       0       0       0      fb      cf       0
 ff      ff       0       0       0      f3      cf       0
 0       0       0       0       0      fb      20       0
 23H,2BH,33H这里有3个段。
 也就是说RING3代码段有2个,这是为什么呢???
 其实也很简单,就是为了兼容性,大家都知道64位WNDOWS下核心是64位的,所有的驱动程序作为OS的一个部分所以也必须是64位的
 而应用层则不同,可以同时使用32位和64位,这也就是为什么要有2个RING3代码段的原因了。
 首先我们看23H的代码段
  ff      ff       0       0       0      fb      cf       0
  其CS。L=0,CS。D=0也就是当指令在这个段的时候系统处于COMPATIABLE MODE下,我们所有的32位程序执行的时候,系统会根据其
  是32位还是64位的PE来进行加载。而WOW64估计也是根据他来判断是否需要进行相应的参数转换(进行系统调用的时候)。
  而33H的代码段
  0       0       0       0       0      fb      20       0
  其CS。L=1,CS。D=0也就是当指令在这个段的时候系统处于64 BIT MODE下,也就是64位应用程序执行时候的SELECTOR。
  至于 CS。L=1,CS。D=1的这个模式AMD说是为未来处理器准备的,所以我们也就不得而知了。
  
  大家注意40H所对应的描述符是16个字节的,也就是我们所说的TSS
   68       0      70      10      4e      8b       0       0
   0      f8      ff      ff       0       0       0       0
   可见他是个基地址为0XFFFFF800004E1070界限为68H的TSS
   另外要说的是64位下的GDT是混合8,16字节的,数据代码段的描述符是8字节,而系统描述符是16个字节的,
   所以程序员在自己定位的时候需要小心。

   53H对应是RING3数据段,界限是0FFFH,基地址0FFFE0000,运行时FS指向他,估计就是运行在ring3下的程序,当前线程的 TEB 所在地址空间。
   (由此可见每个RING3程序都有4GB空间,另外的好处就是在驱动通过影射内存来实现共享内存的方式可以直接在应用的32位指针中使用,而不用进行其他转换。)
   ff       f       0       0      fe      f3      40      ff

   而后面哪个 ff      ff       0       0       0      9a      cf       0有什么用目前还不清楚请大家指点下。

   不知道大家注意了没有GDT的空间在64位下很小了,后面直接就是IDT,也就是说你根本没地方能插入我们最爱的CALL GATE,
   CALL GATE在64位下需要16个字节。估计MS也考虑到这个问题了,所以嘿嘿。。。。。
   不过还是有办法解决的,只要我们能进RING0,又有什么是不能做的呢????。。。。。。
   后面附上显示XP64下GDT的程序,由于应用和驱动都是64位的,所以建议你在WINXP-64下用,嘿嘿。。。。。。
附件名称/大小 下载次数 最后更新
2005-03-25_ShowGdt.rar (13KB)  92

最新喜欢:

JackB05JackB0...
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部