-
> Leonid Troyanovsky © (25.07.08 16:23) [19]
Так ведь хук же !
Для чужого процесса код хук-модуля, который система влупила в его АП, как ни крути, "родным" не назовешь)
И потом, контрол следует создавать именно в ходе иниц-ции хук-модуля в АП "жертвы", а не так как делает автор.
-
> Сергей М. © (25.07.08 16:30) [20]
> Для чужого процесса код хук-модуля, который система влупила > в его АП, как ни крути, "родным" не назовешь)
Будем звать побратимом.
> И потом, контрол следует создавать именно в ходе иниц-ции > хук-модуля в АП "жертвы", а не так как делает автор.
А хз что есь AddHoc. Конечно, LoadLibrary выглядит подозрительно, но, может в этом есть некий сермяжный смысл.
-- Regards, LVT.
-
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;
-
> LoadLibrary('hook_dll1.dll');
А это тогда что за зверь ? Что за либу с подозрительным названием hook_dll1 ты грузишь в то время как хук-либа уже внедрена ?
-
Прошу прощения, правильный код рутины Function AddHoc:integer;
begin
LoadLibrary('hook_dll1.dll');
гружу я её из хука для того, чтобы после снятия хука длл-ка осталась в АП программы, куда я внедрился и ничего не грохнулось с AV.
WordDM:=TWordDM.Create(nil); MainFormWnd:=FindWindowEx(0,0,'TForm1','Form1');
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;
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; Вот теперь кнопка видна, но при нажатии ничего не происходит :(
-
2 Сергей М. © А внедрена-то либа только на время хука, а после снятия хука будет выгружена (1 раз)
-
> Cobalt (25.07.08 17:13) [22]
> дело в том, что мне нужна кнопочка на чужой форме
Изволь, пусть будет, мы ж против.
Только, обрабатывать надо не какой-то ButtonClick, а WM_COMMAND оной кнопы, в хуковой процедуре.
Да и, во-ще, дисциплинировать себя надо- никаких TButton, CreateWindow* only.
-- Regards, LVT.
-
> Cobalt (25.07.08 17:34) [25]
> А внедрена-то либа только на время хука, а после снятия > хука будет выгружена (1 раз)
Не факт, что выгружена, кода не видно. Еще одна интерфренция - что будет, если захученный поток умрет раньше своего мучителя.
-- Regards, LVT.
-
> гружу я её из хука для того, чтобы после снятия хука длл- > ка осталась в АП программы, куда я внедрился и ничего не > грохнулось с AV
Кулибин)
Тебе не кнопки в чужие проги тыкать, а за буквари садиться)
-
2 Сергей М. © Вы уж простите, но Рихтера я уже прочитал ;)
2 Leonid Troyanovsky © (25.07.08 18:02) [26] спасибо за идею - вспомнил, как диспетчеризуются сообщения в VCL. посмотрю, как бы прикрутить свою Wndproc к Батону. Если не получится, тогда конечно, придется ставить другой хук, для перехвата сообщения кнопке.
-
> Cobalt (25.07.08 20:46) [29]
Что тебя на хуках залинило-то ? Непонятно .. Мало ли способов заствить жертву родить) ..
-
Это инструмент, удобный для различных задач: 1-ый хук - для внедрения в АП процесса-жертвы, в нем закрепляем нашу длл-ку при помощи LoadLibrary. После этого хук снимается, т.к. цель - внедриться - выполнена. 2-й хук (предположительный пока) - для слежения за сообщениями, которые предназначены нашему контролу.
Как видно, ничего сложного нет :)
-
Мне вот еще один "ништяк" интересен - а как прочие процессы реагируют на твой шприц ?
-
Никак. ибо реагирует одна программа - избранная. На которую я поставил хук. Я ведь знаю, что в ней 1 поток.
Кстати, прога написана тоже в Д7, почему я и думал, что обойдется проще - помню, обсуждали как-то, что, внедрившись в чужое АП Дельфовой программы, написанное в той же версии, можно подхватить там Application через хендл главного окна, и тогда заработает родной обработчик сообщений, все дела...
-
> Cobalt (26.07.08 01:43) [33] > > Никак. ибо реагирует одна программа - избранная. На которую > я поставил хук. >
Эээ. А это как? Хук вроде ставится на некое событие/сообщение Винды. Как можно поставить хук на "одну программу"?
-
HHOOK SetWindowsHookEx(
int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId );
-
> внедрившись в чужое АП Дельфовой программы, написанное в > той же версии, можно подхватить там Application через хендл > главного окна,
Можно. Но осторожно)
-
Блин, функцию свою назначил через 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;
Причём, если функцию не назначать, то она отрисовывается. Вопрос - как заставить её обрабатывать прочие сообщения?
-
> Cobalt (28.07.08 13:38) [37] > Блин, функцию свою назначил через SetWindowLong, вижу, что > кнопка обрабатывает своё WM_LBUTTONUP
Субклассировать надо окно парента, и отлавливать там WM_COMMAND этой кнопки. Только звать надо не DefWindowProc, а старую WndProc.
Я ж уже говорил, что и сабклассировать не надо, ведь WM_COMMAND is sending, т.е., ее можно поймать в хуке CALLWNDPROC.
И еще, выкинь нах TButton, CreateWindow* only.
-- Regards, LVT.
|