设为首页收藏本站喵玉殿官方微博

喵玉殿论坛 · 喵玉汉化组

 找回密码
 少女注册中
搜索
查看: 20343|回复: 11

[编程算法] TEB结构、PEB结构

[复制链接]
发表于 2010-12-9 17:12:17 | 显示全部楼层 |阅读模式
本帖最后由 幻影梦魇 于 2010-12-9 18:02 编辑

  • TEB结构

    1. //
    2. // Thread Environment Block (TEB)
    3. //
    4. typedef struct _TEB
    5. {
    6.     NT_TIB Tib;                             /* 00h */
    7.     PVOID EnvironmentPointer;               /* 1Ch */
    8.     CLIENT_ID Cid;                          /* 20h */
    9.     PVOID ActiveRpcHandle;                  /* 28h */
    10.     PVOID ThreadLocalStoragePointer;        /* 2Ch */
    11.     struct _PEB *ProcessEnvironmentBlock;   /* 30h */
    12.     ULONG LastErrorValue;                   /* 34h */
    13.     ULONG CountOfOwnedCriticalSections;     /* 38h */
    14.     PVOID CsrClientThread;                  /* 3Ch */
    15.     struct _W32THREAD* Win32ThreadInfo;     /* 40h */
    16.     ULONG User32Reserved[0x1A];             /* 44h */
    17.     ULONG UserReserved[5];                  /* ACh */
    18.     PVOID WOW32Reserved;                    /* C0h */
    19.     LCID CurrentLocale;                     /* C4h */
    20.     ULONG FpSoftwareStatusRegister;         /* C8h */
    21.     PVOID SystemReserved1[0x36];            /* CCh */
    22.     LONG ExceptionCode;                     /* 1A4h */
    23.     struct _ACTIVATION_CONTEXT_STACK *ActivationContextStackPointer; /* 1A8h */
    24.     UCHAR SpareBytes1[0x28];                /* 1ACh */
    25.     GDI_TEB_BATCH GdiTebBatch;              /* 1D4h */
    26.     CLIENT_ID RealClientId;                 /* 6B4h */
    27.     PVOID GdiCachedProcessHandle;           /* 6BCh */
    28.     ULONG GdiClientPID;                     /* 6C0h */
    29.     ULONG GdiClientTID;                     /* 6C4h */
    30.     PVOID GdiThreadLocalInfo;               /* 6C8h */
    31.     ULONG Win32ClientInfo[62];              /* 6CCh */
    32.     PVOID glDispatchTable[0xE9];            /* 7C4h */
    33.     ULONG glReserved1[0x1D];                /* B68h */
    34.     PVOID glReserved2;                      /* BDCh */
    35.     PVOID glSectionInfo;                    /* BE0h */
    36.     PVOID glSection;                        /* BE4h */
    37.     PVOID glTable;                          /* BE8h */
    38.     PVOID glCurrentRC;                      /* BECh */
    39.     PVOID glContext;                        /* BF0h */
    40.     NTSTATUS LastStatusValue;               /* BF4h */
    41.     UNICODE_STRING StaticUnicodeString;     /* BF8h */
    42.     WCHAR StaticUnicodeBuffer[0x105];       /* C00h */
    43.     PVOID DeallocationStack;                /* E0Ch */
    44.     PVOID TlsSlots[0x40];                   /* E10h */
    45.     LIST_ENTRY TlsLinks;                    /* F10h */
    46.     PVOID Vdm;                              /* F18h */
    47.     PVOID ReservedForNtRpc;                 /* F1Ch */
    48.     PVOID DbgSsReserved[0x2];               /* F20h */
    49.     ULONG HardErrorDisabled;                /* F28h */
    50.     PVOID Instrumentation[14];              /* F2Ch */
    51.     PVOID SubProcessTag;                    /* F64h */
    52.     PVOID EtwTraceData;                     /* F68h */
    53.     PVOID WinSockData;                      /* F6Ch */
    54.     ULONG GdiBatchCount;                    /* F70h */
    55.     BOOLEAN InDbgPrint;                     /* F74h */
    56.     BOOLEAN FreeStackOnTermination;         /* F75h */
    57.     BOOLEAN HasFiberData;                   /* F76h */
    58.     UCHAR IdealProcessor;                   /* F77h */
    59.     ULONG GuaranteedStackBytes;             /* F78h */
    60.     PVOID ReservedForPerf;                  /* F7Ch */
    61.     PVOID ReservedForOle;                   /* F80h */
    62.     ULONG WaitingOnLoaderLock;              /* F84h */
    63.     ULONG SparePointer1;                    /* F88h */
    64.     ULONG SoftPatchPtr1;                    /* F8Ch */
    65.     ULONG SoftPatchPtr2;                    /* F90h */
    66.     PVOID *TlsExpansionSlots;               /* F94h */
    67.     ULONG ImpersionationLocale;             /* F98h */
    68.     ULONG IsImpersonating;                  /* F9Ch */
    69.     PVOID NlsCache;                         /* FA0h */
    70.     PVOID pShimData;                        /* FA4h */
    71.     ULONG HeapVirualAffinity;               /* FA8h */
    72.     PVOID CurrentTransactionHandle;         /* FACh */
    73.     PTEB_ACTIVE_FRAME ActiveFrame;          /* FB0h */
    74.     PVOID FlsData;                          /* FB4h */
    75.     UCHAR SafeThunkCall;                    /* FB8h */
    76.     UCHAR BooleanSpare[3];                  /* FB9h */
    77. } TEB, *PTEB;
    复制代码
  • PEB结构

    1. typedef struct _PEB
    2. {
    3.     UCHAR InheritedAddressSpace; // 00h
    4.     UCHAR ReadImageFileExecOptions; // 01h
    5.     UCHAR BeingDebugged; // 02h
    6.     UCHAR Spare; // 03h
    7.     PVOID Mutant; // 04h
    8.     PVOID ImageBaseAddress; // 08h
    9.     PPEB_LDR_DATA Ldr; // 0Ch
    10.     PRTL_USER_PROCESS_PARAMETERS ProcessParameters; // 10h
    11.     PVOID SubSystemData; // 14h
    12.     PVOID ProcessHeap; // 18h
    13.     PVOID FastPebLock; // 1Ch
    14.     PPEBLOCKROUTINE FastPebLockRoutine; // 20h
    15.     PPEBLOCKROUTINE FastPebUnlockRoutine; // 24h
    16.     ULONG EnvironmentUpdateCount; // 28h
    17.     PVOID* KernelCallbackTable; // 2Ch
    18.     PVOID EventLogSection; // 30h
    19.     PVOID EventLog; // 34h
    20.     PPEB_FREE_BLOCK FreeList; // 38h
    21.     ULONG TlsExpansionCounter; // 3Ch
    22.     PVOID TlsBitmap; // 40h
    23.     ULONG TlsBitmapBits[0x2]; // 44h
    24.     PVOID ReadOnlySharedMemoryBase; // 4Ch
    25.     PVOID ReadOnlySharedMemoryHeap; // 50h
    26.     PVOID* ReadOnlyStaticServerData; // 54h
    27.     PVOID AnsiCodePageData; // 58h
    28.     PVOID OemCodePageData; // 5Ch
    29.     PVOID UnicodeCaseTableData; // 60h
    30.     ULONG NumberOfProcessors; // 64h
    31.     ULONG NtGlobalFlag; // 68h
    32.     UCHAR Spare2[0x4]; // 6Ch
    33.     LARGE_INTEGER CriticalSectionTimeout; // 70h
    34.     ULONG HeapSegmentReserve; // 78h
    35.     ULONG HeapSegmentCommit; // 7Ch
    36.     ULONG HeapDeCommitTotalFreeThreshold; // 80h
    37.     ULONG HeapDeCommitFreeBlockThreshold; // 84h
    38.     ULONG NumberOfHeaps; // 88h
    39.     ULONG MaximumNumberOfHeaps; // 8Ch
    40.     PVOID** ProcessHeaps; // 90h
    41.     PVOID GdiSharedHandleTable; // 94h
    42.     PVOID ProcessStarterHelper; // 98h
    43.     PVOID GdiDCAttributeList; // 9Ch
    44.     PVOID LoaderLock; // A0h
    45.     ULONG OSMajorVersion; // A4h
    46.     ULONG OSMinorVersion; // A8h
    47.     ULONG OSBuildNumber; // ACh
    48.     ULONG OSPlatformId; // B0h
    49.     ULONG ImageSubSystem; // B4h
    50.     ULONG ImageSubSystemMajorVersion; // B8h
    51.     ULONG ImageSubSystemMinorVersion; // C0h
    52.     ULONG GdiHandleBuffer[0x22]; // C4h
    53.     PVOID ProcessWindowStation; // ???
    54. } PEB, *PPEB;

    复制代码
         

    转自pediy
 楼主| 发表于 2010-12-9 18:17:54 | 显示全部楼层
简单说个例子MOV EAX,FS:[18] 获得TEB指针送EAX,MOV EAX,DS:[EAX+20], CLIENT_ID Cid;   获得进程PID送EAX。
回复 支持 反对

使用道具 举报

发表于 2010-12-9 21:05:09 | 显示全部楼层
MOV EAX,FS:[18] 这一句没看懂,然后到网上搜一下,找到如下资料,然后懂了……

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

使用道具 举报

 楼主| 发表于 2010-12-9 21:11:38 | 显示全部楼层
本帖最后由 幻影梦魇 于 2010-12-10 01:36 编辑

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

使用道具 举报

发表于 2010-12-10 01:09:50 | 显示全部楼层
本帖最后由 眠羽 于 2010-12-10 01:10 编辑

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

使用道具 举报

 楼主| 发表于 2010-12-10 01:33:57 | 显示全部楼层
妖怪0.0   好卡帕 - =
回复 支持 反对

使用道具 举报

发表于 2010-12-10 10:22:29 | 显示全部楼层
这么长,而且这是什么?
回复 支持 反对

使用道具 举报

发表于 2010-12-12 20:27:34 | 显示全部楼层
连我这只学计算机的生物都看不懂。。 不愧为技术宅吗。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-12-12 20:54:59 | 显示全部楼层
我也是看雪转的,大致的意思就是FS:[18]记录的一个数据结构。PEB包含在TEB中偏移是0x30


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

---------我是渣包
回复 支持 反对

使用道具 举报

发表于 2010-12-14 15:02:06 | 显示全部楼层
MOV EAX,FS:[18] 这一句没看懂,然后到网上搜一下,找到如下资料,然后懂了……

FS寄存器指向当前 ...
阿燐燐 发表于 2010-12-9 21:05



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

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

在数据窗口中跟踪7FFDF000然后以长型地址的方式查看数据,可以完整的看到TEB结构, QQ截图未命名.png

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

FS:[0]
FS:[30]

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

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

而整个表的指针放在FS:[18]中。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 少女注册中

本版积分规则

合作与事务联系|小黑屋|手机版|无图版|喵玉殿

GMT+8, 2024-5-17 10:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表