![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Внедрить контрол на чужое окно [D7, WinXP]
Cobalt © (2008-07-25 11:09:00)Ситуация: есть готовая программа (Д7), чужая, разработчик недоступен.
Необходимо её "немножко дополнить".
Программа - одна форма с полями ввода, по этим полям формирует 4 Doc-файла.
Переписывать её совершенно не хочется, поэтому хочу внедриьтся и добавить на форму кнопку "Печатать доп. документы", считав значения в полях ввода (нужно примерно треть от всех полей формы).
Помнится, как-то можно было связать контрол с простым окном через хендл, SetParent или что-то в этом роде.
Кто лучше в теме - подтвердите или пните в нужном направлении.
Leonid Troyanovsky (2008-07-28 14:57:00) [1]
> Cobalt (28.07.08 13:38) [37]
> Блин, функцию свою назначил через SetWindowLong, вижу, что
> кнопка обрабатывает своё WM_LBUTTONUP
Субклассировать надо окно парента, и отлавливать там WM_COMMAND
этой кнопки. Только звать надо не DefWindowProc, а старую WndProc.
Я ж уже говорил, что и сабклассировать не надо, ведь WM_COMMAND is
sending, т.е., ее можно поймать в хуке CALLWNDPROC.
И еще, выкинь нах TButton, CreateWindow* only.
--
Regards, LVT.
Cobalt (2008-07-28 13:38:00) [2]Блин, функцию свою назначил через 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;
Причём, если функцию не назначать, то она отрисовывается.
Вопрос - как заставить её обрабатывать прочие сообщения?
Сергей М. (2008-07-28 08:21:00) [3]
> внедрившись в чужое АП Дельфовой программы, написанное в
> той же версии, можно подхватить там Application через хендл
> главного окна,
Можно. Но осторожно)
Cobalt (2008-07-26 09:45:00) [4]
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
);
Германн (2008-07-26 02:58:00) [5]
> Cobalt (26.07.08 01:43) [33]
>
> Никак. ибо реагирует одна программа - избранная. На которую
> я поставил хук.
>
Эээ. А это как? Хук вроде ставится на некое событие/сообщение Винды. Как можно поставить хук на "одну программу"?
Cobalt (2008-07-26 01:43:00) [6]Никак. ибо реагирует одна программа - избранная. На которую я поставил хук.
Я ведь знаю, что в ней 1 поток.
Кстати, прога написана тоже в Д7, почему я и думал, что обойдется проще - помню, обсуждали как-то, что, внедрившись в чужое АП Дельфовой программы, написанное в той же версии, можно подхватить там Application через хендл главного окна, и тогда заработает родной обработчик сообщений, все дела...
Сергей М. (2008-07-25 21:51:00) [7]Мне вот еще один "ништяк" интересен - а как прочие процессы реагируют на твой шприц ?
Cobalt (2008-07-25 21:13:00) [8]Это инструмент, удобный для различных задач:
1-ый хук - для внедрения в АП процесса-жертвы, в нем закрепляем нашу длл-ку при помощи LoadLibrary. После этого хук снимается, т.к. цель - внедриться - выполнена.
2-й хук (предположительный пока) - для слежения за сообщениями, которые предназначены нашему контролу.
Как видно, ничего сложного нет :)
Сергей М. (2008-07-25 21:04:00) [9]
> Cobalt (25.07.08 20:46) [29]
Что тебя на хуках залинило-то ?
Непонятно ..
Мало ли способов заствить жертву родить) ..
Cobalt (2008-07-25 20:46:00) [10]2 Сергей М. ©
Вы уж простите, но Рихтера я уже прочитал ;)
2 Leonid Troyanovsky © (25.07.08 18:02) [26]
спасибо за идею - вспомнил, как диспетчеризуются сообщения в VCL. посмотрю, как бы прикрутить свою Wndproc к Батону.
Если не получится, тогда конечно, придется ставить другой хук, для перехвата сообщения кнопке.
Сергей М. (2008-07-25 19:23:00) [11]
> гружу я её из хука для того, чтобы после снятия хука длл-
> ка осталась в АП программы, куда я внедрился и ничего не
> грохнулось с AV
Кулибин)
Тебе не кнопки в чужие проги тыкать, а за буквари садиться)
Leonid Troyanovsky (2008-07-25 18:11:00) [12]
> Cobalt (25.07.08 17:34) [25]
> А внедрена-то либа только на время хука, а после снятия
> хука будет выгружена (1 раз)
Не факт, что выгружена, кода не видно.
Еще одна интерфренция - что будет, если захученный поток
умрет раньше своего мучителя.
--
Regards, LVT.
Leonid Troyanovsky (2008-07-25 18:02:00) [13]
> Cobalt (25.07.08 17:13) [22]
> дело в том, что мне нужна кнопочка на чужой форме
Изволь, пусть будет, мы ж против.
Только, обрабатывать надо не какой-то ButtonClick,
а WM_COMMAND оной кнопы, в хуковой процедуре.
Да и, во-ще, дисциплинировать себя надо- никаких TButton,
CreateWindow* only.
--
Regards, LVT.
Cobalt (2008-07-25 17:34:00) [14]2 Сергей М. ©
А внедрена-то либа только на время хука, а после снятия хука будет выгружена (1 раз)
Cobalt (2008-07-25 17:31:00) [15]Прошу прощения, правильный код рутины
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;
Вот теперь кнопка видна, но при нажатии ничего не происходит :(
Сергей М. (2008-07-25 17:17:00) [16]
> LoadLibrary('hook_dll1.dll');
А это тогда что за зверь ?
Что за либу с подозрительным названием hook_dll1 ты грузишь в то время как хук-либа уже внедрена ?
Cobalt (2008-07-25 17:13:00) [17]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;
Leonid Troyanovsky (2008-07-25 16:43:00) [18]
> Сергей М. © (25.07.08 16:30) [20]
> Для чужого процесса код хук-модуля, который система влупила
> в его АП, как ни крути, "родным" не назовешь)
Будем звать побратимом.
> И потом, контрол следует создавать именно в ходе иниц-ции
> хук-модуля в АП "жертвы", а не так как делает автор.
А хз что есь AddHoc. Конечно, LoadLibrary выглядит подозрительно,
но, может в этом есть некий сермяжный смысл.
--
Regards, LVT.
Сергей М. (2008-07-25 16:30:00) [19]
> Leonid Troyanovsky © (25.07.08 16:23) [19]
Так ведь хукже !
Для чужого процесса код хук-модуля, который система влупила в его АП, как ни крути, "родным" не назовешь)
И потом, контрол следует создавать именно в ходе иниц-ции хук-модуля в АП "жертвы", а не так как делает автор.
Leonid Troyanovsky (2008-07-25 16:23:00) [20]
> Сергей М. © (25.07.08 15:52) [13]
>
> Я к тому что "чужое" приложение понятия не имеет, что делать
> с этим неожиданно свалившимся на нее "счастьем" в виде невесть
> откуда взявшихся в ее хозяйстве контролов.
Почему не будет? Дочернее окно будет создано тем же первичным
потоком - примет ака родное. Если хук на CALLWNDPROC -
даже сабклассировать не потребуется.
--
Regards, LVT.