在网上看到的一篇文章如下:
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;
复制代码
今天的文章TEB结构思考分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/29378.html