Создание секции .tls на асме

Тема в разделе "WASM.WIN32", создана пользователем Asterix, 8 июн 2005.

  1. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Интересует:

    - от чего зависит размер секции .tls

    - какие должны быть у нее атрибуты(characteristics)

    - примеры



    пример от EliCZ уже смотрел.
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




    Можешь линком поделится? Самое полное описание что я видел, это в pecoff.pdf, но с примерами напряг, у меня есть только такой (использование callback)
    Код (Text):
    1. ;==================================================
    2. format      pe gui
    3. include     '%fasminc%\win32a.inc'
    4. ;==================================================
    5.             ret
    6. caption     db      'tls',0
    7. message     db      'callback',0
    8. ;==================================================
    9. proc        callback,handle,reason,reserved
    10.             cmp     [reason],DLL_PROCESS_ATTACH
    11.             jnz     @f
    12.             invoke  MessageBox,0,message,caption,0
    13. @@:         return
    14. endp
    15. ;==================================================
    16. data        9
    17.             dd a,a,a,c
    18. a           dd 0
    19. c           dd callback
    20.             dd 0
    21. end data
    22. ;==================================================
    23. data        import
    24. library     user32,'user32.dll'
    25. include     '%fasminc%\apia\user32.inc'
    26. end         data
    27. ;==================================================
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576




    действительно, это самое лучшее описание из встретившихся мне.
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Такой вопрос - Зачем файлу вообще секция .tls

    как таковая, ведь TlsCallbacks находятся в секции кода?
     
  6. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    Asterix

    насколько я понимаю tls секция для хранения

    переменных локальных для каждого потока

    в delphi: threadvar



    то есть если одна процедура выполняетс в нескольких потоков , то переменные из tls выделяются для каждого потока отдельно.



    вот , кстати мне в голову пришло, а адрес у них одинаковый будет ?это как же тогда (это я сам себе :derisive:
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    staier

    FS разный у потоков. Следовательно, TLS тоже разный, как и должно быть.
     
  8. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    Quantum

    а , селектор сегмента что - ли ?

    а я всегда думал что в win32 это ни хрена роли не играет ? ведь адресное пространство - то плоское

    ну да ладно посмотрю сам вотладчике



    спасибо за на_водку
     
  9. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Оно плоское, просто страницы с TEB каждому потоку выделяются отдельные:
    Код (Text):
    1. Address  Size     (Decimal) Contains
    2. 7FFDC000 00001000 (4096.)   data block of thread 000002D9
    3. 7FFDD000 00001000 (4096.)   data block of thread 000002D8
    4. 7FFDE000 00001000 (4096.)   data block of main thread
    5. 7FFDF000 00001000 (4096.)
    6. 7FFE0000 00001000 (4096.)
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    У меня почему-то получается что если callback пустой,

    или почти пустой, т.е. ничего не делает(у меня

    были только mov и ret в нем) то он не вызывается %)

    В нем обязательно должен быть вызов API что-ли?
     
  11. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    "Пустой" тоже вызывается, но если ты заремил MessageBox в примере выше, то вся прога получится как без импорта и на NT4.0-5.0 не запустится, для callback'a нужен kernel32.dll, или у тебя это на 9х?
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    kernel32.dll есть, т.к. ExitProcess прога юзает.

    Естественно я пробую в 2k/XP :)
     
  13. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Ну тогда покажи код чтоли :), у меня аттач работает

    [​IMG] 1593545604__tls.asm
     
  14. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    у меня появилось подозрение...

    убери user32.dll и ещё попробуй.
     
  15. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Если выскочит ексепшен "36363636" значит работает, иначе получил бы "00000000"

    Подозрение у тебя может из-за SEH'а в callback'е



    [​IMG] _1678925735__tls.asm
     
  16. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    bogrus

    Я пробовал на такой проге:
    Код (Text):
    1. ;@echo off
    2. ;goto make
    3.  
    4. format MS COFF
    5.  
    6.  
    7. include '%fasminc%\win32a.inc'
    8.  
    9. extrn '__imp__ExitProcess@4' as ExitProcess:dword
    10.  
    11.  
    12. section '.code' code readable writeable executable
    13.  
    14.  
    15. align 4
    16. TlsCallback_0:  ; DllHandle, Reason, Reserved
    17.     cmp DWORD [esp + 4*2], DLL_PROCESS_ATTACH
    18.     jne @F
    19.     mov BYTE [_start], 6Ah
    20. @@:
    21.     mov eax, 1
    22.     retn 4*3
    23.  
    24.  
    25. public _start
    26. align 4
    27. _start:
    28.  
    29. invoke ExitProcess, 0
    30.  
    31.  
    32. section '.data' data readable writeable
    33.  
    34. TlsCallbacks:
    35.     dd  TlsCallback_0
    36.     dd  0
    37.  
    38. public __tls_used
    39. __tls_used:
    40.     StartAddressOfRawData   dd 1 ; здесь и ниже 1 конечно не правильно, но вроде как это
    41.                                                              ; никак не влияет на работоспособность проги
    42.                                                              ; нужно поставить TlsStart и TlsEnd
    43.     EndAddressOfRawData     dd 1
    44.     AddressOfIndex          dd  TlsIndex
    45.     AddressOfCallBacks      dd  TlsCallbacks
    46.     SizeOfZeroFill          dd  0
    47.     Characteristics         dd  0
    48.  
    49. TlsIndex       dd  ?
    50.  
    51.  
    52. section '.tls' readable writeable
    53.  
    54. rb 1000h
    55.  
    56.  
    57. ;:make
    58. ;SET PROJECTNAME=PatchOEP
    59. ;if exist %PROJECTNAME%.exe del %PROJECTNAME%.exe
    60. ;if exist %PROJECTNAME%.obj del %PROJECTNAME%.obj
    61. ;C:\FasmC\fasm.exe %PROJECTNAME%.bat
    62. ;if not exist %PROJECTNAME%.obj goto finish
    63. ;%masm32%\bin\link /nologo /opt:nowin98 /SUBSYSTEM:WINDOWS /ENTRY:start
    64. /release /LIBPATH:%masm32%\lib %PROJECTNAME%.obj KERNEL32.LIB
    65. ;if exist %PROJECTNAME%.obj del %PROJECTNAME%.obj
    66. ;:finish
    67. ;pause
    68. ;cls
    69.  
     
  17. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    А-а-а, я врубился, видимо ты своим "mov BYTE [_start], 6Ah" затираешь олькин бряк на EP и она не останавливается а сразу уходит в "invoke ExitProcess, 0", так что работает :)
     
  18. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
  19. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    так и задумано.

    Но мне то нужно чтоб брякнулось в callback'е,

    т.е. тормозим сначала на System breakpoint, потом

    хотим брякнуться в callback'е и не брякается,

    да собственно и не вызывается callback.
     
  20. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    А ..., я бы не отказался от такого плугина :) Там дело ф том, что SEH в TLS пропускает любые ексепшены, чтобы прога все-равно смогла работать, но олька останавливается на int3 в callback'е, т.ч. он вызывается