This site uses cookies own and third. If you continue to browse consider to accept the use of cookies. OK More Info.

[Code] GetThreadTEB

  • 0 Replies
  • 3287 Views

0 Members and 1 Guest are viewing this topic.

Offline Arkangel

  • *
  • Underc0der
  • Posts: 15
  • Actividad:
    0%
  • Reputación 0
    • View Profile

[Code] GetThreadTEB

  • on: June 17, 2013, 08:58:55 am
Otro codigo  mas de hace un tiempo
Esta función que te da la localización del TEB de cualquier hilo:

Code: (cpp) You are not allowed to view links. Register or Login
#include <Windows.h>
#include <Winternl.h>

TEB* GetThreadTEB(ushort TID){
LDT_ENTRY ldt;//La LDT es un tipo de GDT que es diferente para cada hilo. http://wiki.osdev.org/GDT
CONTEXT context;
void* BaseTIB;
HANDLE hThread;

//Inicializamos a zero
ZeroMemory(&context,sizeof(context));
ZeroMemory(&ldt,sizeof(ldt));
//Le decimos que queremos los registros de segmento del hilo
context.ContextFlags = CONTEXT_SEGMENTS;
//Abrimos el hilo con los flag de THREAD_GET_CONTEXT y THREAD_QUERY_INFORMATION
hThread = OpenThread(THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION,0,TID);
//Conseguimos el contexto del hilo
GetThreadContext(hThread,&context);
//Conseguimos la LDT asignada a el selector del segmento fs
GetThreadSelectorEntry(hThread,context.SegFs,&ldt);
//Cerramos el handle
CloseHandle(hThread);

//La direccion base esta repartida en tres campos de la ldt BaseLow 0-15,BaseMid 16-23 y BaseHi 24-31
BaseTIB = (void*)(ldt.BaseLow | (ldt.HighWord.Bits.BaseMid<<16)| (ldt.HighWord.Bits.BaseHi<<24));
printf("base TIB: %p\n",BaseTIB);

return (TEB*)BaseTIB;
}
en el TIB es donde se guarda la informacion de u hilo concreto como los valores de el almacenamiento local, la direccion de la pila, manejo de excepciones, etc

Espero que a alguien le sea util. Yo lo uso para modificar el Thread local storage de cualquier hilo.

Saludos Arkangel
« Last Edit: February 08, 2014, 05:37:41 pm by Expermicid »