powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / TerminateThread. Закончить поток, зная только имя модуля в процессе.
6 сообщений из 6, страница 1 из 1
TerminateThread. Закончить поток, зная только имя модуля в процессе.
    #34230464
Павел. С
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток.

Собственно в чем вопрос.

После инжекта dll (1.dll) в процесс, от DLL_ATTACH создается тред и крутится в процесе до потери пульса.
На DLL_PROCESSDETACH ничего не стоит.
Задача - грамотно завершить созданный им тред и выгрузить этот dll(1.dll) из процесса.

Я пока вижу 2 варианта:
1) Может как-нибудь попытаться сделать CreateRemoteThread со стартом в FreeLibrary для нужного процесса?
2) На мой взгляд - проще всего инжектировать в этото процесс еще один dll (2.dll), и в нем вызвать FreeLibrary (1.dll).

Вобоих случаях стоит проблема:
выгрузится ли этот dll (1.dll) пока работает один из созданных в нем тредов??? Если нет - то как его убить?

Можно ли узнать АйДи треда, зная только имя модуля, в коде которого он создался?
...
Рейтинг: 0 / 0
TerminateThread. Закончить поток, зная только имя модуля в процессе.
    #34230798
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если тебе надо закрыть по завершению процесса, то в DLL_ATTACH вставь сохранение хэндла потока в глобальную переменную, а DLL_PROCESSDETACH TerminateThread()
А лучше через именованные мьютексы сделай. В потоке постоянно проверяй мьютекс, как только он заблокировался/разблокировался вызывай FreeLibraryAndExitThread()
Остальные способы потребуют прописывать взаимодействие между процессами. Например, Для вызова FreeLibrary() через CreateRemoteThread() надо в родительский процесс передать хэндл внедренного модуля.
...
Рейтинг: 0 / 0
TerminateThread. Закончить поток, зная только имя модуля в процессе.
    #34231083
Павел. С
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не совсем так...
Мне надо выгружать dll из работающего процесса.
У него много своих работающих тредов.

Та dll, которую хочу выгрузить, создала при DLL_PROCESSATTACH еще один тред, который постоянно крутится в системе.

Так вот имхо, если вызвать FreeLibrary для этой dll - получу AV.

И еще, я не могу менять код этой dll (1.dll).
Нужно работать уже с ним.

Но всеравно - спасибо за помощь
...
Рейтинг: 0 / 0
TerminateThread. Закончить поток, зная только имя модуля в процессе.
    #34231265
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересная у тебя задачка :)
Кое-чем похожим сейчас сам занимаюсь. Почитай Джефри Рихтера "Программирование 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.
main()
{
MessageBox(...);
HMODULE h1 =LoadLibrary("1.dll")
MessageBox(...);
FreeLibrary(h1)
MessageBox(...);
}
И посмотри Far`ом в ProcessList количество трэдов на каждом MessageBox(...) там же показаны загруженные модули.
Думаю все-таки закрывает, т.к. иначе по завершению FreeLibrary() сразу будет исключение в этом потоке, т.к. он будет читать из несуществующей памяти.
...
Рейтинг: 0 / 0
TerminateThread. Закончить поток, зная только имя модуля в процессе.
    #34232864
Павел. С
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Рихтера читал, хорошо пишет. Учит думать правильно.

Вообще говоря - ты абсолютно прав, но!
1) Я имею дело с процессом, когда в его АП уже загружена 1.dll. И она не сохраняет никаких данных о созданных ею потоках. Разве что объекты ядра, но это уже другой уровень.

2) В 2.dll нет реакции на DLL_PROCESS_DETACH.

Я пока вижу 2 варианта:
1) Поставить "ловушку" на потоки 1.dll путем записи в его код jmp на ExitThread. Либо, что еще лучше - просто поменять раздел импорта. Я знаю ф-и, которые постоянно неявно вызываются потоком, который я и хочу прибить. Поэтому, просто можно адреса ф-й из других dll поменять на адрес ExitThread, либо вообще на свою заглушку. Тут, правда, не понятно немного что со стеком произойдет, т.к. поток будет вызывать разные ф-и с разными параметрами - а поподет всегда на ExitThread, с одним параметром.

2) Просмотреть все потоки процесса и определять по контексту, регистрам, lpParam либо еще как, где крутится этот поток. А затем, собственно прибить его.
...
Рейтинг: 0 / 0
TerminateThread. Закончить поток, зная только имя модуля в процессе.
    #34233084
Павел. С
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если интересно - сделал через ZwQueryInformationThread.

Получил адрес старта потока, сравнил с базой нужной dll, и угрохал, зная хендл.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / TerminateThread. Закончить поток, зная только имя модуля в процессе.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]