Конференция "WinAPI" » Выгрузка WinApi перехватчика [D7, WinXP]
 
  • KygECHuK © (28.08.08 11:22) [80]

    > Ну вроде того)Только вот события не "посылают", они происходят
    > или возникают.


    Ну вызываем событие...
    Так или иначе СПАСИБО за терпение.
    Надо опробывать ваш совет
  • Leonid Troyanovsky © (28.08.08 13:05) [81]

    > KygECHuK ©   (28.08.08 11:22) [80]

    http://www.podgoretsky.com/ftp/Docs/Delphi/FAQ/ru.delphi.html#N109

    --
    Regards, LVT.
  • KygECHuK © (28.08.08 13:44) [82]

    > Leonid Troyanovsky ©   (28.08.08 13:05) [81]

    Спасибо за пример
  • Сергей М. © (28.08.08 14:16) [83]

    > KygECHuK ©   (28.08.08 13:44) [82]


    Не наступи на грабли)

    В примере - глобальный хук, и хук-модуль будет внедряться во все процессы, обращающиеся к очередям сообщений своих окон
  • Leonid Troyanovsky © (28.08.08 14:29) [84]

    > Сергей М. ©   (28.08.08 14:16) [83]

    > В примере - глобальный хук, и хук-модуль будет внедряться
    > во все процессы,

    Почему во все?
    Хук цепляется на определенный поток.

    --
    Regards, LVT.
  • Сергей М. © (28.08.08 14:48) [85]

    > Leonid Troyanovsky ©   (28.08.08 14:29) [84]


    > Хук цепляется на определенный поток


    Да. если при вызове указан id этого потока.
    А в примере он = 0

    dwThreadId

    Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads.
  • KygECHuK © (28.08.08 14:53) [86]

    > Да. если при вызове указан id этого потока.А в примере он
    > = 0


    "SetWindowsHookEx(WH_GETMESSAGE,  Answer,  Hinstance,  tid)"
    Нет Здесь 0
  • Leonid Troyanovsky © (28.08.08 15:05) [87]

    > Сергей М. ©   (28.08.08 14:48) [85]

    > А в примере он = 0

    GetWindowThreadProcessID(ahwnd,  nil)

    --
    Regards, LVT.
  • Сергей М. © (28.08.08 15:09) [88]

    > Нет Здесь 0


    Здесь он вообще хз чему равен - декларация и иниц-ия этой переменной напрочь отсутствует.

    Тем не менее имей ввиду - для внедрения хук-модуля в конкретный целевой процесс указание потока этого процесса обязательно.
  • Сергей М. © (28.08.08 15:11) [89]

    > Leonid Troyanovsky ©   (28.08.08 15:05) [87]
    >
    >


    Ага, вижу tid параметром.
    А глаз искал переменную)
  • KygECHuK © (01.09.08 14:20) [90]
    Эт снова я...
    Чё то странное - библиотека почти сразу выгружется ?
    Т.е вызывается DLLEntryPoint с параметром DLL_PROCESS_DETACH. Оно так должно работать?
  • Сергей М. © (01.09.08 14:32) [91]
    Ты пример из [81] имеешь ввиду ?
    Тогда да, так и должно.
  • KygECHuK © (01.09.08 14:43) [92]

    > Ты пример из [81] имеешь ввиду ?

    нет, там всё понятно...
    я уже внес изменения в свой код, и вот тут такое...

    вот код:

    function TRemThreadInjector.DoInjectModuleIntoGUI(process: TExeModuleInstance): boolean;
    var
     szLibFile        : TShortCharArr;
     Found            : boolean;
     ModuleInstance   : TModuleInstance;
     i                : Integer;
     Tid              : Cardinal;
    begin
     Result := FALSE;

    if (nil = Process) then
       exit;

    GetModuleFileNameA(
     ModuleFromAddress(@sm_CritSecInjector),
     szLibFile,
     MAX_PATH
     );

    Found := FALSE;
    for i := 0 to Process.GetModuleCount() - 1 do
    begin
     ModuleInstance := Process.GetModuleByIndex(i);
     if (0 = AnsiStrIComp(ModuleInstance.FullName, szLibFile)) then
     begin
      Found := TRUE;
      break;
     end; // if
    end; // for
    if (Found) then
     exit;
     // Получаем идентификатор потока целевого окна
     Tid := GetWindowThreadProcessId(TModuleScope(m_ModeleScope).TargWindow);

     // Устанавливаем ловушку
     TModuleScope(m_ModeleScope).HookHandle := SetWindowsHookEx(WH_GETMESSAGE, @CallBack,  HInstance, TID);

     // Псылаем характерное сообщение
     if  TModuleScope(m_ModeleScope).HookHandle  <>  0  then
       PostThreadMessage(tid,  0,  0,  0);
    end;

  • Сергей М. © (01.09.08 14:49) [93]
    Показывай тело колбэка ..
  • KygECHuK © (01.09.08 14:51) [94]
    Вот



    function CallBack(nCode: Integer; wprm: WParam;
     lprm: LParam): LResult;
    begin
     result := CallNextHookEx(Modulescope.sm_pInstance.HookHandle, nCode, wprm, lprm);
    end;




    и всё
  • Сергей М. © (01.09.08 15:01) [95]
    А ты что, инжектируешь в АП "жертвы" свой трэд и уже в контексте этого трэда пытаешься установить хук ?
  • KygECHuK © (01.09.08 15:13) [96]

    > А ты что, инжектируешь в АП "жертвы" свой трэд и уже в контексте
    > этого трэда пытаешься установить хук ?


    Не я не изаращенец.... имхо... :)

    Вот ставлю хук... ну в DLLEntryPoint на DLL_PROCESS_ATTACH инициализирую прехват.

    предвосхищая ворпрос, сразу скажу, что HookHandle лежит в расшареном файле.
  • Сергей М. © (01.09.08 15:20) [97]

    > HookHandle лежит в расшареном файле


    Это неактуально.
    Под NT можно передавать 0 в кач-ве перевого параметра CallNextHookEx
  • KygECHuK © (01.09.08 15:31) [98]

    > Под NT можно передавать 0 в кач-ве перевого параметра CallNextHookEx


    Вот жеж.. В рот мне ноги ! :(

    Сейчас перепроверял - хук стоит.
    Вот только он библиетеку не сразу подгружает а только когда пока пойдут характерные сообщения, как только они прекращаются библиотека выгружается.
    Но потом опять загружается и выгружает и т.д. пока не извлеч хук.
    Получается что всё работает, но вот тока постоянная автоматическая загрузка\выгрузка вызывает у мну сомнение и подозрение... Доктор, это параноя? А?
  • Сергей М. © (01.09.08 15:43) [99]

    > он библиетеку не сразу подгружает а только когда пока пойдут
    > характерные сообщения


    Вот именно для этого ты и вызываешь PostThreadMessage(tid,  0,  0,  0) сразу после вызова ф-ции, устанавливающей хук.


    > как только они прекращаются библиотека выгружается.
    > Но потом опять загружается и выгружает и т.д. пока не извлеч
    > хук


    При нормальных условиях хук-модуль будет выгружен из АП "жертвы" не ранее явного или неявного вызова UnhookWindowsHoohEx.

    Насколько я понимаю, явно ты UnhookWindowsHoohEx не вызываешь, по кр. мере раньше чем тебе станет нененужным этот модуль в АП "жертвы".
    А неявный вызов выполняется самой системой при завершении процесса "жертвы".

    Т.о., если эти условия заведомо не выполняются, но хук-модуль с какого-то перепугу исчезает из АП "жертвы", то это уже паранойя)
 
Конференция "WinAPI" » Выгрузка WinApi перехватчика [D7, WinXP]
Есть новые Нет новых   [134435   +33][b:0.001][p:0.001]