TEB是一个线程环境块,其中包含有关进程中正在运行的线程的各种信息,进程中的每个线程都对应一个TEB结构。 Windows7的TEB结构成员。0x 000 nt TiB : _ nt _ TiB0x 01 cenvironmentpointer : ptr 32 void0x 020 clientid : _ client _ id/进程的PID0x 028 activerpchandle : ptr 32 void0x02 cthreadlocalstoragepointer : ptr 32 void0x 030 processenvironmentblock 3360 ptr 32 _ 2 alue : uint 4b0x 038 countofownedcriticalsections 3360 uint 4b0x 03 ccsrclientthread 3360 ptr 040 win32 three ad 3360 ptr 32 void0x 040 4 user32 reserved : [ 26 ] uint 4b0x0acuserreserved : [5] uint 4b0x0c0wow 32 reserved : ptr 32 void0x0C4 current locale 3360 uint 4b0x0c8 fpsoftwarestatusregister 3360 uint 4b0x0ccsystemreserved 60 ptr 32 void0x1a4 exception code : int 4b0x1A8 activationcontextstack : _ activation _ context _ stack0x1bcsparebytttack uchar ch0x 6b4real clientid : _ client _ id0x6bcgdicachedprocesshandle 3360 ptr 32 vool 3360 uint 4b0x6C4 gdiclienttid 3360 uint 4b0x6c8 gdic8 gdic8 x6cc win32 client info : [ 62 ] uint 4b0x7C4 gldispatchtable : [ 233 ] ptr 32 void0x b 68gl reserved 13360 [ 29 ] uint 4b0xbdcglreserved 2: ptr 32 void0x be0glsectioninfo : ptr 32 void0x be4GL section : ptr 32 void0x be8GL table 3360 ptr 332 void0x bex oid0x BF0GL context : ptr 32 void0x BF4laststatusvalue 3360 uint 4b0x BF8staticunicodestring 3360 _ unicode string 3600xc 00 staticunicunicode uint 2b0x E0 cdeallocationstack : ptr 32 void0x e 10 TLS slots : [ 64 ] ptr 32 void////TLS值为一个0x F10 TLS links : _ list _ entry0x f 18 VDM : ptr 32 void0x f1 creservedforntrpc : ptr 32 void0x f 20 dbgsreserved 3360 [2] ptr 32 void0x f 28 harderrorsaredisabled 3360 uint 4b0x F2 cinstrumentation 3360 [ 16 ] ptr 32 void0x F6 cwinsockdata : ptr 32 void0x f 70 gdibatchcount 3360 uint 4b0x f 74 indbgprint : uchar0x f 75 freestackontermination : uchation in ation 3360 uchar ar0x f 76 hasfiberdata : uchar0x f77 ideal processor 3360 uchar0x f78 spare 3: uint 4b0x f7creservedforperf 3360 ptr 32 vtr : ptr 32 void0x f 84 waitingonloaderlock : uint 4b0x f 88w x86 thread : _ w x86 threadstate0x f 94 tlsexpansionslots 3360 ptr 32 d///ted0xf 98 impersonation locale : uint 4b0x F9 cis impersonating : uint 4b0x fa0nlscache : ptr 32 void0x fa4pshimdata 3360 ptr 332 void0x fa 8 0 uint 4b0xfaccurrenttransactionhandle : ptr 32 void0x FB0active frame : ptr 32 _ teb _ active frame 002 3360 uchar0x f b5 booolean0x 000 nt TiB : _ nt _ TiB .0x 030 ProcessEnvironmentBloack : ptr 32 _ peb//进程peb首先是Offset 30的processenvironmentblock
TEB结构的第一个成员是_NT_TIB结构,_NT_TIB是Thread Information Block的简称,表示线程信息块。 _NT_TIB结构的定义如下。 typedef struct _ nt _ TiB { struct _ } pvoid stack base; pvoid堆栈限制; PVOID SubSystemTib; union {PVOID FiberData; dword版本; ; PVOID ArbitraryUserPoninter; struct _NT_TIB *self; } NT_TIB; typedef NT_TIB *PNT_TIB; ExceptionList成员指向由_EXCEPTION_REGISTRATION_RECORD结构组成的链表,并用于Windows OS操作系统的SEH。 Self成员是指向_NT_TIB结构的自引用指针,也是指向TEB结构的指针。 TEB访问方法ntdll.ntcurrentTEB ntdll.ntcurrentteb ) ) API用于返回当前线程的teb结构的地址。 首先在OllyDbg中打开Notepad.exe程序,从右键单击菜单中选择Search for Name in all modules菜单,然后在Name in all modules对话框中输入ntdll.NtCurrentTeb )
找到NtCurrentTeb函数后,用鼠标双击可跳转到该API的代码处。
NtCurrentTeb )函数的内部代码非常简单,只返回fs: ) 18 )的地址值,fs: ) 18 )的实际地址为002C3000 即NtCurrentTeb ) ) API为022 TEB结构的地址002C3000与FS段寄存器所指向的动人标记的基地址相同,这意味着TEB与FS段寄存器有某种关联。 FS段寄存器FS段寄存器用于表示当前线程的TEB结构。 FS寄存器不是直接指向TEB构造体的地址,而是具有SDT的索引,该索引具有实际的TEB地址。 SDT位于内核存储器区域,其地址存储在特殊的寄存器GDTR 全局描述符寄存器)中。
由于段寄存器中实际存储了SDT的索引,因此也称为段选择器,TEB结构位于FS段选择器所指的感动性标记的开头。 根据FS:[0x18]=TEB开始地址=_NT_TIB结构的定义,结构的最后一个Self成员正好位于从TEB结构偏移018的位置,Self指针变量为_NT_TIB结构的开始地址FS:[0x30]=PEB开始地址可以从TEB的ProcessEnvironment Block成员中获取PEB结构的开始地址。 PEB结构经常用于调试对策。 FS:[0]=SEH开始地址=SEH是WIndows操作系统中结构化异常处理的基本地址,常用于调试技术。