![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выгрузка WinApi перехватчика [D7, WinXP]
KygECHuK © (2008-08-26 10:33:00)
Страницы: < 1 2 3 4 5 6 7 8 9 >
занимаюсь автоматизированным тестированием, оформил плагин для перехвата отрисовки текста. он подменяет адресса к функциям в таблице импорта, в моём случае это textOut в GDI32.dll. Всё работает хорошо, вот только что при выгрузке перхватчика с некоторойй вероятностью появлятся ошибка доступа к памяти...
Возможно кто нибудь занимался подомной проблематикой и может что нибудь посоветовать...
KygECHuK (2008-09-02 15:42:00) [41]Насчёт фарша, у меня ошибочно опредяется состояние ловушки, надо определять не по наличию модуля в процессе, а сделать специальный флаг.
Сейчас написал тестовый проект чтоб иcпользовать его как сервер.
Сделал два режима
первый:
1 Жмакаем кнопку хук внедряется
2 что то делаем в жертве
3 Жмакаем другую кнопку хук извлекается
то есть всё как вы написали
второй:
Но существует необходимость оперативно пересылать данные после прехвата в форму сервера для чего я реши использовать WM_COPYDATA,
для этого я создал отдельный поток который внедряет хук и перерисовывает окно.
Вот в этом случае и происходит самостоятельная выгрызка библиотеки перехватчика, т. к. я её , выгрызку, нигде не вызываю.
А точно неявная выгрузка ловушки происходит только по завершению процесса?
На этот раз проверяд не по логу, а в Process Sxplorer'е
Сергей М. (2008-09-02 14:27:00) [42]
> какойто фарш выходит
Известно какой - из мух и котлет) ..
KygECHuK (2008-09-02 13:54:00) [43]
> Ну так что насчет [126] ?
Ща гоняю, какойто фарш выходит.... сейчас разберусь и напишу
Сергей М. (2008-09-02 13:49:00) [44]Ну так что насчет [126] ?
KygECHuK (2008-09-02 13:38:00) [45]
> Ты осознаешь, что в процессах АИС и ТестКомплит фигурируют
> два совершенно разных экз-ра твоего модуля ?
Да, это так...
Сергей М. (2008-09-02 13:18:00) [46]
> Если библитека серверным процессом выгружается, то соответсвенно,
> выгружаюися и все прехватчики
Ты осознаешь, что в процессах АИС и ТестКомплит фигурируют два совершенно разныхэкз-ра твоего модуля ?
KygECHuK (2008-09-02 12:45:00) [47]
> Нет, это та прога, про которую ты говорил в начале... а,
> нет, та прога - жертва :)
ААА... брат по разуму!! Я его не понимаю, точно так же, как меня не понимают другие!!!! :))
Жертва - АИС, не жертва - TestComplete. он же серверный процесс.
evvcom (2008-09-02 12:36:00) [48]
> Тестировщик это в смысле я? :)
Нет, это та прога, про которую ты говорил в начале... а, нет, та прога - жертва :)
KygECHuK (2008-09-02 12:32:00) [49]
> Хук-модуль у тебя должен выгружаться либо по завершению
> "жертвы" либо после вызова UnHook-ф-ции, и по барабану кто
> и откуда ее вызывает - хоть из "серверного процесса", хоть
> с серобуромалинового, хоть с Луны)
мне тоже поборабану, ну человек спросил...
Сергей М. (2008-09-02 12:22:00) [50]
> Если библитека серверным процессом выгружается
Не знаю я никаких твоих "серверных процессов" !)
Хук-модуль у тебя должен выгружаться либо по завершению "жертвы" либо после вызова UnHook-ф-ции, и по барабану кто и откуда ее вызывает - хоть из "серверного процесса", хоть с серобуромалинового, хоть с Луны)
Сергей М. (2008-09-02 12:17:00) [51]Черт те что и сбоку бантик)... Серверы какие-то, соообщения какие-тио кому-то, эжекты какие-то из всех процессов ..
Выкинь нафих всю эту требуху хотя бы на время и органичься только протоколированием:
procedure DLLEntryPoint(Reason: DWORD);
begin
case Reason of
DLL_PROCESS_ATTACH: LogMessage('Process attach, tid = ' + IntToStr(GetCurrentThreadId));
DLL_PROCESS_DETACH: LogMessage('Process detach, tid = ' + IntToStr(GetCurrentThreadId));
end;
end;
При получении управления при инициализации хук-модуля СРАЗУ ЖЕ установи
IsMultiThread := True;
Теперь стартуй целевой процесс и устанвливай хук. Что видишь в протоколе ?
Теперь снимай хук. Что видишь в протоколе ?
Теперь вновь ставль хук. Завершай целевой процесс. Что видишь в протоколе ?
KygECHuK (2008-09-02 12:16:00) [52]
> Так получается, что не только хук снимается, но и на сервере
> dll завершается/выгружается?
Если библитека серверным процессом выгружается, то соответсвенно, выгружаюися и все прехватчики. и никак не наоборот.
> Это так тестировщик работает?
Тестировщикэто в смысле я? :)
evvcom (2008-09-02 12:06:00) [53]
> В библиотеке реализована и серверная часть перехватчика
Я догадался
> она себя и внедряет в АП жертвы
так все-таки сервер рулит внедрением. Я обычно в LogMessage еще включаю и дату/время события. Зачем отрицание "(not m_bIsThisServerProcess)", почему бы его не убрать и then/else не поменять местами для уменьшения путаницы? Так получается, что не только хук снимается, но и на сервере dll завершается/выгружается? Это так тестировщик работает?
KygECHuK (2008-09-02 11:52:00) [54]
> Что-то всё с ног на голову. Кто такой сервер? Жертва? Почему
> жертва стала сервером
В библиотеке реализована и серверная часть перехватчика. она себя и внедряет в АП жертвы.
evvcom (2008-09-02 11:46:00) [55]Что-то всё с ног на голову. Кто такой сервер? Жертва? Почему жертва стала сервером?
KygECHuK (2008-09-02 11:27:00) [56]
> Это, конечно, непринципиально, наводит на мысль что ты не
> понимаешь что делаешь)
Шерлок как вы это делаете? :)
Очень даже не принципиально... Я еще очень много лишнего дописал в поисике ошибки. В ближайшее время все это будет убранно.
> Ну хорошо, а где протоколирование и анализ потоков, вызывающих
> аттач/детач ?
Никакого анализа потоков нет.
procedure TModuleScope.ManageModuleDetachment;
begin
//
// Проверка сообщения что оно из перехваченого приложения
//
if (not m_bIsThisServerProcess) then
begin
// Извлекаем перехватчики
FinalizeHookManagement();
// Сервер исчо работает?
if (0 <> m_phwndServer^) then
// Посылаем сообщение серверу об отключении
PostMessage(
m_phwndServer^,
UWM_HOOKTOOL_DLL_UNLOADED,
0,
GetCurrentProcessId()
);
end else
begin
m_pInjector.EjectModuleFromAllProcesses(m_pWhenZero.GetZeroHandle);
LogMessage( '------- Сервер становлен и все ловушки выгружены ------');
end;
end;
Вот по получении сообщения в серверной части и пишется сообщение в лог
Сергей М. (2008-09-02 11:14:00) [57]
> Как это..... Reserved... так обычно пишут
Обычно пишут писатели .. Ильф и Петров)..
Тебя ж не интересуют события создания/завершения потоков в целевом процессе, зачем же ты оставил эти кейсы ?
Это, конечно, непринципиально, наводит на мысль что ты не понимаешь что делаешь)
Ну хорошо, а где протоколирование и анализ потоков, вызывающих аттач/детач ?
KygECHuK (2008-09-02 11:03:00) [58]
> а зачем тогда кейсы DLL_THREAD_ATTACH и DLL_THREAD_DETACH
> в твоем коде фигурируют, раз ты заведомо не хочешь получать
> эти извещения ?
Как это..... Reserved... так обычно пишут :)
> Что у тебя происходит при этом присвоении ?
ничего поле присвается а прямую и используется тоько в серверной чати библиотеки при её выгрузке
Сергей М. (2008-09-02 10:31:00) [59]
> // Чтоб потоки не звали ни на что больше не риагировал
> DisableThreadLibraryCalls(HINSTANCE);
а зачем тогда кейсы DLL_THREAD_ATTACH и DLL_THREAD_DETACH в твоем коде фигурируют, раз ты заведомо не хочешь получать эти извещения ?
> g_pModuleScope.HookAll := true;
Что у тебя происходит при этом присвоении ?
KygECHuK (2008-09-02 10:15:00) [60]
> Быть того не может)
Может мне глаза врут?
Вот метод обработки
procedure DLLEntryPoint(Reason: DWORD);
begin
case Reason of
DLL_PROCESS_ATTACH:
begin
InitSharedFile;
sg_hwndServer := @sm_lpSharedRec^.m_phwndServer;
sg_bHookInstalled := @sm_lpSharedRec^.m_pbHookInstalled;
sg_hwndTarget := @sm_lpSharedRec^.m_phwndTarget;
sg_bSendMsg := @sm_lpSharedRec^.m_SendResults;
sg_hHookHandle := @sm_lpSharedRec^.m_HookHandle;
// Отключаем События потока
// Чтоб потоки не звали ни на что больше не риагировал
DisableThreadLibraryCalls(HINSTANCE);
g_pModuleScope := TModuleScope.GetInstance(
sg_hwndServer,
sg_bHookInstalled,
sg_hwndTarget,
sg_bSendMsg,
sg_hHookHandle
);
g_pModuleScope.ManageModuleEnlistment();
end;
DLL_THREAD_ATTACH:
begin
end;
DLL_THREAD_DETACH:
begin
end;
DLL_PROCESS_DETACH:
begin
// DLL Выходит из адресного пространства процесса .
g_pModuleScope.HookAll := true;
g_pModuleScope.ManageModuleDetachment();
ReleaseShredFile;
end;
end;
Вот на DLL_PROCESS_ATTACH и DLL_PROCESS_DETACH пишутся соответсвующие сообщения в лог. Строго парами. вот и получается у меня такое впечатление.