Текущий архив: 2009.10.25;
Скачать: 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 вся ветка
Текущий архив: 2009.10.25;
Скачать: CL | DM;
Память: 0.69 MB
Время: 0.056 c