Win - lethelog
软件调试阅读笔记
1.分段机制 segmentation
详细信息可以参见Intel Architectures Software Developer’s Manual,最近主要结合windbg学习一下。 segment descriptor 段描述符,由段选择子segment selector指向,段选择子的格式:
15 3 2 1 0
+---------------------------------------+---------+
| index | TI | RPL |
+---------------------------------------+---------+
其中的index不需要怎么解释,就是在GDT/LDT中的索引号,TI为1/0是表示指向GDT/LDT,RPL为特权检查用。 对于每个segment descriptor里面包含了段基地址,段边界,段类型,以及一些其他描述域。 在Windbg中,r命令显示寄存器。
用法(User-mode):[~Thread] r[M Mask|F|X|?] [ Register[:[Num]Type] [= [Value]] ] r.
不知道为啥我用 r gdtr不行。 言归正传,来看一下r返回的数据:
dg FirstSelector [LastSelector]
s这里直接填入的是selector而不是索引值,因为如果不填入完全的selector也不知道到底是去GDT中找还是去LDT中。
0:004> dg cs
P Si Gr Pr Lo
Sel Base Limit Type l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
001B 00000000 ffffffff Code RE Ac 3 Bg Pg P Nl 00000cfb
可以看到基地址为0,边界为F*8,就是4G吧。类型为code(executable) RE(Read Only) Ac(Accessed访问过),PL=3(和RPL有关系么),Size表示的是代码的长度,为Bg即32位代码,Pg表示粒度单位为内存页, Pres(Present)即在内存中是否存在,Long下的Nl表示not long, 非64位。 还存在一类系统描述符,描述符中的S位为0,表示系统描述符,包括了LDT描述符,TSS,调用门,中断门,陷阱门描述符。