Интересует: - от чего зависит размер секции .tls - какие должны быть у нее атрибуты(characteristics) - примеры пример от EliCZ уже смотрел.
Можешь линком поделится? Самое полное описание что я видел, это в pecoff.pdf, но с примерами напряг, у меня есть только такой (использование callback) Код (Text): ;================================================== format pe gui include '%fasminc%\win32a.inc' ;================================================== ret caption db 'tls',0 message db 'callback',0 ;================================================== proc callback,handle,reason,reserved cmp [reason],DLL_PROCESS_ATTACH jnz @f invoke MessageBox,0,message,caption,0 @@: return endp ;================================================== data 9 dd a,a,a,c a dd 0 c dd callback dd 0 end data ;================================================== data import library user32,'user32.dll' include '%fasminc%\apia\user32.inc' end data ;==================================================
Такой вопрос - Зачем файлу вообще секция .tls как таковая, ведь TlsCallbacks находятся в секции кода?
Asterix насколько я понимаю tls секция для хранения переменных локальных для каждого потока в delphi: threadvar то есть если одна процедура выполняетс в нескольких потоков , то переменные из tls выделяются для каждого потока отдельно. вот , кстати мне в голову пришло, а адрес у них одинаковый будет ?это как же тогда (это я сам себе
Quantum а , селектор сегмента что - ли ? а я всегда думал что в win32 это ни хрена роли не играет ? ведь адресное пространство - то плоское ну да ладно посмотрю сам вотладчике спасибо за на_водку
Оно плоское, просто страницы с TEB каждому потоку выделяются отдельные: Код (Text): Address Size (Decimal) Contains 7FFDC000 00001000 (4096.) data block of thread 000002D9 7FFDD000 00001000 (4096.) data block of thread 000002D8 7FFDE000 00001000 (4096.) data block of main thread 7FFDF000 00001000 (4096.) 7FFE0000 00001000 (4096.)
У меня почему-то получается что если callback пустой, или почти пустой, т.е. ничего не делает(у меня были только mov и ret в нем) то он не вызывается %) В нем обязательно должен быть вызов API что-ли?
"Пустой" тоже вызывается, но если ты заремил MessageBox в примере выше, то вся прога получится как без импорта и на NT4.0-5.0 не запустится, для callback'a нужен kernel32.dll, или у тебя это на 9х?
Если выскочит ексепшен "36363636" значит работает, иначе получил бы "00000000" Подозрение у тебя может из-за SEH'а в callback'е _1678925735__tls.asm
bogrus Я пробовал на такой проге: Код (Text): ;@echo off ;goto make format MS COFF include '%fasminc%\win32a.inc' extrn '__imp__ExitProcess@4' as ExitProcess:dword section '.code' code readable writeable executable align 4 TlsCallback_0: ; DllHandle, Reason, Reserved cmp DWORD [esp + 4*2], DLL_PROCESS_ATTACH jne @F mov BYTE [_start], 6Ah @@: mov eax, 1 retn 4*3 public _start align 4 _start: invoke ExitProcess, 0 section '.data' data readable writeable TlsCallbacks: dd TlsCallback_0 dd 0 public __tls_used __tls_used: StartAddressOfRawData dd 1 ; здесь и ниже 1 конечно не правильно, но вроде как это ; никак не влияет на работоспособность проги ; нужно поставить TlsStart и TlsEnd EndAddressOfRawData dd 1 AddressOfIndex dd TlsIndex AddressOfCallBacks dd TlsCallbacks SizeOfZeroFill dd 0 Characteristics dd 0 TlsIndex dd ? section '.tls' readable writeable rb 1000h ;:make ;SET PROJECTNAME=PatchOEP ;if exist %PROJECTNAME%.exe del %PROJECTNAME%.exe ;if exist %PROJECTNAME%.obj del %PROJECTNAME%.obj ;C:\FasmC\fasm.exe %PROJECTNAME%.bat ;if not exist %PROJECTNAME%.obj goto finish ;%masm32%\bin\link /nologo /opt:nowin98 /SUBSYSTEM:WINDOWS /ENTRY:start /release /LIBPATH:%masm32%\lib %PROJECTNAME%.obj KERNEL32.LIB ;if exist %PROJECTNAME%.obj del %PROJECTNAME%.obj ;:finish ;pause ;cls
А-а-а, я врубился, видимо ты своим "mov BYTE [_start], 6Ah" затираешь олькин бряк на EP и она не останавливается а сразу уходит в "invoke ExitProcess, 0", так что работает
так и задумано. Но мне то нужно чтоб брякнулось в callback'е, т.е. тормозим сначала на System breakpoint, потом хотим брякнуться в callback'е и не брякается, да собственно и не вызывается callback.
А ..., я бы не отказался от такого плугина Там дело ф том, что SEH в TLS пропускает любые ексепшены, чтобы прога все-равно смогла работать, но олька останавливается на int3 в callback'е, т.ч. он вызывается