Конференция "Основная" » Внедрить контрол на чужое окно [D7, WinXP]
 
  • Сергей М. © (25.07.08 16:30) [20]

    > Leonid Troyanovsky ©   (25.07.08 16:23) [19]


    Так ведь хук же !

    Для чужого процесса код хук-модуля, который система влупила в его АП, как ни крути, "родным" не назовешь)

    И потом, контрол следует создавать именно в ходе иниц-ции хук-модуля в АП "жертвы", а не так как делает автор.
  • Leonid Troyanovsky © (25.07.08 16:43) [21]

    > Сергей М. ©   (25.07.08 16:30) [20]

    > Для чужого процесса код хук-модуля, который система влупила
    > в его АП, как ни крути, "родным" не назовешь)

    Будем звать побратимом.

    > И потом, контрол следует создавать именно в ходе иниц-ции
    > хук-модуля в АП "жертвы", а не так как делает автор.

    А хз что есь AddHoc. Конечно, LoadLibrary выглядит подозрительно,
    но, может в этом есть некий сермяжный смысл.

    --
    Regards, LVT.
  • Cobalt (25.07.08 17:13) [22]
    2 Сергей М. ©   (25.07.08 16:08) [16]
    Это код в ДЛЛ-ке.
    ведь иначе в чужой АП хуком не внедриться.

    2 Leonid Troyanovsky ©  
    дело в том, что мне нужна кнопочка на чужой форме

    Итак, кнопочка видна, но отчего-то не реагирует на нажатие :(

    если кому интересно:
    1) Ставлю хук (hook_dll1)
    SetWindowsHookEx(WH_CALLWNDPROC, @SysMsgProc, HInstance, THID);


    2) При первом же срабатывании вызывает внедряльщик:
    function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
    begin
     Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
      if not GlobalData^.Installed
      then begin
           GlobalData^.Installed:=true;
           AddHoc();
           end;
    end;


    3) Внедрение:
    procedure AddHoc();
     begin
        LoadLibrary('hook_dll1.dll');
        Button:=TButton.CreateParented(MainFormWnd);
        Button.Visible:=false;
        Button.Name:='MyPrint';
        Button.Caption:='ПТС и Страховка';
        Button.Left:=375;
        Button.Top:=532;
        Button.Width:= 121;
        Button.Height := 25;
        Button.OnClick:=WordDM.ButtonClick;
        Button.Visible:=True;
     end;

  • Сергей М. © (25.07.08 17:17) [23]

    > LoadLibrary('hook_dll1.dll');


    А это тогда что за зверь ?
    Что за либу с подозрительным названием hook_dll1 ты грузишь в то время как хук-либа уже внедрена ?
  • Cobalt (25.07.08 17:31) [24]
    Прошу прощения, правильный код рутины
    Function AddHoc:integer;
     begin
        LoadLibrary('hook_dll1.dll');
      // та та длл-ка, в которой мой хук сидит.
    гружу я её из хука для того, чтобы после снятия хука длл-ка осталась в АП программы, куда я внедрился и ничего не грохнулось с AV.
        WordDM:=TWordDM.Create(nil); //DataModule, просто чтобы было от кого прицепить обработчик, см. объявление ниже
        MainFormWnd:=FindWindowEx(0,0,'TForm1','Form1');
        Button:=TButton.CreateParented(MainFormWnd);
        Button.Visible:=false;
        //Result:=Integer(Button);
        Button.Name:='MyPrint';
        Button.Caption:='ПТС и страховка';
        Button.Left:=375;
        Button.Top:=532;
        Button.Width:= 121;
        Button.Height := 25;
        Button.OnClick:=WordDM.ButtonClick;
        Button.Visible:=True;
        Result:=Button.Handle;
     end;

    type
     TWordDM = class(TDataModule)
       WordApplication1: TWordApplication;
     public
       procedure ButtonClick(Sender: TObject);
     end;

    procedure TWordDM.ButtonClick(Sender: TObject);
    begin
      MessageBox(0,'+++','',0);
    end;



    Вот теперь кнопка видна, но при нажатии ничего не происходит :(
  • Cobalt (25.07.08 17:34) [25]
    2 Сергей М. ©  
    А внедрена-то либа только на время хука, а после снятия хука будет выгружена (1 раз)
  • Leonid Troyanovsky © (25.07.08 18:02) [26]

    > Cobalt   (25.07.08 17:13) [22]

    > дело в том, что мне нужна кнопочка на чужой форме

    Изволь, пусть будет, мы ж  против.

    Только, обрабатывать надо не какой-то ButtonClick,
    а WM_COMMAND оной кнопы, в хуковой процедуре.

    Да и, во-ще,  дисциплинировать себя надо- никаких TButton,
    CreateWindow* only.

    --
    Regards, LVT.
  • Leonid Troyanovsky © (25.07.08 18:11) [27]

    > Cobalt   (25.07.08 17:34) [25]

    > А внедрена-то либа только на время хука, а после снятия
    > хука будет выгружена (1 раз)

    Не факт, что выгружена, кода не видно.
    Еще одна интерфренция - что будет, если захученный поток
    умрет раньше своего мучителя.

    --
    Regards, LVT.
  • Сергей М. © (25.07.08 19:23) [28]

    > гружу я её из хука для того, чтобы после снятия хука длл-
    > ка осталась в АП программы, куда я внедрился и ничего не
    > грохнулось с AV


    Кулибин)

    Тебе не кнопки в чужие проги тыкать, а за буквари садиться)
  • Cobalt (25.07.08 20:46) [29]
    2 Сергей М. ©
    Вы уж простите, но Рихтера я уже прочитал ;)

    2 Leonid Troyanovsky ©   (25.07.08 18:02) [26]
    спасибо за идею - вспомнил, как диспетчеризуются сообщения в VCL. посмотрю, как бы прикрутить свою Wndproc к Батону.
    Если не получится, тогда конечно, придется ставить другой хук, для перехвата сообщения кнопке.
  • Сергей М. © (25.07.08 21:04) [30]

    > Cobalt   (25.07.08 20:46) [29]


    Что тебя на хуках залинило-то ?
    Непонятно ..
    Мало ли способов заствить жертву родить) ..
  • Cobalt (25.07.08 21:13) [31]
    Это инструмент, удобный для различных задач:
    1-ый хук - для внедрения в АП процесса-жертвы, в нем закрепляем нашу длл-ку при помощи LoadLibrary. После этого хук снимается, т.к. цель - внедриться - выполнена.
    2-й хук (предположительный пока) - для слежения за сообщениями, которые предназначены нашему контролу.

    Как видно, ничего сложного нет :)
  • Сергей М. © (25.07.08 21:51) [32]
    Мне вот еще один "ништяк" интересен  - а как прочие процессы реагируют на твой шприц ?
  • Cobalt (26.07.08 01:43) [33]
    Никак. ибо реагирует одна программа - избранная. На которую я поставил хук.
    Я ведь знаю, что в ней 1 поток.

    Кстати, прога написана тоже в Д7, почему я и думал, что обойдется проще - помню, обсуждали как-то, что, внедрившись в чужое АП Дельфовой программы, написанное в той же версии, можно подхватить там Application через хендл главного окна, и тогда заработает родной обработчик сообщений, все дела...
  • Германн © (26.07.08 02:58) [34]

    > Cobalt   (26.07.08 01:43) [33]
    >
    > Никак. ибо реагирует одна программа - избранная. На которую
    > я поставил хук.
    >

    Эээ. А это как? Хук вроде ставится на некое событие/сообщение Винды. Как можно поставить хук на "одну программу"?
  • Cobalt (26.07.08 09:45) [35]
    HHOOK SetWindowsHookEx(
       int idHook, // type of hook to install
       HOOKPROC lpfn, // address of hook procedure
       HINSTANCE hMod, // handle of application instance
       DWORD dwThreadId  // identity of thread to install hook for
      );

  • Сергей М. © (28.07.08 08:21) [36]

    > внедрившись в чужое АП Дельфовой программы, написанное в
    > той же версии, можно подхватить там Application через хендл
    > главного окна,


    Можно. Но осторожно)
  • Cobalt (28.07.08 13:38) [37]
    Блин, функцию свою назначил через SetWindowLong, вижу, что кнопка обрабатывает своё WM_LBUTTONUP, но она не отрисовывается :(((
    function MyWndProc(HWindow: HWnd; Msg, WParam: Longint;
     LParam: Longint): Longint; stdcall;
    begin
      if (HWindow=Button.Handle) AND (Msg=WM_LBUTTONUP)
      then  begin
             MessageBox(0,'Нажата кнопка','',0);
             Result:=0;
            end
      Else Result:=DefWindowProc(HWindow, Msg, WParam, LParam);
    end;


    Причём, если функцию не назначать, то она отрисовывается.

    Вопрос - как заставить её обрабатывать прочие сообщения?
  • Leonid Troyanovsky © (28.07.08 14:57) [38]

    > Cobalt   (28.07.08 13:38) [37]

    > Блин, функцию свою назначил через SetWindowLong, вижу, что
    > кнопка обрабатывает своё WM_LBUTTONUP

    Субклассировать надо окно парента, и отлавливать там WM_COMMAND
    этой кнопки. Только звать надо не DefWindowProc, а старую WndProc.

    Я ж уже говорил, что и сабклассировать не надо, ведь WM_COMMAND is
    sending, т.е., ее можно поймать в хуке CALLWNDPROC.

    И еще, выкинь нах TButton, CreateWindow* only.

    --
    Regards, LVT.
 
Конференция "Основная" » Внедрить контрол на чужое окно [D7, WinXP]
Есть новые Нет новых   [134492   +14][b:0][p:0.002]