-
> Ну вроде того)Только вот события не "посылают", они происходят
> или возникают.
Ну вызываем событие...
Так или иначе СПАСИБО за терпение.
Надо опробывать ваш совет
-
-
> Leonid Troyanovsky © (28.08.08 13:05) [81]
Спасибо за пример
-
> KygECHuK © (28.08.08 13:44) [82]
Не наступи на грабли)
В примере - глобальный хук, и хук-модуль будет внедряться во все процессы, обращающиеся к очередям сообщений своих окон
-
> Сергей М. © (28.08.08 14:16) [83]
> В примере - глобальный хук, и хук-модуль будет внедряться
> во все процессы,
Почему во все?
Хук цепляется на определенный поток.
--
Regards, LVT.
-
> 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.
-
> Да. если при вызове указан id этого потока.А в примере он
> = 0
"SetWindowsHookEx(WH_GETMESSAGE, Answer, Hinstance, tid)"
Нет Здесь 0
-
> Сергей М. © (28.08.08 14:48) [85]
> А в примере он = 0
GetWindowThreadProcessID(ahwnd, nil)
--
Regards, LVT.
-
> Нет Здесь 0
Здесь он вообще хз чему равен - декларация и иниц-ия этой переменной напрочь отсутствует.
Тем не менее имей ввиду - для внедрения хук-модуля в конкретный целевой процесс указание потока этого процесса обязательно.
-
> Leonid Troyanovsky © (28.08.08 15:05) [87]
>
>
Ага, вижу tid параметром.
А глаз искал переменную)
-
Эт снова я...
Чё то странное - библиотека почти сразу выгружется ?
Т.е вызывается DLLEntryPoint с параметром DLL_PROCESS_DETACH. Оно так должно работать?
-
Ты пример из [81] имеешь ввиду ?
Тогда да, так и должно.
-
> Ты пример из [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;
-
Показывай тело колбэка ..
-
Вот
function CallBack(nCode: Integer; wprm: WParam;
lprm: LParam): LResult;
begin
result := CallNextHookEx(Modulescope.sm_pInstance.HookHandle, nCode, wprm, lprm);
end;
и всё
-
А ты что, инжектируешь в АП "жертвы" свой трэд и уже в контексте этого трэда пытаешься установить хук ?
-
> А ты что, инжектируешь в АП "жертвы" свой трэд и уже в контексте
> этого трэда пытаешься установить хук ?
Не я не изаращенец.... имхо... :)
Вот ставлю хук... ну в DLLEntryPoint на DLL_PROCESS_ATTACH инициализирую прехват.
предвосхищая ворпрос, сразу скажу, что HookHandle лежит в расшареном файле.
-
> HookHandle лежит в расшареном файле
Это неактуально.
Под NT можно передавать 0 в кач-ве перевого параметра CallNextHookEx
-
> Под NT можно передавать 0 в кач-ве перевого параметра CallNextHookEx
Вот жеж.. В рот мне ноги ! :(
Сейчас перепроверял - хук стоит.
Вот только он библиетеку не сразу подгружает а только когда пока пойдут характерные сообщения, как только они прекращаются библиотека выгружается.
Но потом опять загружается и выгружает и т.д. пока не извлеч хук.
Получается что всё работает, но вот тока постоянная автоматическая загрузка\выгрузка вызывает у мну сомнение и подозрение... Доктор, это параноя? А?
-
> он библиетеку не сразу подгружает а только когда пока пойдут
> характерные сообщения
Вот именно для этого ты и вызываешь PostThreadMessage(tid, 0, 0, 0) сразу после вызова ф-ции, устанавливающей хук.
> как только они прекращаются библиотека выгружается.
> Но потом опять загружается и выгружает и т.д. пока не извлеч
> хук
При нормальных условиях хук-модуль будет выгружен из АП "жертвы" не ранее явного или неявного вызова UnhookWindowsHoohEx.
Насколько я понимаю, явно ты UnhookWindowsHoohEx не вызываешь, по кр. мере раньше чем тебе станет нененужным этот модуль в АП "жертвы".
А неявный вызов выполняется самой системой при завершении процесса "жертвы".
Т.о., если эти условия заведомо не выполняются, но хук-модуль с какого-то перепугу исчезает из АП "жертвы", то это уже паранойя)