Главная страница
    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.054 c
4-1165212307
Krab12345
2006-12-04 09:05
2007.04.29
Продолжение темы "Сокет"


15-1175416768
Kerk
2007-04-01 12:39
2007.04.29
Захват автозаправки


2-1176401844
ppcumax
2007-04-12 22:17
2007.04.29
Как получить HTML код страницы с помощью ClientSocket?


3-1170937364
r2d2
2007-02-08 15:22
2007.04.29
mySQL не отображается кодировка


15-1175435176
isasa
2007-04-01 17:46
2007.04.29
Многопоточная задача канадских лесорубов.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский