Про смысл келлбеков вроде все ясно.А вот по всему остальному одна сплошная путанница 1.В тлс дире находятся только IMAGE_TLS_DIRECTORY ? 2.Кол-во этих стуктур равно кол-ву потоков юзающих статическую тлс память? 3.В самой секции только находится содержимое переменных статического тлс,и массив IMAGE_TLS_CALLBACK ? 4.Поля в PEB,связанные с тлс,меняются только при использование динамического тлс?
Интересная вещь. Как в анекдоте, раз объясняю - не понимают, два - тоже, три - сам уже понял 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): typedef struct _IMAGE_TLS_DIRECTORY32 { DWORD StartAddressOfRawData; // это начало данных DWORD EndAddressOfRawData; DWORD AddressOfIndex; // PDWORD DWORD AddressOfCallBacks; // PIMAGE_TLS_CALLBACK * DWORD SizeOfZeroFill; DWORD Characteristics; } IMAGE_TLS_DIRECTORY32; typedef IMAGE_TLS_DIRECTORY32 * PIMAGE_TLS_DIRECTORY32; 2. Термин структу́ра (от лат. structūra — «строение») имеет целый спектр значений, встречающихся в различных областях человеческого знания и практике. В общем, философском значении структура есть известная Кантовская непостигаемая «вещь в себе». 3. Зависит от компилятора. Можно БСЭ запихнуть. А если нет секции, то что тут находится? 4. Динамические поля меняются системой, статические самой программой. Есть многое в природе, друг Горацио, Что и не снилось нашим мудрецам. Код (Text): include 'win32ax.inc' .code start: invoke MessageBox,0,"Отладчик не найден",0,0 invoke ExitProcess,0 ret .end start proc callback,handle,reason,reserved cmp [reason],DLL_PROCESS_ATTACH jnz @f invoke MessageBox,0,"Первый пошел",0,0 @@: ret endp proc callback2,handle,reason,reserved cmp [reason],DLL_PROCESS_ATTACH jnz @f invoke IsDebuggerPresent cmp eax, 0 jz @f invoke MessageBox,0,"Здравствуй и прощай, отладка",";)",0 invoke ExitProcess,0 @@: ret endp data 9 dd a ; StartAddressOfRawData; dd a ; EndAddressOfRawData dd a ; AddressOfIndex dd c ; AddressOfCallBacks a dd 0 ; c dd callback, callback2 ; массив IMAGE_TLS_CALLBACK ;Array Of Callbacks dd 0 ; NULL - end of Array Of Callbacks end data Как отловить в процессе в том числе и tls переменные. http://bugtraq.ru/forum/full/2002/operatingsystems/63566.html Microsoft Developer Network (MSDN) документация по PE:
Ладно перефразиру,оптимизирую и сведу все к 1му единственному вопросу - Где в PE файле хранятся содержимые перменных для тлс,и массив IMAGE_TLS_CALLBACK ?
Например, разберём сишный пример статьи. 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 ................ Это всё.