|
|
|
TerminateThread. Закончить поток, зная только имя модуля в процессе.
|
|||
|---|---|---|---|
|
#18+
Всем доброго времени суток. Собственно в чем вопрос. После инжекта dll (1.dll) в процесс, от DLL_ATTACH создается тред и крутится в процесе до потери пульса. На DLL_PROCESSDETACH ничего не стоит. Задача - грамотно завершить созданный им тред и выгрузить этот dll(1.dll) из процесса. Я пока вижу 2 варианта: 1) Может как-нибудь попытаться сделать CreateRemoteThread со стартом в FreeLibrary для нужного процесса? 2) На мой взгляд - проще всего инжектировать в этото процесс еще один dll (2.dll), и в нем вызвать FreeLibrary (1.dll). Вобоих случаях стоит проблема: выгрузится ли этот dll (1.dll) пока работает один из созданных в нем тредов??? Если нет - то как его убить? Можно ли узнать АйДи треда, зная только имя модуля, в коде которого он создался? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2006, 14:03 |
|
||
|
TerminateThread. Закончить поток, зная только имя модуля в процессе.
|
|||
|---|---|---|---|
|
#18+
Если тебе надо закрыть по завершению процесса, то в DLL_ATTACH вставь сохранение хэндла потока в глобальную переменную, а DLL_PROCESSDETACH TerminateThread() А лучше через именованные мьютексы сделай. В потоке постоянно проверяй мьютекс, как только он заблокировался/разблокировался вызывай FreeLibraryAndExitThread() Остальные способы потребуют прописывать взаимодействие между процессами. Например, Для вызова FreeLibrary() через CreateRemoteThread() надо в родительский процесс передать хэндл внедренного модуля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2006, 15:26 |
|
||
|
TerminateThread. Закончить поток, зная только имя модуля в процессе.
|
|||
|---|---|---|---|
|
#18+
Не совсем так... Мне надо выгружать dll из работающего процесса. У него много своих работающих тредов. Та dll, которую хочу выгрузить, создала при DLL_PROCESSATTACH еще один тред, который постоянно крутится в системе. Так вот имхо, если вызвать FreeLibrary для этой dll - получу AV. И еще, я не могу менять код этой dll (1.dll). Нужно работать уже с ним. Но всеравно - спасибо за помощь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2006, 16:59 |
|
||
|
TerminateThread. Закончить поток, зная только имя модуля в процессе.
|
|||
|---|---|---|---|
|
#18+
Интересная у тебя задачка :) Кое-чем похожим сейчас сам занимаюсь. Почитай Джефри Рихтера "Программирование Windows" там эта тема хорошо расписана. 1. Для закрытия потока нужен его хэндл. Получить его можно например так: внедряешь сначала свою 2.dll, из нее LoadLibrary(1.dll) перехватываешь CreateTread() в 1.dll, правда не совсем понимаю как т.к. заменить адрес CreateTread() можно после отработки DLLMain() в 1.dll, но думаю все-таки можно. Запроминаешь хэндл трэда и когда надо прибиваешь трэд. 2. Твой вариант 2. Если DLL_DETACH в 1.dll сама закрывает этот поток, то задача упрощается, делаешь в 2.DLL FreeLibrary(GetModuleHandle("1.dll")) проверить закрывает или нет элементарно. Создай новый проект EXE Код: plaintext 1. 2. 3. 4. 5. 6. 7. Думаю все-таки закрывает, т.к. иначе по завершению FreeLibrary() сразу будет исключение в этом потоке, т.к. он будет читать из несуществующей памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2006, 17:59 |
|
||
|
TerminateThread. Закончить поток, зная только имя модуля в процессе.
|
|||
|---|---|---|---|
|
#18+
Рихтера читал, хорошо пишет. Учит думать правильно. Вообще говоря - ты абсолютно прав, но! 1) Я имею дело с процессом, когда в его АП уже загружена 1.dll. И она не сохраняет никаких данных о созданных ею потоках. Разве что объекты ядра, но это уже другой уровень. 2) В 2.dll нет реакции на DLL_PROCESS_DETACH. Я пока вижу 2 варианта: 1) Поставить "ловушку" на потоки 1.dll путем записи в его код jmp на ExitThread. Либо, что еще лучше - просто поменять раздел импорта. Я знаю ф-и, которые постоянно неявно вызываются потоком, который я и хочу прибить. Поэтому, просто можно адреса ф-й из других dll поменять на адрес ExitThread, либо вообще на свою заглушку. Тут, правда, не понятно немного что со стеком произойдет, т.к. поток будет вызывать разные ф-и с разными параметрами - а поподет всегда на ExitThread, с одним параметром. 2) Просмотреть все потоки процесса и определять по контексту, регистрам, lpParam либо еще как, где крутится этот поток. А затем, собственно прибить его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2006, 14:49 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34230798&tid=2029734]: |
0ms |
get settings: |
6ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
174ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 262ms |
| total: | 518ms |

| 0 / 0 |
