Di che struttura stiamo parlando? Essa è conosciuta con almeno due nomi, infatti sotto windows 95 era chiamata TIB (Thread Information Block), mentre sotto NT diventata TEB (Thread Enviroment Block). Ad ogni modo sebbene questi due tipi di struttura differiscano per qualche campo, possiamo dire che fondamentalmente non sia cambiato molto, quindi ci riferiremo a questa tabella col nome TIB.
Perché così interessante questa tabella? Come ci suggerisce il nome, i dati trovati in una TIB si riferiscono ad un thread, e c'è una TIB per ciascun thread nel sistema. Essa contiene tutte delle informazioni relative al thread come ad esempio un puntatore alla lista dei thread, un puntatore alla struttura che gestisce le eccezioni, la posizione del thread stack , etc...
Il metodo più veloce per spiegare cosa sia fatta una tabella TIB (Thread Enviroment Block) è quello di farvene vedere una :
TIB
Dump - 7FFDF000..7FFDFFFF
Indirizzo Codice Hex Hex decodificato Commenti
7FFDF000 98FF1200 DD 0012FF98 ; SEH chain = 12FF98 -> {Next=0012FFB4,Handler=004091E5}
7FFDF004 00001300 DD 00130000 ; Thread's stack base = 130000
7FFDF008 00C01200 DD 0012C000 ; Thread's stack limit = 12C000
7FFDF00C 00000000 DD 00000000 ; TIB of OS/2 Subsystem = NULL
7FFDF010 001E0000 DD 00001E00 ; Fiber data = 00001E00
7FFDF014 00000000 DD 00000000 ; Arbitrary user data = 0
7FFDF018 00F0FD7F DD 7FFDF000 ; TIB linear address = 7FFDF000
7FFDF01C 00000000 DD 00000000 ; 00000000
7FFDF020 D40B0000 DD 00000BD4 ; Process ID = 00000BD4
7FFDF024 8C0F0000 DD 00000F8C ; Thread ID = 00000F8C
7FFDF028 00000000 DD 00000000 ; 00000000
7FFDF02C 482A1400 DD 00142A48 ; TLS array = 00142A48
7FFDF030 0070FD7F DD 7FFD7000 ; Process database = 7FFD7000
7FFDF034 00000000 DD 00000000 ; Thread's last error = ERROR_SUCCESS
I campi più importanti della TIB
Il campo 00h contiene un puntatore all'inizio della catena dei frame SEH che rappresentano la struttura che gestisce le eccezioni.
Il campo 04h contiene l'indirizzo lineare massimo che lo stack del thread può usare.
Il campo 08h contiene l'indirizzo lineare più basso dello stack del thread.
Il campo 14h teoricamente disponibile per le applicazioni che lo potranno utilizzare come vogliono.
Il campo 18h contiene l'indirizzo lineare del TIB stesso. Il fatto che il blocco TIB contenga un puntatore a se stesso ci da la possibilità di accedere ai vari campi della tabella, non solo usando il registro di segmento FS (ad esempio FS[4]), ma anche come somma del valore presente in questo campo più un offset. Ricordo che l'indirizzo lineare della TIB lo potete sempre recuperare dal registro FS con FS[0].
Il campo 20h contiene il codice identificativo del processo a cui il thread appartiene. La funzione GetCurrentProcessID non fa altro che restituire questo valore.
Il campo 24h contiene il codice identificativo del thread. La funzione GetCurrentThreadID non fa altro che restituire questo valore.
Il campo 2Ch contiene un puntatore al thread local storage (TLS).
Il campo 30h contiene un puntatore al Process Enviroment Block (PEB), che contiene tutte le informazioni sul processo.
Concludo facendo notare che per accedere ad ognuno di questi campi basta una semplice istruzione, per esempio per recuperare l'indirizzo del PEB:
Codice Comando
64:A1 30000000 MOV EAX,DWORD PTR FS:[30]
Al posto di una GetCurrentProcessID posso usare MOV EAX,FS[20], al posto di una GetCurrentThreadID posso usare MOV EAX,FS[24]. Etc..





