Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+3 невидимых)

 eXeL@B —› Программирование —› DLL & DLL_THREAD_DETACH
Посл.ответ Сообщение

Ранг: 8.0 (гость)
Активность: 0.010
Статус: Участник

Создано: 16 мая 2008 21:27 · Поправил: Nukimi
· Личное сообщение · #1

Всех приветствую.
Помогите разобраться в проблеме.
Есть DLL:
.code
DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved:DWORD
cmp reason,1
jnz ___NotFunction
call ___Function
___NotFunction:
mov eax,TRUE
ret
DllEntry Endp
End DllEntry

Эту DLL я внедряю в процесс. Внедрение успешно. DLL начинает работать. Всё срабатывает. Первый раз DLL вызывается с параметром DLL_PROCESS_ATTACH. Всё отлично. Но второй раз DLL вызывается уже с параметром DLL_THREAD_DETACH. Хотя вчера всё работало, никаких DLL_THREAD_DETACH не было и DLL успешно функционировала в процессе. Почему она может выкидываться? По каким причинам ей посылают DLL_THREAD_DETACH?



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 16 мая 2008 23:02
· Личное сообщение · #2

DisableThreadLibraryCalls?




Ранг: 340.0 (мудрец), 22thx
Активность: 0.120
Статус: Участник
THETA

Создано: 16 мая 2008 23:12
· Личное сообщение · #3

Nukimi
На чем пишешь?

-----
Программист SkyNet




Ранг: 3.5 (гость)
Активность: 0=0
Статус: Участник

Создано: 16 мая 2008 23:23 · Поправил: asmfan
· Личное сообщение · #4

DLL_THREAD_DETACH
Indicates that a thread is exiting cleanly. If the DLL has stored a pointer to allocated memory in a TLS slot, it uses this opportunity to free the memory. The operating system calls the entry-point function of all currently loaded DLLs with this value. The call is made in the context of the exiting thread. There are cases in which the entry-point function is called for a terminating thread even if the DLL never attached to the thread ¾ for example, the entry-point function was never called with the DLL_THREAD_ATTACH value in the context of the thread in either of these two situations:
· The thread was the initial thread in the process, so the system called the entry-point function with the DLL_PROCESS_ATTACH value.
· The thread was already running when a call to the LoadLibrary function was made, so the system never called the entry-point function for it.




Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 16 мая 2008 23:42
· Личное сообщение · #5

Nukimi пишет:
По каким причинам ей посылают DLL_THREAD_DETACH?

значит в процессе, куда ты ее внедрил, завершается поток, какой-либо. зачем тебе проверять это событие? игнорируй и все.

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 8.0 (гость)
Активность: 0.010
Статус: Участник

Создано: 17 мая 2008 00:43
· Личное сообщение · #6

Av0id пишет:
DisableThreadLibraryCalls?


В процессе нет этого. Поэтому, думаю, не в этом дело. К тому же сначала она работала, а вот на следующий день почему то начала выгружаться.

FrenFolio пишет:
На чем пишешь?


Дык На Ассемблере.

Tim пишет:
значит в процессе, куда ты ее внедрил, завершается поток, какой-либо. зачем тебе проверять это событие? игнорируй и все.


Я понимаю что в процессе что то завершилось, только при чём тут моя DLL. Она выполняется 1 раз и тут же выгружается зачем то. Я хочу понять причину и что бы у меня работала DLL в процессе




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 17 мая 2008 05:08
· Личное сообщение · #7

Nukimi ты не понял. DLL это такая вещь которой процесс всегда посылает состояния тредов. Создался тред - длл получила сообщение DLL_THREAD_ATTACH, умер тред длл получила сообщение DLL_THREAD_DETACH. Если ты не хочешь их обрабатывать фильтруй эти события, если не хочешь чтобы они вообще тебе приходили юзай DisableThreadLibraryCalls. Это никаким боком не касается твоей DLL, разбирайся в причинах выгрузки а не с левыми сообщениями.

-----
Yann Tiersen best and do not fuck




Ранг: 30.2 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 19 мая 2008 10:16
· Личное сообщение · #8

wm-help.net/books-online/book/59464/59464-14.html#h20t2

Почитай , там все подробно написанно, что и зачем.



Ранг: 1.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 19 мая 2008 10:22
· Личное сообщение · #9

Угу. У меня была такая проблемы. Внедрял dll библиотекой MS-Rem-а с помощью CreateRemoteThread.
А в dll делал сплайсинг функций. Так вот как только поток, который я создал завершался, а завершался он быстро, то прога делала UnloadLibrary моей внедренной dll и в итоге все кончалось GPF, когда перехвачченная функция обращалась по адресу, где была загружена раньше моя функция.
В итоге плюнул пока на задачу ибо нет времени разбиратся почему dll выгружается. И кстати dll получала перед выгрузкой сообщения DLL_THREAD_DETACH, DLL_PROCESS_DETACH



Ранг: 37.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 19 мая 2008 10:44
· Личное сообщение · #10

Ну в случае dmitry501 вроде понятно - система убирается за завершенным потоком. А вот Nukimi не указал способ внедрения. Если то же CreateRemoteThread, то и в этом случае, хэндл закроется при завершении потока. Выход - создать поток заглушку, тупо открывающий библиотеку и ждущий сигнала завершения.



Ранг: 1.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 19 мая 2008 11:30
· Личное сообщение · #11

undb, почитал твою ссылку, спасибо - вот набрел
[QUOTE]
Если DllMain вернет FALSE (неудачная инициализация), система автоматически отключит образ файла DLL от адресного пространства процесса, а вызов LoadLibrary(Ex) даст NULL.
[/QUOTE]
Хех, в Дельфи DllProc определена как процедура, а не функция, и не имеет результата.
Соответственно я и не следил что там в EAX по выходе из DllMain
Нужно вечерком поэкспериментировать.




Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 19 мая 2008 11:49
· Личное сообщение · #12

asmfan пишет:
If the DLL has stored a pointer to allocated memory in a TLS slot, it uses this opportunity to free the memory.

если же завершающийся поток к тебе отношения не имеет, то игнорируй сообщение и все..

-----
invoke OpenFire





Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 19 мая 2008 12:01 · Поправил: Ice-T
· Личное сообщение · #13

[del]

-----
invoke OpenFire



 eXeL@B —› Программирование —› DLL & DLL_THREAD_DETACH
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати