- lumenFC 축구 동호회
- 마샤블
- 웍스프레소
- 소셜@나눔<소셜미디어나눔연구소>
- 리버스코어
- LAIN
- LAIN 이사한 블로그
- TeamCR@K
- Sunnyday
- 보안 걱정이
- 리버싱 학습
- securityfirst_jo
- Practical Security Blog
- 세상, 그 유쾌한 전장
- 악성코드관련블로그
- Back to the Mac
- 패킷분석입문
- PacketInside / 네트워크 패킷 분석 블로그
- 침해사고분석 :: 네이버 블로그
- 소프트웨어 기술자경력관리시스템
- JK.Moon
- 자바 온라인학습
- Ezbeat의 도서관
- Dreams of a Final Journey
- IT eBooks - Free Download - Bi…
- Index of /madchat/coding/rever…
- Security Insight
- Reversing war game
- 고길고기
- clamav
- zerowine
- FORENSIC-PROOOF
- jquery 예제
- 조대협의블로그
- 국가과학기술인력개발원 교육포털 사이트
- 빅데이터, splunk
- 지식을 연주하는 사람
- malware analysis system
- 건국대토익스피킹
- 소프트웨어개발 및 협업도구
kisoo
ETHREAD 란 무엇인가? 본문
윈도우의 스레드는 실행 스레드(EThread-executive thread )에 정의된다. ETHREAD 블록과 여기에서 가리키는 구조체들은 시스템 주소 공간에 위치한다. 예외로 스레드 환경블록(thread environment block (TEB) 만은 프로세스 주소 공간에 위치한다.
lkd> dt nt!_ethread
nt!_ETHREAD
+0x000Tcb : _KTHREAD
+0x1c0CreateTime : _LARGE_INTEGER
+0x1c0NestedFaultCount : Pos 0, 2 Bits
+0x1c0ApcNeeded : Pos 2, 1 Bit
+0x1c8ExitTime : _LARGE_INTEGER
+0x1c8LpcReplyChain : _LIST_ENTRY
+0x1c8KeyedWaitChain : _LIST_ENTRY
+0x1d0ExitStatus : Int4B
+0x1d0OfsChain : Ptr32Void
+0x1d4PostBlockList : _LIST_ENTRY
+0x1dcTerminationPort : Ptr32_TERMINATION_PORT
+0x1dcReaperLink : Ptr32_ETHREAD
+0x1dcKeyedWaitValue : Ptr32Void
+0x1e0ActiveTimerListLock : Uint4B
+0x1e4ActiveTimerListHead : _LIST_ENTRY
+0x1ecCid : _CLIENT_ID
+0x1f4LpcReplySemaphore : _KSEMAPHORE
+0x1f4KeyedWaitSemaphore : _KSEMAPHORE
+0x208LpcReplyMessage : Ptr32Void
+0x208LpcWaitingOnPort : Ptr32Void
+0x20cImpersonationInfo : Ptr32 _PS_IMPERSONATION_INFORMATION
+0x210IrpList : _LIST_ENTRY
+0x218TopLevelIrp : Uint4B
+0x21cDeviceToVerify : Ptr32_DEVICE_OBJECT
+0x220ThreadsProcess : Ptr32_EPROCESS
+0x224StartAddress : Ptr32Void
+0x228Win32StartAddress : Ptr32Void
+0x228LpcReceivedMessageId : Uint4B
+0x22cThreadListEntry : _LIST_ENTRY
+0x234RundownProtect : _EX_RUNDOWN_REF
+0x238ThreadLock : _EX_PUSH_LOCK
+0x23cLpcReplyMessageId : Uint4B
+0x240ReadClusterSize : Uint4B
+0x244GrantedAccess : Uint4B
+0x248CrossThreadFlags : Uint4B
+0x248Terminated : Pos 0, 1 Bit
+0x248DeadThread : Pos 1, 1 Bit
+0x248HideFromDebugger : Pos 2, 1 Bit
+0x248ActiveImpersonationInfo : Pos 3, 1 Bit
+0x248SystemThread : Pos 4, 1 Bit
+0x248HardErrorsAreDisabled : Pos 5, 1 Bit
+0x248BreakOnTermination : Pos 6, 1 Bit
+0x248SkipCreationMsg : Pos 7, 1 Bit
+0x248SkipTerminationMsg : Pos 8, 1 Bit
+0x24cSameThreadPassiveFlags : Uint4B
+0x24cActiveExWorker : Pos 0, 1 Bit
+0x24cExWorkerCanWaitUser : Pos 1, 1 Bit
+0x24cMemoryMaker : Pos 2, 1 Bit
+0x250SameThreadApcFlags : Uint4B
+0x250LpcReceivedMsgIdValid : Pos 0, 1 Bit
+0x250LpcExitThreadCalled : Pos 1, 1 Bit
+0x250AddressSpaceOwner : Pos 2, 1 Bit
+0x254ForwardClusterOnly : UChar
+0x255DisablePageFaultClustering : UChar
KTHREAD 블록에는 스레드를 대신하여 커널이 스레드의 스케줄링과 동기화 할 때 필요한 정보들이 들어 있다.
lkd> dt nt!_kthread
nt!_KTHREAD
+0x000Header : _DISPATCHER_HEADER
+0x010MutantListHead : _LIST_ENTRY
+0x018InitialStack : Ptr32Void
+0x01cStackLimit : Ptr32Void
+0x020Teb : Ptr32Void
+0x024TlsArray : Ptr32Void
+0x028KernelStack : Ptr32Void
+0x02cDebugActive : UChar
+0x02dState : UChar
+0x02eAlerted : [2] UChar
+0x030Iopl : UChar
+0x031NpxState : UChar
+0x032Saturation : Char
+0x033Priority : Char
+0x034ApcState : _KAPC_STATE
+0x04cContextSwitches : Uint4B
+0x050IdleSwapBlock : UChar
+0x051Spare0 : [3] UChar
+0x054WaitStatus : Int4B
위 필드중 프로세스 주소 공간(시스템 주소 공간(커널 메모리)이 아닌)에 위치하는 구조체는 TEB이다. TEB는 이미지 로더와 다양한 Windows DLL들에 대한 컨택스트 정보를 담고 있다. 이들 요소들이 사용자 모드에서 동작하기 때문에, 사용자 모드에서 쓰기가 가능한 구조체가 필요하다. 그래서 이 구조체는 커널모드에서만 쓰기가 가능한 시스템 메모리 주소 공간이 아닌, 프로세스 주소 공간에 위치하는 것이다.
kd> !teb
TEB at 7ffde000
ExceptionList: 0006b540
StackBase: 00070000
StackLimit: 00065000
SubSystemTib: 00000000
FiberData: 00001e00
ArbitraryUserPointer: 00000000
Self: 7ffde000
EnvironmentPointer: 00000000
ClientId: 00000254 . 000007ac
RpcHandle: 00000000
Tls Storage: 00000000
PEB Address: 7ffdf000
LastErrorValue: 2
LastStatusValue: c0000034
CountOwnedLocks: 0 HardErrorMode: 0