Вниз
Скачать: CL | DM;

Выгрузка WinApi перехватчика   Найти похожие ветки 

← →
KygECHuK ©   (2008-08-28 11:22) [80]


> Ну вроде того)Только вот события не "посылают", они происходят
> или возникают.


Ну вызываем событие...
Так или иначе СПАСИБО за терпение.
Надо опробывать ваш совет


← →
Leonid Troyanovsky ©   (2008-08-28 13:05) [81]


> KygECHuK ©   (28.08.08 11:22) [80]

http://www.podgoretsky.com/ftp/Docs/Delphi/FAQ/ru.delphi.html#N109

--
Regards, LVT.


← →
KygECHuK ©   (2008-08-28 13:44) [82]


> Leonid Troyanovsky ©   (28.08.08 13:05) [81]

Спасибо за пример


← →
Сергей М. ©   (2008-08-28 14:16) [83]


> KygECHuK ©   (28.08.08 13:44) [82]


Не наступи на грабли)

В примере - глобальный хук, и хук-модуль будет внедряться во все процессы, обращающиеся к очередям сообщений своих окон


← →
Leonid Troyanovsky ©   (2008-08-28 14:29) [84]


> Сергей М. ©   (28.08.08 14:16) [83]

> В примере - глобальный хук, и хук-модуль будет внедряться
> во все процессы,

Почему во все?
Хук цепляется на определенный поток.

--
Regards, LVT.


← →
Сергей М. ©   (2008-08-28 14:48) [85]


> Leonid Troyanovsky ©   (28.08.08 14:29) [84]


> Хук цепляется на определенный поток


Да. если при вызове указан id этого потока.
А в примере он = 0

dwThreadId

Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads.


← →
KygECHuK ©   (2008-08-28 14:53) [86]


> Да. если при вызове указан id этого потока.А в примере он
> = 0


"SetWindowsHookEx(WH_GETMESSAGE,  Answer,  Hinstance,  tid)"
Нет Здесь 0


← →
Leonid Troyanovsky ©   (2008-08-28 15:05) [87]


> Сергей М. ©   (28.08.08 14:48) [85]

> А в примере он = 0

GetWindowThreadProcessID(ahwnd,  nil)

--
Regards, LVT.


← →
Сергей М. ©   (2008-08-28 15:09) [88]


> Нет Здесь 0


Здесь он вообще хз чему равен - декларация и иниц-ия этой переменной напрочь отсутствует.

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


← →
Сергей М. ©   (2008-08-28 15:11) [89]


> Leonid Troyanovsky ©   (28.08.08 15:05) [87]
>
>


Ага, вижу tid параметром.
А глаз искал переменную)


← →
KygECHuK ©   (2008-09-01 14:20) [90]

Эт снова я...
Чё то странное - библиотека почти сразу выгружется ?
Т.е вызывается DLLEntryPoint с параметром DLL_PROCESS_DETACH. Оно так должно работать?


← →
Сергей М. ©   (2008-09-01 14:32) [91]

Ты пример из [81] имеешь ввиду ?
Тогда да, так и должно.


← →
KygECHuK ©   (2008-09-01 14:43) [92]


> Ты пример из [81] имеешь ввиду ?

нет, там всё понятно...
я уже внес изменения в свой код, и вот тут такое...

вот код:

function TRemThreadInjector.DoInjectModuleIntoGUI(process: TExeModuleInstance): boolean;
var
 szLibFile        : TShortCharArr;
 Found            : boolean;
 ModuleInstance   : TModuleInstance;
 i                : Integer;
 Tid              : Cardinal;
begin
 Result := FALSE;

if (nil = Process) then
   exit;

GetModuleFileNameA(
 ModuleFromAddress(@sm_CritSecInjector),
 szLibFile,
 MAX_PATH
 );

Found := FALSE;
for i := 0 to Process.GetModuleCount() - 1 do
begin
 ModuleInstance := Process.GetModuleByIndex(i);
 if (0 = AnsiStrIComp(ModuleInstance.FullName, szLibFile)) then
 begin
  Found := TRUE;
  break;
 end; // if
end; // for
if (Found) then
 exit;
 // Получаем идентификатор потока целевого окна
 Tid := GetWindowThreadProcessId(TModuleScope(m_ModeleScope).TargWindow);

 // Устанавливаем ловушку
 TModuleScope(m_ModeleScope).HookHandle := SetWindowsHookEx(WH_GETMESSAGE, @CallBack,  HInstance, TID);

 // Псылаем характерное сообщение
 if  TModuleScope(m_ModeleScope).HookHandle  <>  0  then
   PostThreadMessage(tid,  0,  0,  0);
end;



← →
Сергей М. ©   (2008-09-01 14:49) [93]

Показывай тело колбэка ..


← →
KygECHuK ©   (2008-09-01 14:51) [94]

Вот



function CallBack(nCode: Integer; wprm: WParam;
 lprm: LParam): LResult;
begin
 result := CallNextHookEx(Modulescope.sm_pInstance.HookHandle, nCode, wprm, lprm);
end;



и всё


← →
Сергей М. ©   (2008-09-01 15:01) [95]

А ты что, инжектируешь в АП "жертвы" свой трэд и уже в контексте этого трэда пытаешься установить хук ?


← →
KygECHuK ©   (2008-09-01 15:13) [96]


> А ты что, инжектируешь в АП "жертвы" свой трэд и уже в контексте
> этого трэда пытаешься установить хук ?


Не я не изаращенец.... имхо... :)

Вот ставлю хук... ну в DLLEntryPoint на DLL_PROCESS_ATTACH инициализирую прехват.

предвосхищая ворпрос, сразу скажу, что HookHandle лежит в расшареном файле.


← →
Сергей М. ©   (2008-09-01 15:20) [97]


> HookHandle лежит в расшареном файле


Это неактуально.
Под NT можно передавать 0 в кач-ве перевого параметра CallNextHookEx


← →
KygECHuK ©   (2008-09-01 15:31) [98]


> Под NT можно передавать 0 в кач-ве перевого параметра CallNextHookEx


Вот жеж.. В рот мне ноги ! :(

Сейчас перепроверял - хук стоит.
Вот только он библиетеку не сразу подгружает а только когда пока пойдут характерные сообщения, как только они прекращаются библиотека выгружается.
Но потом опять загружается и выгружает и т.д. пока не извлеч хук.
Получается что всё работает, но вот тока постоянная автоматическая загрузка\выгрузка вызывает у мну сомнение и подозрение... Доктор, это параноя? А?


← →
Сергей М. ©   (2008-09-01 15:43) [99]


> он библиетеку не сразу подгружает а только когда пока пойдут
> характерные сообщения


Вот именно для этого ты и вызываешь PostThreadMessage(tid,  0,  0,  0) сразу после вызова ф-ции, устанавливающей хук.


> как только они прекращаются библиотека выгружается.
> Но потом опять загружается и выгружает и т.д. пока не извлеч
> хук


При нормальных условиях хук-модуль будет выгружен из АП "жертвы" не ранее явного или неявного вызова UnhookWindowsHoohEx.

Насколько я понимаю, явно ты UnhookWindowsHoohEx не вызываешь, по кр. мере раньше чем тебе станет нененужным этот модуль в АП "жертвы".
А неявный вызов выполняется самой системой при завершении процесса "жертвы".

Т.о., если эти условия заведомо не выполняются, но хук-модуль с какого-то перепугу исчезает из АП "жертвы", то это уже паранойя)


← →
KygECHuK ©   (2008-09-01 15:58) [100]


> Вот именно для этого ты и вызываешь PostThreadMessage(tid,
>   0,  0,  0) сразу после вызова ф-ции, устанавливающей хук.


Я имел ввиду и все остальные сообщения вместе взятые...


> Т.о., если эти условия заведомо не выполняются, но хук-модуль
> с какого-то перепугу исчезает из АП "жертвы", то это уже
> паранойя)


Видимо так... Ладно, отдам сотрудникам на тестирование... если пойдёт без ошибок, то просто забью....


← →
Сергей М. ©   (2008-09-01 16:07) [101]


> вызывается DLLEntryPoint с параметром DLL_PROCESS_DETACH


А как ты этот факт определил ?


← →
KygECHuK ©   (2008-09-01 16:29) [102]


> А как ты этот факт определил ?

мну там логирующая процедура


← →
Сергей М. ©   (2008-09-01 16:37) [103]


> мну там логирующая процедура
>


А про возможности встроенного отладчика ты, конечно, ничего не слышал ?


← →
KygECHuK ©   (2008-09-01 16:51) [104]


> А про возможности встроенного отладчика ты, конечно, ничего
> не слышал ?


Ну, давай, апостол, затронь мою душу... :)


← →
Сергей М. ©   (2008-09-01 17:12) [105]

Отладчиком по душе - это ж не серпом по фаберже) ..


← →
KygECHuK ©   (2008-09-01 17:18) [106]


> Отладчиком по душе - это ж не серпом по фаберже) ..


главное Ctrl+F2 не нажимать х_х..

вот я и использую логи, ибо при создании серверной части надо было отслеживать поведение внедряемой чати в рантайме.

Ну и получается красиво.. парами... Загрузился-выгрзился, зугрузился- выгрузился....


← →
Сергей М. ©   (2008-09-01 17:24) [107]


> использую логи, ибо при создании серверной части надо было
> отслеживать поведение внедряемой чати в рантайме


И чем же отладчик не угодил ?


← →
KygECHuK ©   (2008-09-01 17:33) [108]


> И чем же отладчик не угодил ?


Ничего плохого про него сказать немогу.
Ну пишеться лог:

 библеотека в такой то процесс внедренна
 ...
 содержимое перехваченного
 ...
 разные там библиотеки подгруружены в рантайме
 ...
 библеотека в из такого-то процесс извлечена


и что сдесь такого крамольного?
Тем более что по ним можно отследить работу и на других машинах..


← →
Сергей М. ©   (2008-09-01 18:54) [109]


> что сдесь такого крамольного?


А где лог колбэка ?

Он ведь д.б. вызван аккурат между загрузкой и выгрузкой хук-модуля ..


> по ним можно отследить работу и на других машинах


Ты на своей-то разберись, прежде тыкать свой код, в логике работы которого ты пока еще ничерта не разобрался, на чужую машину)


← →
KygECHuK ©   (2008-09-01 19:17) [110]


> Ты на своей-то разберись, прежде тыкать свой код, в логике
> работы которого ты пока еще ничерта не разобрался, на чужую
> машину)


Это как это я не разобрался в логике СВОЕГО кода? все логично - страдает концепция, то бишь проект.


> А где лог колбэка ?


зачем? Что в нем может быть интересного?
там же вообще ничего интересного не происходит..

ЗЫ
 тестеры ошибок не нашли, за что ещё раз спасибо!


← →
Сергей М. ©   (2008-09-01 19:22) [111]


> как это я не разобрался в логике СВОЕГО кода? все логично


да уж куда кж логичней - в протоколе фигурирует выгрузка модуля, а модуль при  этом  как был так и остался в АП)


← →
KygECHuK ©   (2008-09-01 19:33) [112]


> да уж куда кж логичней - в протоколе фигурирует выгрузка
> модуля, а модуль при  этом  как был так и остался в АП)


в прошлой "версии" с CreateRemoteThread так оно и было... все выгражалось.. один раз... последний.. )

Но м сйчас он тоже ТОЧНО не останется в АП жертвы после вызова UnHook"а.


← →
Сергей М. ©   (2008-09-02 08:53) [113]


> сйчас он тоже ТОЧНО не останется в АП жертвы после вызова
> UnHook"а.


да я не об этом)

Вот твои слова:

> библиотека почти сразу выгружется


Как я понял, UnHook ты не вызываешь, но модуль с какого-то перепугу выгружается при заведомо работающем процессе "жертвы", и при всем этом ты видишь, что модуль присутствует в его АП.

Вот ведь кудеса-то !) И ты не разобравшись в них отдаешь свое творение в эксплуатацию, пусть и тестовую ..


← →
KygECHuK ©   (2008-09-02 09:30) [114]


> Как я понял, UnHook ты не вызываешь, но модуль с какого-
> то перепугу выгружается при заведомо работающем процессе
> "жертвы", и при всем этом ты видишь, что модуль присутствует
> в его АП.


нет, все интереснее, даже, можно сказать, лучше чем я предпологал:
библеотека сама внедряется в процесс когда идут сообщения, а как только они прекращаюся она сам выгружается.... А потом снова как только пойдут сообщения она опять загружается и т. д. Поэтому наличие её потстоянного нахождения в АП жертвы я установить не могу. Только по результатам успешной работы перехватчика...


← →
Сергей М. ©   (2008-09-02 09:57) [115]


> как только они прекращаюся она сам выгружается.... А потом
> снова как только пойдут сообщения она опять загружается


Быть того не может)


> по результатам успешной работы перехватчика


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

Где и какую ты там "выгрузку" узрел - ума не приложу ..

Продолжай разгребать чудеса)


← →
evvcom ©   (2008-09-02 10:06) [116]

где-нибудь дополнительную тестовую запись в лог-файл воткнул с тем же текстом. Текст поменяй в нужном месте и посмотри результат.


← →
KygECHuK ©   (2008-09-02 10:15) [117]


> Быть того не может)


Может мне глаза врут?

Вот метод обработки


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 пишутся соответсвующие сообщения в лог. Строго парами. вот и получается у меня такое впечатление.


← →
Сергей М. ©   (2008-09-02 10:31) [118]


> // Чтоб потоки не звали ни на что больше не риагировал
>     DisableThreadLibraryCalls(HINSTANCE);


а зачем тогда кейсы DLL_THREAD_ATTACH и DLL_THREAD_DETACH в твоем коде фигурируют, раз ты заведомо не хочешь получать эти извещения ?


> g_pModuleScope.HookAll := true;


Что у тебя происходит при этом присвоении ?


← →
KygECHuK ©   (2008-09-02 11:03) [119]


> а зачем тогда кейсы DLL_THREAD_ATTACH и DLL_THREAD_DETACH
> в твоем коде фигурируют, раз ты заведомо не хочешь получать
> эти извещения ?


Как это..... Reserved... так обычно пишут :)

> Что у тебя происходит при этом присвоении ?

ничего поле присвается а прямую и используется тоько в серверной чати библиотеки при её выгрузке


← →
Сергей М. ©   (2008-09-02 11:14) [120]


> Как это..... Reserved... так обычно пишут


Обычно пишут писатели .. Ильф и Петров)..

Тебя ж не интересуют события создания/завершения потоков в целевом процессе, зачем же ты оставил эти кейсы ?

Это, конечно, непринципиально, наводит на мысль что ты не понимаешь что делаешь)

Ну хорошо, а где протоколирование и анализ потоков, вызывающих аттач/детач ?



Страницы: 1 2 3 4 5 вся ветка

Скачать: CL | DM;



Память: 0.69 MB
Время: 0.02 c
2-1251913566
Shyrick
2009-09-02 21:46
2009.10.25
SQL-запрос


2-1251128921
Deltas
2009-08-24 19:48
2009.10.25
TNMSMTP &amp; прокси-сервер


2-1251882705
sanx
2009-09-02 13:11
2009.10.25
Получить от компилятора текущую дату в констатнту, как?


2-1251749645
Alexey
2009-09-01 00:14
2009.10.25
Имя файла в TImage


15-1251132830
Igor5
2009-08-24 20:53
2009.10.25
переход по формам в случайном порядке




   Наверх