第46章:TEB
TEB(Thread Environment Block,线程环境块),此结构体包含进程中运行的线程的各种信息,进程中的每个线程都对应一个 TEB 结构体。
由于微软的符号服务器无法正常访问,因此在没有符号的情况下,无法查看自己系统中 TEB 结构体。
TEB 结构体成员众多且结构复杂,在用户模式下起着重要作用的成员有2个:
ProcessEnvironmentBlock 成员指向 PEB (进程环境块)。NT_TIB(TIB 是 Thread Information Block 的简称):
TEB 访问方法——通过 Ntdll.CurrentTeb() API 来返回当前线程的 TEB 结构体地址
返回的 FS:[18] 指向 7FFDF000 ,即 TEB 的首地址。
FS 段寄存器
FS段寄存器用来指示当前线程的 TEB 结构体。IA-32 中进程的虚拟内存为 4GB ,但寄存器大小只有16位,因此 FS 寄存器持有 SDT 的索引,而该索引持有实际的 TEB 地址。
通过访问 GDTR 获得 GDT(SDT 即段描述符表,是 GDT 的一个数据结构项) 的入口地址从而访问到 TEB,因此 FS 寄存器也叫段选择符。
FS:[18] 表示 TEB 起始地址,FS:[30] 表示 PEB 起始地址,FS:[0] 表示 SEH 起始地址。