幻影梦魇 发表于 2010-12-9 17:12:17

TEB结构、PEB结构

本帖最后由 幻影梦魇 于 2010-12-9 18:02 编辑

[*]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;             /* 44h */
    ULONG UserReserved;                  /* ACh */
    PVOID WOW32Reserved;                  /* C0h */
    LCID CurrentLocale;                     /* C4h */
    ULONG FpSoftwareStatusRegister;         /* C8h */
    PVOID SystemReserved1;            /* CCh */
    LONG ExceptionCode;                     /* 1A4h */
    struct _ACTIVATION_CONTEXT_STACK *ActivationContextStackPointer; /* 1A8h */
    UCHAR SpareBytes1;                /* 1ACh */
    GDI_TEB_BATCH GdiTebBatch;            /* 1D4h */
    CLIENT_ID RealClientId;               /* 6B4h */
    PVOID GdiCachedProcessHandle;         /* 6BCh */
    ULONG GdiClientPID;                     /* 6C0h */
    ULONG GdiClientTID;                     /* 6C4h */
    PVOID GdiThreadLocalInfo;               /* 6C8h */
    ULONG Win32ClientInfo;            /* 6CCh */
    PVOID glDispatchTable;            /* 7C4h */
    ULONG glReserved1;                /* 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;       /* C00h */
    PVOID DeallocationStack;                /* E0Ch */
    PVOID TlsSlots;                   /* E10h */
    LIST_ENTRY TlsLinks;                  /* F10h */
    PVOID Vdm;                              /* F18h */
    PVOID ReservedForNtRpc;               /* F1Ch */
    PVOID DbgSsReserved;               /* F20h */
    ULONG HardErrorDisabled;                /* F28h */
    PVOID Instrumentation;            /* 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;                  /* 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; // 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; // 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; // C4h
    PVOID ProcessWindowStation; // ???
} PEB, *PPEB;

      

转自pediy

幻影梦魇 发表于 2010-12-9 18:17:54

简单说个例子MOV EAX,FS: 获得TEB指针送EAX,MOV EAX,DS:, CLIENT_ID Cid;   获得进程PID送EAX。

阿燐燐 发表于 2010-12-9 21:05:09

MOV EAX,FS: 这一句没看懂,然后到网上搜一下,找到如下资料,然后懂了……

FS寄存器指向当前活动线程的TEB结构(线程结构)
偏移说明
000指向SEH链指针
004线程堆栈顶部
008线程堆栈底部
00CSubSystemTib
010FiberData
014ArbitraryUserPointer
018FS段寄存器在内存中的镜像地址
020进程PID
024线程ID
02C指向线程局部存储指针
030PEB结构地址(进程结构)
034上个错误号

幻影梦魇 发表于 2010-12-9 21:11:38

本帖最后由 幻影梦魇 于 2010-12-10 01:36 编辑

准确的来说FS:是TEB结构的指针这个指针指向 TEB结构
MOV EAX,FS:   用OD 在数据窗口中跟踪EAX    然后选择长型-地址方式显示数据 可以看到TEP结构
除了TEB和PEB   SEH的异常处理也蛮神奇的 FS:

眠羽 发表于 2010-12-10 01:09:50

本帖最后由 眠羽 于 2010-12-10 01:10 编辑

能讲解一下,这个能干什么吗?
PS:还有,请善用编辑功能,不要连贴,否则会有妖怪来吃你。。。

幻影梦魇 发表于 2010-12-10 01:33:57

妖怪0.0   好卡帕 - =

cxl2008cxl 发表于 2010-12-10 10:22:29

这么长,而且这是什么?

染染18岁 发表于 2010-12-12 20:27:34

连我这只学计算机的生物都看不懂。。 不愧为技术宅吗。。

幻影梦魇 发表于 2010-12-12 20:54:59

我也是看雪转的,大致的意思就是FS:记录的一个数据结构。PEB包含在TEB中偏移是0x30


有时间会写一个详细的过程。

---------我是渣包

十二 发表于 2010-12-14 15:02:06

MOV EAX,FS: 这一句没看懂,然后到网上搜一下,找到如下资料,然后懂了……

FS寄存器指向当前 ...
阿燐燐 发表于 2010-12-9 21:05 http://bbs.nyasama.com/images/common/back.gif


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

用OD打开一个任意程序可以看到FS段寄存器的状况,其中选择子是003B,在GDT中的起始位置是7FFDF000,大小是00FFFFFF,是一个RING3的调用门。

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

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

FS:
FS:

都是FS:结构中的一部分。

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

而整个表的指针放在FS:中。
页: [1] 2
查看完整版本: TEB结构、PEB结构