171124 逆向-线程环境块(TEB)

1625-5 王子昂 总结《2017年11月24日》 【连续第420天总结】
A. TEB(线程环境块)
B.

介绍

该结构体中包含进程中运行线程的各种信息,每个线程都对应一个TEB结构体。
不同OS中TEB结构的形态略微不同。

定义

结构体中有非常多的成员,其中用户模式调试中起着重要作用的成员有两个:

+0 NtTib : _NT_TIB
...
+0X30 ProcessEnvironmentBlock : Ptr32_PEB

偏移0x30处的ProcessEnvironmentBlock是指向PEB(进程环境块)结构体的指针
偏移0处的_NT_TIB结构体内容如下

typedef struct _NT_TIB {
 struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
 PVOID StackBase;
 PVOID StackLimit;
 PVOID SubSystemTib;
 union {
  PVOID FiberData;
  DWORD Version;
 };
 PVOID ArbitraryUserPointer;
 struct _NT_TIB *Self;
};

ExceptionList成员指向_EXCEPTION_REGISTRATION_RECORD结构体组成的链表,用于Windows OS的SEH(异常处理机制)
Self成员是结构体的自引用指针

访问方法

内核模式下可以直接查看内核的内存,但是用户模式下由于没有相关权限,所以只能通过OS提供的API来访问

Ntdll.NtCurrentTeb()

用来返回当前线程的TEB结构体的地址
函数体:

mov eax, DWORD PTR FS:[18]
RETN
FS段寄存器

FS段寄存器就是专门用来指示当前线程的TEB结构体的
具体方法为
FS寄存器指示SDT的索引,其中存放着TEB结构体的地址

SDT位于内核内存区域,地址存放在GDTR(全局描述符表寄存器)中
因此GDTR+FS就可以得到TEB结构体的指针了

从而有
FS:[0x18] = FS:0
(+0x18处就是self指针)
FS:[0x30] = &PEB
FS:[0] = &SEH

C. 明日计划
线程环境块PEB

你可能感兴趣的:(杂七杂八)