NT TEB(TIB) struct

Тема в разделе "WASM.WIN32", создана пользователем green, 20 янв 2005.

  1. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    где можно посмотреть поля этой структуры после portable part ?

    Например, что находится по смещению +124h ?



    спасибо.
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    вот, если кому надо (это от Win2k sp?):
    Код (Text):
    1.  
    2.  
    3. typedef struct _GDI_TEB_BATCH
    4. {
    5.    ULONG Offset;
    6.    ULONG HDC;
    7.    ULONG Buffer[0x136];
    8. } GDI_TEB_BATCH, *PGDI_TEB_BATCH;
    9.  
    10. typedef struct _TEB
    11. {
    12.    NT_TIB Tib;                         /* 00h */
    13.    PVOID EnvironmentPointer;           /* 1Ch */
    14.    CLIENT_ID Cid;                      /* 20h */
    15.    PVOID ActiveRpcInfo;                /* 28h */
    16.    PVOID ThreadLocalStoragePointer;    /* 2Ch */
    17.    PPEB Peb;                           /* 30h */
    18.    ULONG LastErrorValue;               /* 34h */
    19.    ULONG CountOfOwnedCriticalSections; /* 38h */
    20.    PVOID CsrClientThread;              /* 3Ch */
    21.    struct _W32THREAD* Win32ThreadInfo; /* 40h */
    22.    ULONG Win32ClientInfo[0x1F];        /* 44h */
    23.    PVOID WOW32Reserved;                /* C0h */
    24.    ULONG CurrentLocale;                /* C4h */
    25.    ULONG FpSoftwareStatusRegister;     /* C8h */
    26.    PVOID SystemReserved1[0x36];        /* CCh */
    27.    PVOID Spare1;                       /* 1A4h */
    28.    LONG ExceptionCode;                 /* 1A8h */
    29.    UCHAR SpareBytes1[0x28];            /* 1ACh */
    30.    PVOID SystemReserved2[0xA];         /* 1D4h */
    31.    GDI_TEB_BATCH GdiTebBatch;          /* 1FCh */
    32.    ULONG gdiRgn;                       /* 6DCh */
    33.    ULONG gdiPen;                       /* 6E0h */
    34.    ULONG gdiBrush;                     /* 6E4h */
    35.    CLIENT_ID RealClientId;             /* 6E8h */
    36.    PVOID GdiCachedProcessHandle;       /* 6F0h */
    37.    ULONG GdiClientPID;                 /* 6F4h */
    38.    ULONG GdiClientTID;                 /* 6F8h */
    39.    PVOID GdiThreadLocaleInfo;          /* 6FCh */
    40.    PVOID UserReserved[5];              /* 700h */
    41.    PVOID glDispatchTable[0x118];       /* 714h */
    42.    ULONG glReserved1[0x1A];            /* B74h */
    43.    PVOID glReserved2;                  /* BDCh */
    44.    PVOID glSectionInfo;                /* BE0h */
    45.    PVOID glSection;                    /* BE4h */
    46.    PVOID glTable;                      /* BE8h */
    47.    PVOID glCurrentRC;                  /* BECh */
    48.    PVOID glContext;                    /* BF0h */
    49.    NTSTATUS LastStatusValue;           /* BF4h */
    50.    UNICODE_STRING StaticUnicodeString; /* BF8h */
    51.    WCHAR StaticUnicodeBuffer[0x105];   /* C00h */
    52.    PVOID DeallocationStack;            /* E0Ch */
    53.    PVOID TlsSlots[0x40];               /* E10h */
    54.    LIST_ENTRY TlsLinks;                /* F10h */
    55.    PVOID Vdm;                          /* F18h */
    56.    PVOID ReservedForNtRpc;             /* F1Ch */
    57.    PVOID DbgSsReserved[0x2];           /* F20h */
    58.    ULONG HardErrorDisabled;            /* F28h */
    59.    PVOID Instrumentation[0x10];        /* F2Ch */
    60.    PVOID WinSockData;                  /* F6Ch */
    61.    ULONG GdiBatchCount;                /* F70h */
    62.    USHORT Spare2;                      /* F74h */
    63.    BOOLEAN IsFiber;                    /* F76h */
    64.    UCHAR Spare3;                       /* F77h */
    65.    ULONG Spare4;                       /* F78h */
    66.    ULONG Spare5;                       /* F7Ch */
    67.    PVOID ReservedForOle;               /* F80h */
    68.    ULONG WaitingOnLoaderLock;          /* F84h */
    69.    ULONG Unknown[11];                  /* F88h */
    70.    PVOID FlsSlots;                     /* FB4h */
    71. } TEB, *PTEB;
    72.  






    правда, что собственно такое +124h (PVOID), неясно...
     
  3. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Содержимое структуры меняется для каждой оси и даже сервиспаков. Убедись, что работаешь с правильной версией. А статьях о дровах Four-F и в моих вторых упаковщиках это расписано подробнее.
     
  4. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    volodya

    спасибо. посмотрю.
     
  5. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    Ребзя, есть две проги, работают в одной и той же среде. У одной после загрузки поле pTLSArray (+2Сh) содержит указатель, а у другой - ноль. Вопрос: почему? (нужно, чтобы вторая прога тоже содержала такой указатель, от чего это зависит?)
     
  6. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    от млин, это aspr делает такой указатель. т.е. первая прога запакована и после распаковки на OEP fs:2c содержит указатель, а вторая - уже распакована, и fs:2с на OEP содержит нули. У кого есть идеи как во второй сэмулировать этот указатель? Там наверно функция какая в аспре это все создает, ковырять нет времени, может кто знает?
     
  7. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Быть может, все проще? TLS-секция в обеих прогах есть?
     
  8. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    volodya

    там как-то странно... смотри, если распаковать стриппером, то секция tls присутствует, fs:2ch содержит указатель. если проехаться caspr-ом, то секции tls нет, но fs:2Ch все равно содержит указатель (т.е. секция не обязталеьно должна tls именоваться?!)



    у меня же третий вариант - прога распакована caspr-ом и заново собрана masm-ом в DLL - вроде у сегментов не менял называния, но fs:2Ch содержит ноль!



    что это может быть?
     
  9. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    с названием секции дело такое, директория TLS есть? любым PE-вьювером посмотри...
     
  10. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    ага, есть. а почему? как должна называться секция чтоб он ее как tls впихнул ?
     
  11. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    т.е. вопрос даже не в том, а почему если лепить exe, то все ОК, секция tls есть, а в DLL ее нет?

    в MSDN есть такая фигня - флаг LOAD_LIBRARY_AS_DATAFILE при загрузке DLL через LoadLibraryEx, при этом



    If this value is used, the system maps the file into the calling process's virtual address space as if it were a data file. Nothing is done to execute or prepare to execute the mapped file. Use this flag when you want to load a DLL only to extract messages or resources from it.



    т.е. теоретически без этого флага ДОЛЖНА происходить prepare to execute the mapped file, т.е. настройка TIB и др., т.е. tls секция теоретически МОЖЕТ быть в DLL, НО КАК?
     
  12. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    хорошо, если подумать - TLS свой для каждого потока. При загрузке DLL в память отдельного потока НЕ создается (ведь так?). Следовательно, у DLL не может быть TLS ??? Блин, а как же тогда...
     
  13. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    AFAIK, следует различать виндовую поддержку TLS (ф-ции TlsXXX), и поддержку на уровне компилятора (__declspec(thread)), являющуюся надстройкой над виндовой.

    В частности, компилятор для этий целей добавляет в бинарник tls-директорию.

    Использовать "компиляторный" TLS в DLL не рекомендуется, если предполагается динамическая загрузка этой DLL в многопоточный процесс.
     
  14. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    green

    именно эта надстройка и нужна. как ее в masm реализовать?
     
  15. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    ну вообщем понятно... это сродни SEH - руками все делать нада
     
  16. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Broken Sword

    всех деталей реализации я не знаю...



    В общих словах, при загрузке длл в память ОС выделяет для её tls-данных

    нужное кол. памяти и сохраняет указатель в TLS array (TlsAlloc/TlsSetValue). Затем полученным TLS-индексом иинциализируется спец. DWORD в бинарнике (инфа о его располлжении берется из IMAGE_TLS_DIR).

    Выделенная память инициализируется из tls-секции длл.

    доступ к данным выглядит так:

    mov eax, DWORD PTR __tls_index

    mov ecx, DWORD PTR fs:__tls_array

    mov edx, DWORD PTR [ecx+eax*4]

    mov DWORD PTR tls_var_offset[edx], some_value





    По моему TIB-поле tls_array может не инициализироваться загрузчиком если в процессе нет модулей имеющих tls directory.
     
  17. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    вообщем, все решилось. Может кому пригодиться - в сгенеренном IDA-ой листинге имеется переменная TlsDirectory, вот ее смещение и нужно закидывать по FS:2Ch, в случае DLL делать это лучше в обработчике PROCESS_ATTACH
     
  18. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Broken Sword

    ты вероятно имел ввиду DLL_THREAD_ATTACH



    Следует только иметь ввиду, что DLL не получает DLL_THREAD_ATTACH от потоков, которые уже существовали на момент загрузки этой длл.
     
  19. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    нет нет, именно DLL_PROCESS_ATTACH, событие генериться при загрузке (LoadLibrary) образа DLL-ли в память грузящим процессом
     
  20. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    в таком случае не понимаю, как это будет работать при использовании ДЛЛ потоком, отличным от того, в котором она была загружена...