TEB指线程环境块,该结构体包含进程中运行线程的各种信息,进程中的每个线程都对应一个TEB结构体。Windows7中的TEB结构体成员。
+0x000 NtTib
: _NT_TIB
+0x01c EnvironmentPointer
: Ptr32 Void
+0x020 ClientId
: _CLIENT_ID //进程的pid
+0x028 ActiveRpcHandle
: Ptr32 Void
+0x02c ThreadLocalStoragePointer
: Ptr32 Void
+0x030 ProcessEnvironmentBlock
: Ptr32 _PEB //进程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 //TLS值 是个数组
[64
]
+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 //TLS扩展值 是个数组
[Ptr32
]
+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结构体的成员多尔复杂,在用户模式调试中起着重要作用的成员有2个。
+0x000 NtTib
: _NT_TIB
....
+0x030 ProcessEnvironmentBlock
: Ptr32 _PEB //进程PEB
先看Offset 30处的ProcessEnvironmentBloack成员,它是指向PEB(进程环境块)结构体的指针,PEB是进程环境块,每个进程对应1个PEB结构体。TEB结构体的第一个成员为_NT_TIB结构体(TIB是Thread Information Block的简称,意为线程信息块),_NT_TIB结构体的定义如下所示:
typedef struct _NT_TIB
{
struct _EXCEPTION_REGISTRATION_RECORD
*ExceptionList
;
PVOID StackBase
;
PVOID StackLimit
;
PVOID SubSystemTib
;
union {
PVOID FiberData
;
DWORD Version
;
};
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() API。 查找到NtCurrentTeb函数后,使用鼠标双击即可跳转到该API的代码处。 NtCurrentTeb()函数内部代码非常简单,只返回FS:[18]地址值,FS:[18]的实际地址为002C3000,即NtCurrentTeb() API返回的是002C3000,该地址就是当前线程的TEB的地址。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结构体的起始地址,也就是TEB的起始地址。FS:[0x30]=PEB起始地址 => 通过TEB的ProcessEnvironment Block成员可用获取PEB结构体的起始地址,PEB结构体多用于反调试。FS:[0]=SEH起始地址 => SEH是WIndows操作系统中的结构化异常处理基址,常用于反调试技术。