![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Корректная по времени уснановка Hook'а.
Riply © (2007-04-09 10:33:00)Здравствуйте !
Неожиданно(а может и закономерно) столкнулась со следующим фактом:
Пробуем создать процесс и тут же установить на него персональный Hook (WH_SHELL).
type
TSetLibHook = function(const HookType, ThreadId: DWord): DWord; stdcall;
function ExecuteAndSetHook(const ExeName, LibName, FunctName: string; HookID: DWord): Boolean;
var
hLib: THandle;
LastErr: integer;
SetLibHook: TSetLibHook;
Proc_Info: PROCESS_INFORMATION;
begin
Result := False;
hLib := LoadLibrary(PChar(LibName));
if hLib <> 0 then
try
@SetLibHook := GetProcAddress(hLib, PChar(FunctName));
if Assigned(@SetLibHook) then
begin
FillChar(Proc_Info, SizeOf(PROCESS_INFORMATION), 0);
if Process_Create(SpyExeName, '', ExtractFileDir(ExeName), SW_SHOWDEFAULT, Proc_Info) then
try
// Sleep(1000);
LastErr := SetLibHook(HookID, Proc_Info.dwThreadId);
Log_WriteError('SetLibHook', LastErr);
Result := LastErr = ERROR_SUCCESS;
finally
ProcessInfo_CloseHandles(@Proc_Info);
end;
end;
finally
FreeLibrary(hLib);
end;
end;
SetLibHook в Dll'ке:
function Hook_SetThread(const HookType, ThreadId: DWord): DWord; export; stdcall;
begin
pHookData^.Hook := SetWindowsHookEx(HookType, @ShellHookProc, hInstance, ThreadId);
if pHookData^.Hook <> 0 then Result := ERROR_SUCCESS else Result := GetLastError;
end;
Проблемма в следующем:
Если убрать комментарии у Sleep(1000), то все работает, а если оставить,
то получим ошибку: "The parameter is incorrect".
Мне инересно: это у меня напартачено, или так и должно быть ?
Если так и должно быть, то как подождать возможности безопасно поставить Hook и почему это происходит ?
Германн (2007-04-10 02:39:00) [1]
> Riply © (10.04.07 02:20) [20]
>
> > [19] Германн © (10.04.07 01:41)
> Полуночникам привет!
> К хукам меня привели следующие соображения:
> Для перехвата DrawText, все равно, надо внедряться.
> Почему бы не хуком (вместо RemoteThread),
> заодно, без лишнего кода, отлавливая создание\активацию
> формы ?
> Но практика показала, что мне эти события не нужны.
> И не "тыка", а "научного тыка" :)
>
Привет работникам "научного тыка"!
Riply (2007-04-10 02:20:00) [2]> [19] Германн © (10.04.07 01:41)
Полуночникам привет!
К хукам меня привели следующие соображения:
Для перехвата DrawText, все равно, надо внедряться.
Почему бы не хуком (вместо RemoteThread),
заодно, без лишнего кода, отлавливая создание\активацию формы ?
Но практика показала, что мне эти события не нужны.
И не "тыка", а "научного тыка" :)
Германн (2007-04-10 01:41:00) [3]
> Riply © (10.04.07 01:07) [18]
Не, ну я, конечно, понимаю, что метод "тыка" имеет право на существование. Но нельзя же так часто им пользоваться! :)
Riply (2007-04-10 01:07:00) [4]> [17] Сергей М. © (09.04.07 14:24)
>А что, активация окна - это единственное, что тебя интересует
>и ради чего собссно затеяна вся эта свистопляска с хуками ?
Да нет. Мне они (хуки) сейчас не нужны. Хватает "события вызова DrawTextA" :)
Просто, сначала предпалагала их использовать и натолкнулась на сабжевую проблемму.
Вот и решила узнать "а в чем тут дело" :)
Сергей М. (2007-04-09 14:24:00) [5]
> Riply © (09.04.07 13:48) [16]
> А что, Hook'и так прожорливы ?
А что, активация окна - это единственное, что тебя интересует и ради чего собссно затеяна вся эта свистопляска с хуками ?
Riply (2007-04-09 13:48:00) [6]> [15] Сергей М. © (09.04.07 12:39)
>Настоящие "жадины" для шпионажа не используют механизм оконных хуков вообще)
Ну я же еще только учусь на "Настоящую Жадину" :)
P.S. А что, Hook'и так прожорливы ?
Сергей М. (2007-04-09 12:39:00) [7]
> Riply © (09.04.07 12:20) [14]
Настоящие "жадины" для шпионажа не используют механизм оконных хуков вообще)
Riply (2007-04-09 12:20:00) [8]> [13] Сергей М. © (09.04.07 11:47)
>Ну так ты просто укажи idThread = 0 - и всех делов)
Я уже как-то говорила: в плане ресурсов, я самая жадная на свете :)
Какого черта я буду грузиться во все подряд, когда мне нужено добраться всего
до одного маленького процессика :)
Сергей М. (2007-04-09 11:47:00) [9]
> Чесино говоря, я и старалась не пропустить момент активизации
> окна
Ну так ты просто укажи idThread = 0 - и всех делов)
Leonid Troyanovsky (2007-04-09 11:44:00) [10]
> Сергей М. © (09.04.07 11:37) [10]
> А никто и не говорил, что его нить перестает ему принадлежать.
Да это я путаницу внес, невнимательно читал.
Sorry.
--
Regards, LVT.
Riply (2007-04-09 11:42:00) [11]> [10] Сергей М. © (09.04.07 11:37)
>Просто (см. [5]) на момент вызова тобой SetWindowsHookEx указанная
>тобой его нить еще не успела создать ни одного окна.
Чесино говоря, я и старалась не пропустить момент активизации окна :)
Сергей М. (2007-04-09 11:37:00) [12]
> Почему его нить, в этом случае, принадлежит нам, ведь это
> его нить
А никто и не говорил, что его нить перестает ему принадлежать.
Просто (см. [5]) на момент вызова тобой SetWindowsHookEx указанная тобой его нить еще не успела создать ни одного окна.
Riply (2007-04-09 11:36:00) [13]> [8] Leonid Troyanovsky © (09.04.07 11:33)
>Для хука нужно, чтобы целевой процесс,
>по крайней мере, загрузил user32.dll.
Хорошо, когда все становиться на свои места :)
Leonid Troyanovsky (2007-04-09 11:33:00) [14]
> Riply © (09.04.07 11:29) [7]
> А почему так происходит ?
Для хука нужно, чтобы целевой процесс,
по крайней мере, загрузил user32.dll.
--
Regards, LVT.
Riply (2007-04-09 11:29:00) [15]> [5] Leonid Troyanovsky © (09.04.07 11:23)
>Вместо Sleep используй WaitForInputIdle
Спасибо :)
А почему так происходит ?
Riply (2007-04-09 11:27:00) [16]> [3] Leonid Troyanovsky © (09.04.07 11:20)
> [4] Сергей М. © (09.04.07 11:20)
И все же у меня не укладывается в голове. Ну и что, что мы создаем процесс.
Почему его нить, в этом случае, принадлежит нам, ведь это егонить.
Разве у нашего процесса при этом увеличивается кол-во нитей ?
Leonid Troyanovsky (2007-04-09 11:23:00) [17]
> Leonid Troyanovsky © (09.04.07 11:20) [3]
> Для установки хука на собственный поток библиотека не нужна.
Sorry, не дочитал до конца.
Вместо Sleep используй WaitForInputIdle
--
Regards, LVT.
Сергей М. (2007-04-09 11:20:00) [18]
> Riply © (09.04.07 11:15) [2]
При установке глоб.хука у тебя нет выбора - hMod ты обязанауказать, но при этом idThread должен быть равен нулю.
Leonid Troyanovsky (2007-04-09 11:20:00) [19]
> Riply © (09.04.07 10:33)
> Пробуем создать процесс и тут же установить на него персональный
> Hook (WH_SHELL).
Для установки хука на собственный поток библиотека не нужна.
--
Regards, LVT.
Riply (2007-04-09 11:15:00) [20]> [1] Сергей М. © (09.04.07 10:47)
Если вместо hInstance ставлю 0,
то ошибка меняется на такую:
"Cannot set nonlocal hook without a module handle"
ну и логично, ведь у нас не " andif the hook procedure is within the
code associated with the current process"
если я правильно перевожу :(