Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.29;
Скачать: CL | DM;

Вниз

Корректная по времени уснановка 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.042 c
2-1175802409
jimmo
2007-04-05 23:46
2007.04.29
Структура базы данных для учета аппаратуры в ремонте


2-1176032757
delphi_
2007-04-08 15:45
2007.04.29
туплю с INI


2-1176353386
Novice
2007-04-12 08:49
2007.04.29
Доступ к файловой системе


1-1169888874
Serg1981
2007-01-27 12:07
2007.04.29
Delphi 7 и Office 2003


2-1176126598
vitv
2007-04-09 17:49
2007.04.29
Многострочный DBGrid, поиск информации