——————
关于PEB结构在http://blog.csdn.net/betabin/article/details/7481949中列出。
——————
看SEH少不了FS段寄存器,关于其大概认识如下。
在不同的地址空间,FS段寄存器指向不同的内存段。线程运行在RING0(既系统级别)下,FS段值是0x3B(XP下的值,在2000下是0x38)。运行在RING3(用户级别)下,FS段值是0x30。而且FS段寄存器的值只能在RING0下被赋值。
一、RING3下的FS
指向的段为GDT中的0x30段。大小为4k,基地址为当前线程的TEB。(由于Windows中线程的不断切换,该段基地址是会改变的。而每个线程都有个ETHREAD结构,其KTHREAD成员有TEB成员。有点绕。)
关于TEB,结构如下:
typedef struct _TEB {
NT_TIB NtTib;
PVOID EnvironmentPointer;
CLIENT_ID ClientId;
PVOID ActiveRpcHandle;