最近在看SEH的东西,说道 fs:[0]总是指向链表顶端,于是打开OD 

fs=003B
.....
fs:[0] = 0012FCAC
fs:[4] = 00130000
fs寄存器怎么寻址的? 
乘16+偏移?
是指向内存吗?
 so confused ..... 

  • 标 题:答复
  • 作 者:gezz
  • 时 间:2010-12-10 10:21:25

FS寄存器指向当前活动线程的TEB结构(线程结构)

偏移  说明

000  指向SEH链指针

004  线程堆栈顶部

008  线程堆栈底部

00C  SubSystemTib

010  FiberData

014  ArbitraryUserPointer

018  FS段寄存器在内存中的镜像地址

020  进程PID

024  线程ID

02C  指向线程局部存储指针

030  PEB结构地址(进程结构)

034  上个错误号

  • 标 题:答复
  • 作 者:SJQIANG
  • 时 间:2010-12-10 10:30:08

楼主没发现03B后面还有东西吗,完整的是

FS 003B 32位 7FFDF000

其中后面的7FFDF000才是FS:[0]的位置,OD的内存窗口中可以直接看到这个地址。
因为FS是段寄存器,所以只有16位,是从以前的实模式保留下来的。
实模式中段寄存器保存的是段地址,但是在保护模式下保存的是段选择子,和实模式是完全不同的。
关于段选择子楼主可以去看看关于保护模式的资料。

  • 标 题:答复
  • 作 者:wingdbg
  • 时 间:2010-12-11 11:59:50

Windows在创建线程时,操作系统会为每个线程分配TEB结构,并且将FS段选择器指向当前线程的TEB数据结构。

代码:
   Typedef   struct _NT_TIB {  

   Struct _EXCEPTION_REGISTERATION_RECORD * ExceptionList;

   PVOID StackBase;

   PVOID StackLimit;

PVOID SubSystemTib;

   Union {

          PVOID FiberData;

          ULONG Version;

      };

      PVOID ArbitaryUserPointer;

   Struct    _NT_TIB * Self;

} NT_TIB;
上面结构体,很明显:
000  指向SEH链指针

004  线程堆栈顶部

008  线程堆栈底部

00C  SubSystemTib

010  FiberData

014  ArbitraryUserPointer

018  FS段寄存器在内存中的镜像地址

020  进程PID

024  线程ID

02C  指向线程局部存储指针

030  PEB结构地址(进程结构)

034  上个错误号