TEB(Thread Environment Block) - Thread에 대한 정보를 담고 있는 구조체. Thread별로 하나의 TEB구조체가 할당됨.
NtTib, PEB포인터 등 다양한 정보가 있음.
NtTib - SEH(예외 처리 메커니즘, Structured Exception Handler) , self 등의 멤버가 있음.
TEB접근 방법 - 32비트에선 FS:[0x18], 64비트에선 GS:[0x30]
32bit에서 FS 세그먼트 레지스터는 현재 스레드의 TEB를 지시하는데 사용됨.
FS 레지스터는 16비트인데 커널 메모리에 존재하는 Segment Descriptor Table의 index를 가지고 있고 그 index에 주소가 적혀있는데 그걸 가져옴.
FS:[0x18] = TEB.NtTib.Self = Address of TIB = Address of TEB(TIB이 첫번째 구조체라) = FS:0
FS가 가르키는 구조체안에서 18만큼떨어진게 TEB구조체의 주소다.
64bit에서는 FS- > GS, 0x18 -> 0x30
32bit에는 TEB를 FS 레지스터로 접근 가능하지만
64bit에는 TEB를 GS 레지스터로 접근 가능하다.
MOV EAX, FS:[0x18] //32bit
MOV RAX, GS:[0x30] //64bit
(E)RAX에 TEB주소가 들어옴
FS:[30] -> PEB 구조체 주소
FS:[0] -> SEH 시작 주소
---------------------------------------------------------------
PEB(Process Environment Block) - Process에 대한 정보를 담고 있는 구조체
접근 방법
MOV EAX, FS:[0x30] //32bit
MOV RAX, GS:[0x60] //64bit
(E)RAX에 PEB주소가 들어옴
아니면 TEB를 구하고 PEB구하는 방법
MOV EAX, FS:[0x18] //32bit
MOV RAX, GS:[0x30] //64bit
MOV EAX, DS:[EAX + 30] //32bit
MOV RAX, DS:[EAX + 60] //64bit
(E)RAX에 PEB주소가 들어옴
PEB의 3번째 바이트가 debugging 되고있는지 되고있음 1, 아니면 0
64bit TEB
TEB에서 60만큼떨어진곳에서 PEB주소 나옴 (0x23A000)
64bit PEB
3번쨰 바이트(주소 0x23A002)가 디버깅되고있는지 지금은 1(디버깅 중)
(주소 0x23A010)가 ImageBase(0x140000000)
그외에
Ldr멤버 - 프로세스에 로딩된 모듈(DLL)의 로딩 베이스 주소를 구할 수 있음.
ProcessHeap & NtGlobalFlag - 안티디버깅에 사용. 프로세스가 디버깅 중이라면 특정한 값을 가짐.