我是靠谱客的博主 高大缘分,最近开发中收集的这篇文章主要介绍TEB,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  1. TEB指线程环境块,该结构体包含进程中运行线程的各种信息,进程中的每个线程都对应一个TEB结构体。
  2. 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
   ...
  1. 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访问方法

  1. 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段寄存器有着某种关联。
  1. 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操作系统中的结构化异常处理基址,常用于反调试技术。

最后

以上就是高大缘分为你收集整理的TEB的全部内容,希望文章能够帮你解决TEB所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(30)

评论列表共有 0 条评论

立即
投稿
返回
顶部