Форум: "Начинающим";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];
ВнизКорректная по времени уснановка Hook а. Найти похожие ветки
← →
Riply © (2007-04-09 10:33) [0]Здравствуйте !
Неожиданно(а может и закономерно) столкнулась со следующим фактом:
Пробуем создать процесс и тут же установить на него персональный 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-09 10:47) [1]hMod
Identifies the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.
← →
Riply © (2007-04-09 11:15) [2]> [1] Сергей М. © (09.04.07 10:47)
Если вместо hInstance ставлю 0,
то ошибка меняется на такую:
"Cannot set nonlocal hook without a module handle"
ну и логично, ведь у нас не "and if the hook procedure is within the
code associated with the current process"
если я правильно перевожу :(
← →
Leonid Troyanovsky © (2007-04-09 11:20) [3]
> Riply © (09.04.07 10:33)
> Пробуем создать процесс и тут же установить на него персональный
> Hook (WH_SHELL).
Для установки хука на собственный поток библиотека не нужна.
--
Regards, LVT.
← →
Сергей М. © (2007-04-09 11:20) [4]
> Riply © (09.04.07 11:15) [2]
При установке глоб.хука у тебя нет выбора - hMod ты обязана указать, но при этом idThread должен быть равен нулю.
← →
Leonid Troyanovsky © (2007-04-09 11:23) [5]
> Leonid Troyanovsky © (09.04.07 11:20) [3]
> Для установки хука на собственный поток библиотека не нужна.
Sorry, не дочитал до конца.
Вместо Sleep используй WaitForInputIdle
--
Regards, LVT.
← →
Riply © (2007-04-09 11:27) [6]> [3] Leonid Troyanovsky © (09.04.07 11:20)
> [4] Сергей М. © (09.04.07 11:20)
И все же у меня не укладывается в голове. Ну и что, что мы создаем процесс.
Почему его нить, в этом случае, принадлежит нам, ведь это его нить.
Разве у нашего процесса при этом увеличивается кол-во нитей ?
← →
Riply © (2007-04-09 11:29) [7]> [5] Leonid Troyanovsky © (09.04.07 11:23)
>Вместо Sleep используй WaitForInputIdle
Спасибо :)
А почему так происходит ?
← →
Leonid Troyanovsky © (2007-04-09 11:33) [8]
> Riply © (09.04.07 11:29) [7]
> А почему так происходит ?
Для хука нужно, чтобы целевой процесс,
по крайней мере, загрузил user32.dll.
--
Regards, LVT.
← →
Riply © (2007-04-09 11:36) [9]> [8] Leonid Troyanovsky © (09.04.07 11:33)
>Для хука нужно, чтобы целевой процесс,
>по крайней мере, загрузил user32.dll.
Хорошо, когда все становиться на свои места :)
← →
Сергей М. © (2007-04-09 11:37) [10]
> Почему его нить, в этом случае, принадлежит нам, ведь это
> его нить
А никто и не говорил, что его нить перестает ему принадлежать.
Просто (см. [5]) на момент вызова тобой SetWindowsHookEx указанная тобой его нить еще не успела создать ни одного окна.
← →
Riply © (2007-04-09 11:42) [11]> [10] Сергей М. © (09.04.07 11:37)
>Просто (см. [5]) на момент вызова тобой SetWindowsHookEx указанная
>тобой его нить еще не успела создать ни одного окна.
Чесино говоря, я и старалась не пропустить момент активизации окна :)
← →
Leonid Troyanovsky © (2007-04-09 11:44) [12]
> Сергей М. © (09.04.07 11:37) [10]
> А никто и не говорил, что его нить перестает ему принадлежать.
Да это я путаницу внес, невнимательно читал.
Sorry.
--
Regards, LVT.
← →
Сергей М. © (2007-04-09 11:47) [13]
> Чесино говоря, я и старалась не пропустить момент активизации
> окна
Ну так ты просто укажи idThread = 0 - и всех делов)
← →
Riply © (2007-04-09 12:20) [14]> [13] Сергей М. © (09.04.07 11:47)
>Ну так ты просто укажи idThread = 0 - и всех делов)
Я уже как-то говорила: в плане ресурсов, я самая жадная на свете :)
Какого черта я буду грузиться во все подряд, когда мне нужено добраться всего
до одного маленького процессика :)
← →
Сергей М. © (2007-04-09 12:39) [15]
> Riply © (09.04.07 12:20) [14]
Настоящие "жадины" для шпионажа не используют механизм оконных хуков вообще)
← →
Riply © (2007-04-09 13:48) [16]> [15] Сергей М. © (09.04.07 12:39)
>Настоящие "жадины" для шпионажа не используют механизм оконных хуков вообще)
Ну я же еще только учусь на "Настоящую Жадину" :)
P.S. А что, Hook"и так прожорливы ?
← →
Сергей М. © (2007-04-09 14:24) [17]
> Riply © (09.04.07 13:48) [16]
> А что, Hook"и так прожорливы ?
А что, активация окна - это единственное, что тебя интересует и ради чего собссно затеяна вся эта свистопляска с хуками ?
← →
Riply © (2007-04-10 01:07) [18]> [17] Сергей М. © (09.04.07 14:24)
>А что, активация окна - это единственное, что тебя интересует
>и ради чего собссно затеяна вся эта свистопляска с хуками ?
Да нет. Мне они (хуки) сейчас не нужны. Хватает "события вызова DrawTextA" :)
Просто, сначала предпалагала их использовать и натолкнулась на сабжевую проблемму.
Вот и решила узнать "а в чем тут дело" :)
← →
Германн © (2007-04-10 01:41) [19]
> Riply © (10.04.07 01:07) [18]
Не, ну я, конечно, понимаю, что метод "тыка" имеет право на существование. Но нельзя же так часто им пользоваться! :)
← →
Riply © (2007-04-10 02:20) [20]> [19] Германн © (10.04.07 01:41)
Полуночникам привет!
К хукам меня привели следующие соображения:
Для перехвата DrawText, все равно, надо внедряться.
Почему бы не хуком (вместо RemoteThread),
заодно, без лишнего кода, отлавливая создание\активацию формы ?
Но практика показала, что мне эти события не нужны.
И не "тыка", а "научного тыка" :)
← →
Германн © (2007-04-10 02:39) [21]
> Riply © (10.04.07 02:20) [20]
>
> > [19] Германн © (10.04.07 01:41)
> Полуночникам привет!
> К хукам меня привели следующие соображения:
> Для перехвата DrawText, все равно, надо внедряться.
> Почему бы не хуком (вместо RemoteThread),
> заодно, без лишнего кода, отлавливая создание\активацию
> формы ?
> Но практика показала, что мне эти события не нужны.
> И не "тыка", а "научного тыка" :)
>
Привет работникам "научного тыка"!
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.043 c