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返回的数据:

0:004> r
eax=7ffda000 ebx=00000000 ecx=00000000 edx=7777d7eb esi=00000000 edi=00000000
eip=77713370 esp=023bfe30 ebp=023bfe5c iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000 efl=00000246
0:004> reax=7ffda000 ebx=00000000 ecx=00000000 edx=7777d7eb esi=00000000 edi=00000000eip=77713370 esp=023bfe30 ebp=023bfe5c iopl=0         nv up ei pl zr na pe nccs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246 可以看到cs=001b=11011 表示了在表中索引为11(b)=3(d),即第三个,TI=0,指向GDT,RPL为3 那么来看看选择子指向的段描述符的内容: 使用dg(Display selector)命令:

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,调用门,中断门,陷阱门描述符。




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee