概述:TEB(Thread Environment Block,线程环境块)指线程环境块,该结构体包含进程中运行线程的各种信息,进程中的每个线程都对应着一个TEB结构体。不同OS中TEB结构体的形态略微有点不同
微软官方文档:
[toc]
TEB 结构体定义
MSDN
1 2 3 4 5 6 7 8 9 10 11 12
| typedef struct _TEB { PVOID Reserved1[12]; PPEB ProcessEnvironmentBlock; PVOID Reserved2[399]; BYTE Reserved3[1952]; PVOID TlsSlots[64]; BYTE Reserved4[8]; PVOID Reserved5[26]; PVOID ReservedForOle; PVOID Reserved6[4]; PVOID TlsExpansionSlots; } TEB, *PTEB;
|
Windows XP SP3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| nt!_TEB +0x000 NtTib : _NT_TIB +0x01c EnvironmentPointer : Ptr32 Void +0x020 ClientId : _CLIENT_ID +0x028 ActiveRpcHandle : Ptr32 Void +0x02c ThreadLocalStoragePointer : Ptr32 Void +0x030 ProcessEnvironmentBlock : Ptr32 _PEB +0x034 LastErrorValue : Uint4B +0x038 CountOfOwnedCriticalSections : Uint4B +0x03c CsrClientThread : Ptr32 Void +0x040 Win32ThreadInfo : Ptr32 Void +0x044 User32Reserved : [26] Uint4B +0x0ac UserReserved : [5] Uint4B +0x0c0 WOW32Reserved : Ptr32 Void +0x0c4 CurrentLocale : Uint4B +0x0c8 FpSoftwareStatusRegister : Uint4B +0x0cc SystemReserved1 : [54] Ptr32 Void +0x1a4 ExceptionCode : Int4B +0x1a8 ActivationContextStack : _ACTIVATION_CONTEXT_STACK +0x1bc SpareBytes1 : [24] UChar +0x1d4 GdiTebBatch : _GDI_TEB_BATCH +0x6b4 RealClientId : _CLIENT_ID +0x6bc GdiCachedProcessHandle : Ptr32 Void +0x6c0 GdiClientPID : Uint4B +0x6c4 GdiClientTID : Uint4B +0x6c8 GdiThreadLocalInfo : Ptr32 Void +0x6cc Win32ClientInfo : [62] Uint4B +0x7c4 glDispatchTable : [233] Ptr32 Void +0xb68 glReserved1 : [29] Uint4B +0xbdc glReserved2 : Ptr32 Void +0xbe0 glSectionInfo : Ptr32 Void +0xbe4 glSection : Ptr32 Void +0xbe8 glTable : Ptr32 Void +0xbec glCurrentRC : Ptr32 Void +0xbf0 glContext : Ptr32 Void +0xbf4 LastStatusValue : Uint4B +0xbf8 StaticUnicodeString : _UNICODE_STRING +0xc00 StaticUnicodeBuffer : [261] Uint2B +0xe0c DeallocationStack : Ptr32 Void +0xe10 TlsSlots : [64] Ptr32 Void +0xf10 TlsLinks : _LIST_ENTRY +0xf18 Vdm : Ptr32 Void +0xf1c ReservedForNtRpc : Ptr32 Void +0xf20 DbgSsReserved : [2] Ptr32 Void +0xf28 HardErrorsAreDisabled : Uint4B +0xf2c Instrumentation : [16] Ptr32 Void +0xf6c WinSockData : Ptr32 Void +0xf70 GdiBatchCount : Uint4B +0xf74 InDbgPrint : UChar +0xf75 FreeStackOnTermination : UChar +0xf76 HasFiberData : UChar +0xf77 IdealProcessor : UChar +0xf78 Spare3 : Uint4B +0xf7c ReservedForPerf : Ptr32 Void +0xf80 ReservedForOle : Ptr32 Void +0xf84 WaitingOnLoaderLock : Uint4B +0xf88 Wx86Thread : _Wx86ThreadState +0xf94 TlsExpansionSlots : Ptr32 Ptr32 Void +0xf98 ImpersonationLocale : Uint4B +0xf9c IsImpersonating : Uint4B +0xfa0 NlsCache : Ptr32 Void +0xfa4 pShimData : Ptr32 Void +0xfa8 HeapVirtualAffinity : Uint4B +0xfac CurrentTransactionHandle : Ptr32 Void +0xfb0 ActiveFrame : Ptr32 _TEB_ACTIVE_FRAME +0xfb4 SafeThunkCall : UChar +0xfb5 BooleanSpare : [3] UChar
|
各变量说明
“_TEB” 是一个Windows内核对象的结构体,用于描述一个线程的状态和信息。它包含了线程的一些基本信息,例如线程的堆栈指针、环境变量、堆栈大小等。
以下是 “_TEB” 结构体中的一些常用变量及其说明:
- *NtTeb: 指向当前线程的 “_TEB” 结构体的指针。
- StackBase: 指向线程的堆栈起始地址。
- StackLimit: 指向线程的堆栈结束地址。
- StackReserveSize: 指定线程的堆栈大小。
- EnvironmentPointer: 指向线程的环境变量的指针。
- ThreadLocalStoragePointer: 指向线程的线程局部存储空间的指针。
- *ProcessEnvironmentBlock: 指向进程的环境变量的指针。
- BasePriority: 指定线程的优先级。
- UniqueThreadID: 指定线程的唯一ID。
- IdealProcessor: 指定线程的理想处理器。
- IdealProcessorGroup: 指定线程的理想处理器组。
- ThreadLocale: 指定线程的本地化信息。
- ActiveStackAddress: 指向线程当前活跃的堆栈地址。
- TlsSlots: 指向线程的线程局部存储空间的指针数组。
- TlsExpansionSlots: 指定线程的线程局部存储空间的扩展槽数量。
- Reserved: 保留字段。
- Reserved2: 保留字段。
这些变量可以用于查看和分析线程的状态和信息。您可以使用Windows调试工具中的 “dt” 命令查看这些变量的值和相关信息,例如:
其中 “<teb_object>” 是线程的 “_TEB” 结构体的实例,例如 “fffffa800cd85b00”。这将显示线程的名称、大小、当前线程等信息。您可以根据需要进一步查看和分析这些信息。
重要成员
在用户模式调试中起着重要作用的成员有2个,如下:
1 2 3
| +0x000 NtTib : _NT_TIB ……………………………………………………………………………… +0x030 ProcessEnvironmentBlock : Ptr32 _PEB
|
ProcessEnvironmentBlock成员:
先看Offset 30处的ProcessEnvironmentBlock成员,它是指向PEB(Process Environment Block,进程环境块)结构体指针。PEB是进程环境块,每个进程对应1个PEB结构体。
NtTib成员
TEB
结构体的第一个成员为_NT_TIB
结构体(TIB
是Thread Information Block的简称,意为“线程信息块”),_NT_TIB
结构体的定义如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| typedef struct _NT_TIB { 00h struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; 04h PVOID StackBase; 08h PVOID StackLimit; 0ch PVOID SubSystemTib; union { PVOID FiberData; 10h DWORD Version; }; 14h PVOID ArbitraryUserPointer; 18h struct _NT_TIB *Self; }NT_TIB; typedef NT_TIB *PNT_TIB;
|
ExceptionList成员指向_EXCEPTION_REGISTRATION_RECORD结构体组成的链表,它用于Windows OS的SEH。Self成员是_NT_TIB结构体的自引用指针,也是TEB结构体的指针(因为TEB结构体的第一个成员就是_NT_TIB结构体)。那么我们如何在用户模式下访问到TEB结构体呢?只有访问它才能使用相应信息。