1.S位
S = 1 代码段或者数据段描述符
S = 0 系统段描述符
注意:DPL在WINDOWS内只会出现两种情况,全是0或者1
代码段那么P为已经确定为1
S也为1
那么DPL 为0 则是9
为1 则是F
2.TYPE域
TYPE域小于8则为数据段
大于8则是代码段
数据段说明:
8A 代表是否被加载如果访问过则为1 反之则为0
9W 代表是否可写,如果为0则代表不可写,反之亦然
10E 拓展位, 为0 向上拓展,为1向下拓展
第一步:先构造一个向下拓展的段描述符
00cf9700`0000ffff
第二步:段描述符加载到段寄存器里
0: kd> dq gdtr L40 80b95000 00000000`00000000 00cf9b00`0000ffff 80b95010 00cf9300`0000ffff 00cffb00`0000ffff 80b95020 00cff300`0000ffff 80008b1e`600020ab 80b95030 84409333`dc003748 0040f300`00000fff 80b95040 0000f200`0400ffff 00000000`12345678 80b95050 84008933`b0000068 84008933`b0680068 80b95060 00000000`00000000 00000000`00000000 80b95070 800092b9`500003ff 00000000`00000000 80b95080 00000000`00000000 00000000`00000000 80b95090 00000000`00000000 00000000`00000000 0: kd> eq 80b95090 00cf9700`0000ffff //构造向下拓展 0: kd> dq gdtr L40 80b95000 00000000`00000000 00cf9b00`0000ffff 80b95010 00cf9300`0000ffff 00cffb00`0000ffff 80b95020 00cff300`0000ffff 80008b1e`600020ab 80b95030 84409333`dc003748 0040f300`00000fff 80b95040 0000f200`0400ffff 00000000`12345678 80b95050 84008933`b0000068 84008933`b0680068 80b95060 00000000`00000000 00000000`00000000 80b95070 800092b9`500003ff 00000000`00000000 80b95080 00000000`00000000 00000000`00000000 80b95090 00cf9700`0000ffff 00000000`00000000
3.结果显示不能读写因为在BASE+LIMIT里面,但是如果超出绿色范围则能读写
//读写测试,测试在向下拓展中 fs.base+limit是否能读写
#include "stdafx.h" #include <stdlib.h> int value = 0; int main() { //进入内联汇编 __asm { mov ax, 0x93; mov ds, ax; mov edx, 0x20; mov dword ptr ds:[value],edx }; printf("%x ", value); return 0; }
** 栈操作由操作系统自动SS去描述
fffff880`0470b4c0 00000000`00000000 00000000`00000000 |
|
只有第5位为9或者和F的才可能是代码段和数据段 |
代码段说明:
A 访问位
R 可读位
C 一致位
C= 1 一致代码段 3环可以调0环
C= 0 非一致代码段 各自调用
3.系统段描述符
当s = 0 时,改段描述符为系统描述符