Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выгрузка WinApi перехватчика [D7, WinXP]


Страницы:   1 2 3 4 5 6 7 8 9

KygECHuK ©   (2008-08-26 10:33:00) 

занимаюсь автоматизированным тестированием, оформил плагин для перехвата отрисовки текста. он подменяет адресса к функциям в таблице импорта, в моём случае это 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 пишутся соответсвующие сообщения в лог. Строго парами. вот и получается у меня такое впечатление.


Страницы:   1 2 3 4 5 6 7 8 9

Наверх

Титульная страница Поиск, карта сайта Написать письмо