Windows内核基础知识-2-段描述符
比如:
ES 002B 0(FFFFFFFF)
意思就是es段寄存器,段选择子/段选择符 为002B,
起始地址base为0,
限制范围Limit地址最大能寻找的长度为:FFFFFFFF,表示的是一个范围。从.base到最后最长的地址的相对值。
简单来说就是偏移地址的范围。地址=段寄存器基址base+偏移地址,这个limit可以理解为偏移地址的范围
可以看到所有的段寄存器除了FS别的都是一样的。
获取段寄存器的信息:
如果你正常在调试,用什么WinDbg这种工具,就只能看到的是段选择子,不会有后面的什么基址,偏移地址范围这种东西。
段寄存器这么多信息存放在了哪里?
破案了,段寄存器的一堆属性都存放在了一张表里,可以理解为是一个数组,一个QWORD类型数组
通过段选择子来获取段寄存器信息
只有段选择子是公布出来了的,所以直接通过它来找信息了。
段选择子的结构体:
RPL:请求特权级别(Request Privilege Level),就是请求访问者所使用的权限级别。
TI:这个标志位决定要去什么表里查询数据:0表示GDT表,1表示LDT表
GDT表:可以认为是一个数组,元素为QWORD(64位)大小
Index:数据所在表的索引
例子:
这里来获取一下es的内容
es = 23 ==00100 0 11
拆下来就是 :
RPL=11
TI=0
索引值=00100 = (D)4(十进制的4)
gtd表的首地址保存在gdtr寄存器里面,同理ldt也是。gdtr和ldtr并不是真正是寄存器,只是一个虚拟的。
在WinDbg里面查看gdtr的内容:
查看索引为4的内容(索引为4就是第五个):
这个东西对应的内容就是段描述符了,所有的段寄存器内容都在里面。