微信号:ikanxue

介绍:致力于移动与安全研究的开发者社区,看雪学院(kanxue.com)官方微信公众帐号.

初学者心得:认识TEB和PEB

2013-07-25 20:07 看雪学院

初学者心得:认识TEB和PEB

by hgfangying

前几天在找资料的时候发现一些有趣的东西,是线程的TEB和进程的PEB结构,在好奇心下,稍微学习了下,从而得到了一种获取当前进程名的方法。先把代码贴上来。
#include "windows.h"
#include "stdio.h"
int main(void)
{
LPSTR name;
__asm{
mov eax,fs:[0x18]
mov eax,[eax+0x30]
mov eax,[eax+0xc]
mov eax,[eax+0xc]
mov eax,[eax+0x30]
mov name,eax
}
wprintf(L"%s\n",name);
return 0;
}
这段测试代码就能获取当前进程的名字。
现在稍微说下上面这段汇编代码是什么意思。
TEB:
即Thread Environment Block ,它记录的相关线程的信息,每一个线程都有自己的TEB,每个TEB都有自己的TIB(Thread Information Block),即线程信息块。
FS:[0x18]是什么呢?
用OD,随便打开一个程序,然后在寄存器中可以看到

在Command中,输入 dd 7FFDF000就可以看到:
7FFDF000  0012FFC4  (指向 SEH 链指针)
7FFDF004  00130000  (线程堆栈顶部)
7FFDF008  0012E000  (线程堆栈底部)
7FFDF00C  00000000
7FFDF010  00001E00
7FFDF014  00000000
7FFDF018  7FFDF000
7FFDF01C  00000000
7FFDF020  000025DC
7FFDF024  00001750  (线程 ID)
7FFDF028  00000000
7FFDF02C  7FFDF02C  (指向线程局部存储指针)
7FFDF030  7FFDE000
7FFDF034  00000000  (上个错误 = ERROR_SUCCESS)
对比以下资料可以对比看到,FS:[0x18]即为指向TEB自身
TEB包含了若干指针,各偏移说明如下:
FS:[000]   指向SEH链指针
FS:[004]  线程堆栈顶部
FS:[008] 线程堆栈底部
FS:[00C]  SubSystemTib
FS:[010]  FiberData
FS:[014] ArbitraryUserPointer
FS:[018]  指向TEB自身
FS:[020] 进程PID
FS:[024] 线程ID
FS:[02C] 指向线程局部存储指针
FS:[030] PEB结构地址(进程结构)
FS:[034] 上个错误号
在windbg下看到TEB结构:
kd> dt nt!_teb
  +0x000 NtTib            : _NT_TIB
  +0x01c EnvironmentPointer : Ptr32 Void
  +0x020 ClientId         : _CLIENT_ID
  +0x028 ActiveRpcHandle  : Ptr32 Void
  +0x02c ThreadLocalStoragePointer : Ptr32 Void
  +0x030 ProcessEnvironmentBlock : Ptr32 _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
  +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
  +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

所以FS:[0x18]指向TEB本身,[eax+0x30]就是PEB所在地址。
接下来看PEB结构:

由于篇幅原因,更多信息请点底部链接“阅读原文”。


-----看雪学院,微信ID:ikanxue-----


附上5个邀请码,临时用户登陆看雪论坛bbs.pediy.com,按要求激活帐号,一个邀请码只能使用一次,先到先得。

7A6071AAE70C10B005EAB7831BAFF3
FFF78AF22F4EFA44B261D446EB7A94
AE3F1CEC713D4B00A88EC07A404A1E
4C35655536CE43A52ACB920C462A8C
70FF7FF69CB30C08430C9CC9C3E4AC

参与此话题讨论请点击如下链接:

 
看雪学院 更多文章 汽车CAN协议hacking blackhat-PLC-导火线:工控PLC蠕虫的实现 看雪众测测试报告01期 看雪众测平台上线公测 《2015MSC移动安全挑战赛(第二届)》比赛进行中……
猜您喜欢 深入浅出的 SQL Server 查询优化 从Trie到Double Array Trie 基于PHP的超炫酷HTML5交互式图表 印象 · CNUTCon全球容器技术大会2016 Android程序员读者调查