Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];

Вниз

Выгрузка 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.7 MB
Время: 0.053 c
15-1251484515
DVM
2009-08-28 22:35
2009.10.25
В Delphi 7 d Windows.pas ошибка что ли в RegEnumValueW?


2-1251702004
wah
2009-08-31 11:00
2009.10.25
XP Style и Standard


2-1251200949
yantux
2009-08-25 15:49
2009.10.25
Как конвертнуть extended в word?


15-1251125704
boriskb
2009-08-24 18:55
2009.10.25
Это что?


2-1251201731
Andy BitOff
2009-08-25 16:02
2009.10.25
Почему не срабатывает ShellExecute и чем это заменить?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский