yenas0 2025. 1. 2. 08:26
반응형

TEB란?

프로세스에서 실행되는 스레드에 대한 정보를 담고 있는 구조체

스레드 별로 TEB 구조체가 하나씩 할당됨.

TEB 구조체는 OS 종류별로 모양이 달라짐

 

TEB 구조체 정의

typedef struct _TEB {
    BYTE Reserved1[1952];
    PVOID Reserved2[412];
    PVOID TlsSlots[64];
    BYTE Reserved3[8];
    PVOID Reserved4[26];
    PVOID ReservedForOle;
    PVOID Reserved5[4];
    PVOID TlsExpansionSlots;
} TEB, *PTEB;

MSDN의 TEB 구조체 설명이다.

구조체 내용을 자세히 보기 위해 WinDbg사용(커널 디버거 사용)

 

WinDbg로 비교해보면 Windows XP보다 Windows7의 TEB 구조가 더 커진걸 확인할 수 있음

+0x000 NtTib                   : _NT_TIB
...
+0x030 ProcessEnvironmentBlock : Ptr32 _PEB

 

중요 멤버만 보면 위와 같다.

ProcessEnvironmentBlock멤버

옵셋 30에 있는데 PEB 구조체의 포인터 이다.. PEB는 프로세스별로 하나만 생성된다.

 

 

 

NtTib멤버

TEB 구조체의 첫번째 멤버는 _NT_TIB 구조체임

typedef struct _NT_TIB {
    struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
    PVOID StackBase;
    PVOID StackLimit;
    PVOID SubSystemTib;
    union {
        PVOID FiberData;
        DWORD Version;
    };
    PVOID ArbitraryUserPointer;
    struct _NT_TIB *Self;
} NT_TIB;
typedef NT_TIB *PNT_TIB;

ExceptionList멤버는 _EXCEPTIONS_REGISTRATION_RECORD 구조체 연결 리스트 가리킴 -> SEH라고 하는 윈도우 운영체제의 예외 처리 매커니즘에 사용

Self멤버는 NT_TIB 구조체의 셀프 포인터 -> TEB 구조체 포인터

 

그럼 유저모드에서 TEB구조체 접근은?

-> OS에서 제공하는 API를 사용

 

NtCurrentTeb 함수

  • ntdll.NtCurrentTeb API는 현재 스레드의 TEB (Thread Environment Block) 주소를 반환
  • 내부적으로 FS:[0x18] 레지스터를 참조해 TEB의 시작 주소를 반환

FS 세그먼트 레지스터

  • FS 레지스터는 직접 TEB 주소를 가리키지 않고, Segment Descriptor Table (SDT)의 인덱스를 통해 TEB를 참조
  • FS:[0x18] → TEB 시작 주소
  • FS:[0x30] → PEB (Process Environment Block) 주소
  • FS:[0] → SEH (Structured Exception Handler) 주소

중요 오프셋

  • FS:[0x18] → TEB.NtTib.Self → TEB 시작 주소
  • FS:[0x30] → TEB.ProcessEnvironmentBlock → PEB 주소
  • FS:[0] → TEB.NtTib.ExceptionList → SEH 시작 주소

기본 개념

  • FS:[0x18] → 현재 스레드의 TEB
  • FS:[0x30] → 프로세스의 PEB
  • FS:[0] → 예외 처리 체인(SEH)

정리...

  • FS 레지스터는 TEB와 PEB 접근에 중요한 역할을 함
  • 주로 디버깅 우회(Anti-Debugging) 및 메모리 구조 분석에 사용
반응형