Hacking Arts
PEB(Process Environment Block)와 TEB(Thread Environment Block) 본문
PEB(Process Environment Block)와 TEB(Thread Environment Block)
Rakehell 2014. 10. 2. 00:20- PEB란 ? Windows Kernel에서 프로세스에 대한 환경 정보를 담고 있는 구조체이다. 각 프로세스마다 PEB가 있고 각 프로세스 마다 가지고 있는 스레드 마다 TEB(Thread Environment Block)을 가지고 있습니다.PEB,TEB모두 커널모드에서는 존재하지 않습니다. 모두 유저모드 프로세스 하나당, 유저모드 스레드 하나당 존재하게 됩니다.
[사진 1]
-window xp 기준 PEB구조
nt!_PEB +0x000 InheritedAddressSpace : UChar +0x001 ReadImageFileExecOptions : UChar +0x002 BeingDebugged : UChar +0x003 SpareBool : UChar +0x004 Mutant : Ptr32 Void +0x008 ImageBaseAddress : Ptr32 Void +0x00c Ldr : Ptr32 _PEB_LDR_DATA +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS +0x014 SubSystemData : Ptr32 Void +0x018 ProcessHeap : Ptr32 Void +0x01c FastPebLock : Ptr32 _RTL_CRITICAL_SECTION +0x020 FastPebLockRoutine : Ptr32 Void +0x024 FastPebUnlockRoutine : Ptr32 Void +0x028 EnvironmentUpdateCount : Uint4B +0x02c KernelCallbackTable : Ptr32 Void +0x030 SystemReserved : [1] Uint4B +0x034 AtlThunkSListPtr32 : Uint4B +0x038 FreeList : Ptr32 _PEB_FREE_BLOCK +0x03c TlsExpansionCounter : Uint4B +0x040 TlsBitmap : Ptr32 Void +0x044 TlsBitmapBits : [2] Uint4B +0x04c ReadOnlySharedMemoryBase : Ptr32 Void +0x050 ReadOnlySharedMemoryHeap : Ptr32 Void +0x054 ReadOnlyStaticServerData : Ptr32 Ptr32 Void +0x058 AnsiCodePageData : Ptr32 Void +0x05c OemCodePageData : Ptr32 Void +0x060 UnicodeCaseTableData : Ptr32 Void +0x064 NumberOfProcessors : Uint4B +0x068 NtGlobalFlag : Uint4B +0x070 CriticalSectionTimeout : _LARGE_INTEGER +0x078 HeapSegmentReserve : Uint4B +0x07c HeapSegmentCommit : Uint4B +0x080 HeapDeCommitTotalFreeThreshold : Uint4B +0x084 HeapDeCommitFreeBlockThreshold : Uint4B +0x088 NumberOfHeaps : Uint4B +0x08c MaximumNumberOfHeaps : Uint4B +0x090 ProcessHeaps : Ptr32 Ptr32 Void +0x094 GdiSharedHandleTable : Ptr32 Void +0x098 ProcessStarterHelper : Ptr32 Void +0x09c GdiDCAttributeList : Uint4B +0x0a0 LoaderLock : Ptr32 Void +0x0a4 OSMajorVersion : Uint4B +0x0a8 OSMinorVersion : Uint4B +0x0ac OSBuildNumber : Uint2B +0x0ae OSCSDVersion : Uint2B +0x0b0 OSPlatformId : Uint4B +0x0b4 ImageSubsystem : Uint4B +0x0b8 ImageSubsystemMajorVersion : Uint4B +0x0bc ImageSubsystemMinorVersion : Uint4B +0x0c0 ImageProcessAffinityMask : Uint4B +0x0c4 GdiHandleBuffer : [34] Uint4B +0x14c PostProcessInitRoutine : Ptr32 void +0x150 TlsExpansionBitmap : Ptr32 Void +0x154 TlsExpansionBitmapBits : [32] Uint4B +0x1d4 SessionId : Uint4B +0x1d8 AppCompatFlags : _ULARGE_INTEGER +0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER +0x1e8 pShimData : Ptr32 Void +0x1ec AppCompatInfo : Ptr32 Void +0x1f0 CSDVersion : _UNICODE_STRING +0x1f8 ActivationContextData : Ptr32 Void +0x1fc ProcessAssemblyStorageMap : Ptr32 Void +0x200 SystemDefaultActivationContextData : Ptr32 Void +0x204 SystemAssemblyStorageMap : Ptr32 Void +0x208 MinimumStackCommit : Uint4B
1.+0x002 BeingDebugged : UChar
- 디버거 존재 여부를 반환 (IsDebuggerPresent() API에서 사용)
2.+0x008 ImageBaseAddress : Ptr32 Void
- 프로세스 메인 module Base Address저장 (GetModuleHandle / LdrGetDllHandle()에서 사용)
3.+0x00c Ldr : Ptr32 _PEB_LDR_DATA
- 프로세스의 로드된 DLL 목록 저장 (GetModuleHandle / LdrGetDllHandle()에서 사용)
4.+0x018 ProcessHeap : Ptr32 Void
- 디버거 존재 여부를 조사하는데 쓰일 수 있다. 찾아보니 이것을 가지고 anti-debugging 하는 기법이 있네요.
5.+0x068 NtGlobalFlag : Uint4B
- 이것 또한 디버거 존재 여부를 조사하는데 쓰일 수 있습니다.
-window xp기준 TEB
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
1.+0x000 NtTib : _NT_TIB
- SEH(Structured Exception Handler) 체인 중 최상위 엔트리를 말합니다.
2.+0x01c EnvironmentPointer : Ptr32 Void
- CreateProcess()의 Environment 필드에 의해 지시된 포인터 값입니다.
3.+0x020 ClientId : _CLIENT_ID
- 프로세스 아이디와 스레드 아이디를 가지고 있는 필드(CLIENT_ID structurec)
4.+0x02c ThreadLocalStoragePointer : Ptr32 Void
- TlsAlloc/TlsGetValue/TlsSetValue 등의 win32 API에 의해 참조되는 값으로, Thread Loacal Storage(TLS) pointer를 지정합니다.
5.+0x030 ProcessEnvironmentBlock : Ptr32 _PEB
-PEB(Process Environment Bloc) 포인터를 저장합니다.
6.+0x040 Win32ThreadInfo : Ptr32 Void
-스레드 정보를 담고 있는 커널 모드 포인터 입니다.
-참고 자료
http://anster.egloos.com/viewer/2128538
http://deguls.tistory.com/entry/Windows-TEBThread-Environment-Block-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0
http://gogil.kr/24
'Reversing > Window OS' 카테고리의 다른 글
[번역] X64 에 푹 빠져보기 (X64 Deep Dive) (0) | 2015.10.22 |
---|---|
window 부팅 순서 (0) | 2015.02.15 |
EPROCESS, KPROCESS, ETHREAD, KTHREAD (0) | 2014.10.02 |
VirtualKD를 이용한 vmware debugging (0) | 2014.10.01 |
Window Error Code - GetLastError (0) | 2014.08.23 |