Это путанное TLS.Помогите понять.

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 27 дек 2010.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Про смысл келлбеков вроде все ясно.А вот по всему остальному одна сплошная путанница
    1.В тлс дире находятся только IMAGE_TLS_DIRECTORY ?
    2.Кол-во этих стуктур равно кол-ву потоков юзающих статическую тлс память?
    3.В самой секции только находится содержимое переменных статического тлс,и массив IMAGE_TLS_CALLBACK ?
    4.Поля в PEB,связанные с тлс,меняются только при использование динамического тлс?
     
  2. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Интересная вещь.
    Как в анекдоте, раз объясняю - не понимают, два - тоже, три - сам уже понял ;)

    Q: Что такое TLS?
    A: TLS (Thread Local Storage) - Это 24-х (18h) байтная структура, причем 8 последних байт забито нулями, но это не принципиально. Родное место этой структуры в секции .rdata (по крайней мере, для программ, написанных на Delphi) или где кодер разместит;) Thread Local Storage используется для выделения областей памяти, используемых потоками (threads) для хранения данных.
    Угадайте откуда текст ;)
    Прикольно флатассемблер из примера записал размер 020h, а секцию не создал.

    http://www.wasm.ru/article.php?article=tls
    видимо вопрос по этой статье

    1. тлс дир. Информация о директориях расположена в заголовке перед информацией о секциях. Директория за секциями. Она 018h размером. Больше ничего в этой директории.
    Это её формат:
    Код (Text):
    1. typedef struct _IMAGE_TLS_DIRECTORY32 {
    2.     DWORD   StartAddressOfRawData;   // это начало данных
    3.     DWORD   EndAddressOfRawData;
    4.     DWORD   AddressOfIndex;             // PDWORD
    5.     DWORD   AddressOfCallBacks;         // PIMAGE_TLS_CALLBACK *
    6.     DWORD   SizeOfZeroFill;
    7.     DWORD   Characteristics;
    8. } IMAGE_TLS_DIRECTORY32;
    9. typedef IMAGE_TLS_DIRECTORY32 * PIMAGE_TLS_DIRECTORY32;
    2. Термин структу́ра (от лат. structūra — «строение») имеет целый спектр значений, встречающихся в различных областях человеческого знания и практике. В общем, философском значении структура есть известная Кантовская непостигаемая «вещь в себе».

    3. Зависит от компилятора. Можно БСЭ запихнуть. А если нет секции, то что тут находится?

    4. Динамические поля меняются системой, статические самой программой.

    Есть многое в природе, друг Горацио, Что и не снилось нашим мудрецам.

    Код (Text):
    1. include     'win32ax.inc'
    2. .code
    3. start:
    4.         invoke  MessageBox,0,"Отладчик не найден",0,0
    5.         invoke ExitProcess,0
    6.         ret
    7. .end start
    8. proc        callback,handle,reason,reserved
    9.         cmp     [reason],DLL_PROCESS_ATTACH
    10.         jnz     @f
    11.         invoke  MessageBox,0,"Первый пошел",0,0
    12. @@:     ret
    13. endp
    14.  
    15. proc        callback2,handle,reason,reserved
    16.         cmp     [reason],DLL_PROCESS_ATTACH
    17.         jnz     @f
    18.         invoke  IsDebuggerPresent
    19.         cmp eax, 0
    20.         jz     @f
    21.         invoke  MessageBox,0,"Здравствуй и прощай, отладка",";)",0
    22.         invoke ExitProcess,0
    23. @@:     ret
    24.  
    25. endp
    26. data        9
    27.         dd a ; StartAddressOfRawData;
    28.         dd a ; EndAddressOfRawData
    29.         dd a ; AddressOfIndex
    30.         dd c ; AddressOfCallBacks
    31. a       dd 0 ;
    32. c       dd callback, callback2 ; массив IMAGE_TLS_CALLBACK ;Array Of Callbacks
    33.         dd 0    ; NULL - end of Array Of Callbacks
    34. end data
    Как отловить в процессе в том числе и tls переменные.
    http://bugtraq.ru/forum/full/2002/operatingsystems/63566.html


    Microsoft Developer Network (MSDN) документация по PE:
     
  3. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Ладно перефразиру,оптимизирую и сведу все к 1му единственному вопросу - Где в PE файле хранятся содержимые перменных для тлс,и массив IMAGE_TLS_CALLBACK ?
     
  4. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Например, разберём сишный пример статьи.

    Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
    00000000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ�.........ÿÿ..
    ........
    000000E0 50 45 00 00 4C 01 04 00 CF 39 1C 4D 00 00 00 00 PE..L...Ï9.M....

    ; Описание директории:
    ; Смещение в файле - 40a8
    ; Обычный размер - 18.
    000001A0 A8 40 00 00 18 00 00 00 ¨@......

    ; Описание секции:
    ; Смещение в файле - 6000
    00000250 2E 74 6C 73 00 00 00 00 28 00 00 00 00 60 00 00 .tls....(....`..
    00000260 00 10 00 00 00 60 00 00 00 00 00 00 00 00 00 00 .....`..........
    00000270 00 00 00 00 40 00 00 C0 00 00 00 00 00 00 00 00 ....@..À........

    ;_IMAGE_TLS_DIRECTORY32:
    ; Виртуальный адрес КАЛЛБЭКа (массив IMAGE_TLS_CALLBACK)
    000040A0 00 60 40 00 24 60 40 00 .`@.$`@.
    000040B0 B0 54 40 00 14 50 40 00 00 00 00 00 00 00 00 00 °T@..P@.........

    ;TLS_СЕКЦИЯ:
    Содержимое перменных не инициализировано:
    00006000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    00006010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    00006020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

    Это всё.