您的位置:首页 > 其它

TEB结构思考

2015-11-08 11:25 274 查看
在网上看到的一篇文章如下:

TEB与PEB的结构分析,如阿燐燐所诉FS寄存器指向当前活动线程的TEB结构(线程结构)

用OD打开一个任意程序可以看到FS段寄存器的状况,

其中选择子是003B,在GDT中的起始位置是7FFDF000,大小是00FFFFFF,是一个RING3的调用门。

在数据窗口中跟踪7FFDF000然后以长型地址的方式查看数据,可以完整的看到TEB结构




而FS:[18]则是TEB 7FFDF000的指针。

FS:[0]

FS:[30]

都是FS:[18]结构中的一部分。在程序初始化的过程中,FS在GDT中得到一个大小是00FFFFFF,起始位置为7FFDF000可以被RING3权限程序控制的地址空间。并且把程序的一些线程和进程信息存放在此处。

而整个表的指针放在FS:[18]中。

当时考虑为什么要通过获取FS:[18],而不是直接获取FS的值呢,其实是因为使用FS:[18]这样的形式可以让cpu自动实现地址翻译,即我们使用的段寻址方式来获取地址,如果

直接用FS寄存器,得到的是一个16为的段选择子,如果用FS:[0],则得到的是TEB指针偏移0处的值为地址,从该地址里取出来的值,已经不是FS这个段选择子表示的地址了,

从而也就不是TEB的地址了,因此需要绕一个弯,从偏移18h处取得TEB的指针,也就是TEB的地址,然后再按照TEB结构来获取其它的变量,如PEB等。

TEB结构

//

// Thread Environment Block (TEB)

//

typedef struct _TEB

{

NT_TIB Tib; /* 00h */

PVOID EnvironmentPointer; /* 1Ch */

CLIENT_ID Cid; /* 20h */

PVOID ActiveRpcHandle; /* 28h */

PVOID ThreadLocalStoragePointer; /* 2Ch */

struct _PEB *ProcessEnvironmentBlock; /* 30h */

ULONG LastErrorValue; /* 34h */

ULONG CountOfOwnedCriticalSections; /* 38h */

PVOID CsrClientThread; /* 3Ch */

struct _W32THREAD* Win32ThreadInfo; /* 40h */

ULONG User32Reserved[0x1A]; /* 44h */

ULONG UserReserved[5]; /* ACh */

PVOID WOW32Reserved; /* C0h */

LCID CurrentLocale; /* C4h */

ULONG FpSoftwareStatusRegister; /* C8h */

PVOID SystemReserved1[0x36]; /* CCh */

LONG ExceptionCode; /* 1A4h */

struct _ACTIVATION_CONTEXT_STACK *ActivationContextStackPointer; /* 1A8h */

UCHAR SpareBytes1[0x28]; /* 1ACh */

GDI_TEB_BATCH GdiTebBatch; /* 1D4h */

CLIENT_ID RealClientId; /* 6B4h */

PVOID GdiCachedProcessHandle; /* 6BCh */

ULONG GdiClientPID; /* 6C0h */

ULONG GdiClientTID; /* 6C4h */

PVOID GdiThreadLocalInfo; /* 6C8h */

ULONG Win32ClientInfo[62]; /* 6CCh */

PVOID glDispatchTable[0xE9]; /* 7C4h */

ULONG glReserved1[0x1D]; /* B68h */

PVOID glReserved2; /* BDCh */

PVOID glSectionInfo; /* BE0h */

PVOID glSection; /* BE4h */

PVOID glTable; /* BE8h */

PVOID glCurrentRC; /* BECh */

PVOID glContext; /* BF0h */

NTSTATUS LastStatusValue; /* BF4h */

UNICODE_STRING StaticUnicodeString; /* BF8h */

WCHAR StaticUnicodeBuffer[0x105]; /* C00h */

PVOID DeallocationStack; /* E0Ch */

PVOID TlsSlots[0x40]; /* E10h */

LIST_ENTRY TlsLinks; /* F10h */

PVOID Vdm; /* F18h */

PVOID ReservedForNtRpc; /* F1Ch */

PVOID DbgSsReserved[0x2]; /* F20h */

ULONG HardErrorDisabled; /* F28h */

PVOID Instrumentation[14]; /* F2Ch */

PVOID SubProcessTag; /* F64h */

PVOID EtwTraceData; /* F68h */

PVOID WinSockData; /* F6Ch */

ULONG GdiBatchCount; /* F70h */

BOOLEAN InDbgPrint; /* F74h */

BOOLEAN FreeStackOnTermination; /* F75h */

BOOLEAN HasFiberData; /* F76h */

UCHAR IdealProcessor; /* F77h */

ULONG GuaranteedStackBytes; /* F78h */

PVOID ReservedForPerf; /* F7Ch */

PVOID ReservedForOle; /* F80h */

ULONG WaitingOnLoaderLock; /* F84h */

ULONG SparePointer1; /* F88h */

ULONG SoftPatchPtr1; /* F8Ch */

ULONG SoftPatchPtr2; /* F90h */

PVOID *TlsExpansionSlots; /* F94h */

ULONG ImpersionationLocale; /* F98h */

ULONG IsImpersonating; /* F9Ch */

PVOID NlsCache; /* FA0h */

PVOID pShimData; /* FA4h */

ULONG HeapVirualAffinity; /* FA8h */

PVOID CurrentTransactionHandle; /* FACh */

PTEB_ACTIVE_FRAME ActiveFrame; /* FB0h */

PVOID FlsData; /* FB4h */

UCHAR SafeThunkCall; /* FB8h */

UCHAR BooleanSpare[3]; /* FB9h */

} TEB, *PTEB;

复制代码

PEB结构

typedef struct _PEB

{

UCHAR InheritedAddressSpace; // 00h

UCHAR ReadImageFileExecOptions; // 01h

UCHAR BeingDebugged; // 02h

UCHAR Spare; // 03h

PVOID Mutant; // 04h

PVOID ImageBaseAddress; // 08h

PPEB_LDR_DATA Ldr; // 0Ch

PRTL_USER_PROCESS_PARAMETERS ProcessParameters; // 10h

PVOID SubSystemData; // 14h

PVOID ProcessHeap; // 18h

PVOID FastPebLock; // 1Ch

PPEBLOCKROUTINE FastPebLockRoutine; // 20h

PPEBLOCKROUTINE FastPebUnlockRoutine; // 24h

ULONG EnvironmentUpdateCount; // 28h

PVOID* KernelCallbackTable; // 2Ch

PVOID EventLogSection; // 30h

PVOID EventLog; // 34h

PPEB_FREE_BLOCK FreeList; // 38h

ULONG TlsExpansionCounter; // 3Ch

PVOID TlsBitmap; // 40h

ULONG TlsBitmapBits[0x2]; // 44h

PVOID ReadOnlySharedMemoryBase; // 4Ch

PVOID ReadOnlySharedMemoryHeap; // 50h

PVOID* ReadOnlyStaticServerData; // 54h

PVOID AnsiCodePageData; // 58h

PVOID OemCodePageData; // 5Ch

PVOID UnicodeCaseTableData; // 60h

ULONG NumberOfProcessors; // 64h

ULONG NtGlobalFlag; // 68h

UCHAR Spare2[0x4]; // 6Ch

LARGE_INTEGER CriticalSectionTimeout; // 70h

ULONG HeapSegmentReserve; // 78h

ULONG HeapSegmentCommit; // 7Ch

ULONG HeapDeCommitTotalFreeThreshold; // 80h

ULONG HeapDeCommitFreeBlockThreshold; // 84h

ULONG NumberOfHeaps; // 88h

ULONG MaximumNumberOfHeaps; // 8Ch

PVOID** ProcessHeaps; // 90h

PVOID GdiSharedHandleTable; // 94h

PVOID ProcessStarterHelper; // 98h

PVOID GdiDCAttributeList; // 9Ch

PVOID LoaderLock; // A0h

ULONG OSMajorVersion; // A4h

ULONG OSMinorVersion; // A8h

ULONG OSBuildNumber; // ACh

ULONG OSPlatformId; // B0h

ULONG ImageSubSystem; // B4h

ULONG ImageSubSystemMajorVersion; // B8h

ULONG ImageSubSystemMinorVersion; // C0h

ULONG GdiHandleBuffer[0x22]; // C4h

PVOID ProcessWindowStation; // ???

} PEB, *PPEB;

复制代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: