• 6.[保护模式]段描述符属性_S位_TYPE域


    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
    fffff880`0470b4d0 00209b00`00000000 00cf9300`0000ffff
    fffff880`0470b4e0 00cffb00`0000ffff 00cff300`0000ffff
    fffff880`0470b4f0 0020fb00`00000000 00000000`00000000
    fffff880`0470b500 04008b70`4ec00067 00000000`fffff880
    fffff880`0470b510 ff40f3fd`f0007c00 00000000`00000000
    fffff880`0470b520 00cf9a00`0000ffff 00000000`00000000
    fffff880`0470b530 00000000`00000000 00000000`00000000

     
    只有第5位为9或者和F的才可能是代码段和数据段  

    代码段说明:

    A 访问位

    R 可读位

    C 一致位

        C= 1 一致代码段          3环可以调0环

        C= 0 非一致代码段  各自调用

    3.系统段描述符

    当s = 0 时,改段描述符为系统描述符

     小于8的是16位

     大于8为32位

  • 相关阅读:
    C# 泛型约束 xxx<T> Where T:约束(一)
    [cb]UIGrid+UIStretch的自适应
    UIButton vs UIEventListener 事件处理
    NGUI Clip Animation (UI动画)
    TexturePacker的plist切成单独小图片
    Collider Collision 区别
    It’s Time To Think Linq
    [cb]NGUI事件及复杂UI管理
    Unity Mono
    【android】getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
  • 原文地址:https://www.cnblogs.com/hanhandaren/p/11179821.html
Copyright © 2020-2023  润新知