Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1175599967
nali
2007-04-03 15:32
2007.04.29
Делфи не видит dcu файлы сторонних компонент.


2-1176273215
Sonia
2007-04-11 10:33
2007.04.29
OraStoredProc не видит параметры в RunTime


2-1176374578
Vlad Oshin
2007-04-12 14:42
2007.04.29
MSSQL2000. Возврат значения поля даты - мм.дд.гггг


15-1175782606
IceBeerg
2007-04-05 18:16
2007.04.29
Вопрос по bat никам


1-1172831756
Chelovek
2007-03-02 13:35
2007.04.29
Добавление кнопок на TToolBar.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский