Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› Помогите назначить событие
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 04 августа 2006 21:48
· Личное сообщение · #1

Помогите назначить событие
Есть 2 приложения из первого прил. добавил пункт меню во второе
вот теперь как мне назначить событие для этого пункта (Delphi или
BCB)



Ранг: 29.5 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 05 августа 2006 05:55
· Личное сообщение · #2

Подгрузить к приложению DLL с хуком. Установить этот хук на тред приложения, в котором меню. Для этого есть API SetWindowsHookEx. В обработчике хука ждать сообщения от пункта меню и обрабатывать.



Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 05 августа 2006 09:47
· Личное сообщение · #3

Установить я то установил я не могу перехвать нажатие добавленного пункта меню



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 05 августа 2006 10:24
· Личное сообщение · #4

x-code пишет:
я не могу перехвать нажатие добавленного пункта ме

Ты, наверное, хочешь обрабатывать события из одного приложения, в другом. В принципе это можно, но придется переключать контекст и много-много другого. Ты должен делать обработку в подгруженной DLL.
Но ничто не мешает результаты перехвата передавать из одного приложения в другое по ReadProcessMemory/WriteProcessMemory или на худой конец просто через файл.



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 05 августа 2006 11:00
· Личное сообщение · #5

x-code
Попробуй так:
Если добавил пункт в меню, значит, тебе известен хендл окна, берем, вставляем код в свое приложение:
hOldProc = SetWindowLong, hWindow(здесь хендл окна, в которое добавил пункт в меню.), GWL_WNDPROC, NewProc (это твоя процедура в твоем приложении, которая будет обрабатывать события.)

NewProc hWindow,Msg,wParam,lParam
Msg == WM_COMMAND
wParam == IDmenu (младшее слово)
---Обработчик---
CallWindowProc,hOldProc,hWindow,Msg,wParam,lParam

P. S.
Хуки не используй!

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com





Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 05 августа 2006 14:38
· Личное сообщение · #6

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

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 05 августа 2006 15:45
· Личное сообщение · #7

Rascal
Ну, ты и загнул!
Demon666 пишет:
Если добавил пункт в меню, значит, тебе известен хендл окна

Видишь, что написал это, означает, что прокатит мой вариант. (В моем понимании отдельные виртуальные адресные пространства – это кольцо 0 и кольцо 3)

Вот тема там я пытался с помощью плагина (так чтобы интереснее было, и сорс в первом аттаче прикрепил) выяснить поведение хуков на разных компьютерах с разным установленным софтом (я просто там не стал объяснять истинную причину написания плагина!)
http://exelab.ru/f/action=vthread&forum=3&topic=4708&page= 0
Там применялись два метода привязки к другому процессу ну, и самое главное осталось в привате…

P. S.
Там кстати тоже есть фокусы с меню аналогичные сабжу…

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com





Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 05 августа 2006 16:10 · Поправил: Rascal
· Личное сообщение · #8

Demon666 пишет:
В моем понимании отдельные виртуальные адресные пространства – это кольцо 0 и кольцо 3

Пацталом, ай да насмешил!!!!!!!!!!!!!

А на счёт твоих сорсов - не находишь, что твоя библа распологается в пространстве процесса, куда меню влепил???

на счёт моего предыдущего поста - не в том же приложении, а втом же процессе, в его адр простр

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 05 августа 2006 17:15 · Поправил: Demon666
· Личное сообщение · #9

x-code пишет:
Установить я то установил я не могу перехвать нажатие добавленного пункта меню

Хук должен быть системный и в библиотеке (если между разными процессами) и должна быть секция неинициализированных данных, если таковые используются в программе!
После выполнения этих и многих других условий хук на ~90% будет работать.


Rascal
Если x-code в меню добавил то, что хотел, то с остальным проблем тоже не будет, главное в этом деле голова и послушные руки. (так к слову море инфы в инете по сабжу!?)

Rascal пишет:
А на счёт твоих сорсов - не находишь, что твоя библа распологается в пространстве процесса, куда меню влепил???

Плагин грузится грубо и вкратцце, вот этой функцией CreateThread (и что тут можно обсуждать???)

Rascal пишет:
Пацталом, ай да насмешил!!!!!!!!!!!!!

Дык, старался!!!! (просто намек сделал, если обе программы работают в кольце 3 то … )

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 17.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 05 августа 2006 18:18
· Личное сообщение · #10

ВСВ/Delphi на май взгляд для таких выкрутасов не крут ибо VCL, тут надо на winAPI пиасть.
а если так уж хочется обрабатывать событие во внешнем приложении - просто заставить dll отсылать ему SendMessage'ом соответствующий мессадж, если нужно данные передать - отсылать юзерское сообщение и в параметрах передавать.




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 05 августа 2006 20:29
· Личное сообщение · #11

Demon666 пишет:
Хук должен быть системный и в библиотеке

Бред. Чтобы сделать хук библой отнюдь не должен быть системный хук. Кому как интересно загружать библу в чужой процесс, тот так и делает. Через хэндл окна и CreateRemoteProcess можно элементарно сделать и без SetWindowsHook

Demon666 пишет:
Плагин грузится грубо и вкратцце, вот этой функцией CreateThread (и что тут можно обсуждать???)

Я о том, что библа чтобы перехватывать события определённого процесса должна быть в этом процессе. Ты советуешь : ЭЕсли добавил пункт в меню, значит, тебе известен хендл окна, берем, вставляем код в свое приложение" Такое работать не будет, вот о чём я

Demon666 пишет:
(просто намек сделал, если обе программы работают в кольце 3 то … )

Не понял.

f0ma
На счёт передачи параметров вариантов много - файл с CreateMutex рулит имхо. Ну а без апи тут янсн перец никак. Главное библу в чужой процесс загрузить (или в память процесса процедуру и ей CreateRemotreThread), перезадать функцию окна и работать любым привычным или удобным способом

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 05 августа 2006 21:17
· Личное сообщение · #12

Demon666

NewProc hWindow,Msg,wParam,lParam
Msg == WM_COMMAND
wParam == IDmenu (младшее слово)
---Обработчик---
CallWindowProc,hOldProc,hWindow,Msg,wParam,lParam

этот вариант один из первых у меня был он не катит только для
текущего приложения

кто-нибудь поподробней может что-нибудь по советовать
или дать какую нибудь ссылку




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 05 августа 2006 22:08
· Личное сообщение · #13

x-code пишет:
этот вариант один из первых у меня был он не катит только для
текущего приложения

Этот вариант катит для текущего процесса, видимо хотел написать. Уже объяснили не раз - нужнно это написать в длл, а не в программе своей, и потом загрузить библу в чужой процесс. Тогда всё заработает.

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 06 августа 2006 00:09
· Личное сообщение · #14

Demon666 пишет:
Хук должен быть системный и в библиотеке (если между разными процессами) и должна быть секция неинициализированных данных, если таковые используются в программе!

Rascal пишет:
Бред. Чтобы сделать хук библой отнюдь не должен быть системный хук.

Rascal
На счет хуков спорить не буду пусть rmn или Quantum выскажут свое мнение по этому поводу? (интересно послушать!)

Rascal пишет:
Уже объяснили не раз - нужнно это написать в длл, а не в программе своей, и потом загрузить библу в чужой процесс. Тогда всё заработает.

из MSDN:
The CreateRemoteThread function creates a thread that runs in the virtual address space of another process.
Вопрос: нужно ли в этом случае создавать *.dll?

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com





Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 06 августа 2006 01:15
· Личное сообщение · #15

Demon666 пишет:
Вопрос: нужно ли в этом случае создавать *.dll?

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

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 06 августа 2006 02:36
· Личное сообщение · #16

Rascal
Короче вариантов данную задачу реализовать море из постов этой темы видно и приводить примеры реализации можно до бесконечности…
Взять, к примеру, даже такой вариант в секцию кода, где находятся нули дописать свой код и сделать джамп из процедуры обработки сообщений от меню на этот код? (можно даже глубже капнуть.)
ЗЫ: опять мы к секциям возвращаемся ;)

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com





Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 06 августа 2006 03:09
· Личное сообщение · #17

x-code
Регистрируй глобальный Event через CreateEvent и играйся с его состоянием
а в программе-обработчике юзай в потоке WaitForSingleObject

-----
DREAMS CALL US




Ранг: 29.5 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 06 августа 2006 04:22
· Личное сообщение · #18

Demon666
Обычный хук (не системный) вполне сойдёт. Никакие API перехватывать, код инжектировать в адресное пространство целевого приложения, добавлять секции и т.д. не нужно. Достаточно заюзать SetWindowsHookEx и обработчик всунуть в dll.

=TS=
Кажется, топикстартер имел в виду не event'ы.



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 06 августа 2006 10:02 · Поправил: Demon666
· Личное сообщение · #19

Quantum
Если dll подгрузить, то да прокатят и эти два варианта, я говорю о другом (да и Rascal тоже), если не подгружать dll в адресное пространство программы, то тогда нужен системный хук? (я думаю что в этом случае его и надо применить!?)

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 06 августа 2006 17:25
· Личное сообщение · #20

library Hooklib;

uses
windows, messages;

var
Hk : HHOOK;
OldWindowProc: Pointer;

function NewWindowProc(WndHandle: hWnd; Msg, wParam, lParam: LongInt): LongInt; stdcall;
begin
if Msg = WM_COMMAND then
begin
if wParam = 3 then
begin
MessageBox(0,'URA','R',mb_iconhand)
end;
end;
NewWindowProc := CallWindowProc(OldWindowProc, WndHandle, Msg, wParam, lParam);

end;


function Hook(cd, wParam, lParam : integer): Lresult; stdcall;
var
hw : hwnd;
begin
if cd >= 0 then
begin
case wParam of
WM_LBUTTONUP:
begin
hw := HWND(FindWindow('TForm1', nil));
OldWindowProc := Pointer(SetWindowLong(hw, GWL_WNDPROC, LongInt(@NewWindowProc)));
end;

WM_MBUTTONUP:
begin
hw:=GetForegroundWindow;
SetWindowText(hw,'Hello');
end;
end;
end
else
begin
result := CallNextHookEx(Hk, cd, wParam, lParam);
exit;
end;
result := CallNextHookEx(Hk, cd, wParam, lParam);
end;

procedure SetHook;
begin
if SetWindowsHookEx(WH_MOUSE, @Hook, hInstance, 0) = 0 then
MessageBox(0,'???','ERR',mb_iconhand);
end;

procedure RemoveHook;
begin
UnhookWindowsHookEx(Hk);
end;

exports
SetHook name 'SetHook',
RemoveHook name 'RemoveHook';
end.

Хук библ. вроде правильно написал, а вот подгрузить в чужой процесс не получается
может кто-нибудь покажет не большой примерчик please...




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 06 августа 2006 17:55
· Личное сообщение · #21

x-code пишет:
может кто-нибудь покажет не большой примерчик

...а может быть кто-нибудь впредь будет сперва пользоваться поиском...??
Вот один вариант http://www.rsdn.ru/?article/baseserv/IntercetionAPI.xml

x-code пишет:
Хук библ. вроде правильно написал

...что-то код больно знакомый -- не Фленов ли автор??

-----
the Power of Reversing team




Ранг: 41.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 06 августа 2006 18:49 · Поправил: x-code
· Личное сообщение · #22

Честно говоря даже не знаю исходник был без автора,
и я его не много переделал

Я гуглом пользовался, но он мне толком ни чего не дал



Ранг: 29.5 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 06 августа 2006 19:42
· Личное сообщение · #23

Demon666 пишет:
если не подгружать dll в адресное пространство программы, то тогда нужен системный хук? (я думаю что в этом случае его и надо применить!?)

Тогда будет тормозить вся система.




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 06 августа 2006 23:05
· Личное сообщение · #24

Demon666
Мне одно непонятно. Как ты собираешься хучить без библы??? Даже системный хук требует библы...

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 07 августа 2006 01:00
· Личное сообщение · #25

Demon666 пишет:
P. S.
Хуки не используй!

Quantum пишет:
Тогда будет тормозить вся система.

Quantum
Во-во от этой точки зрениями отталкивался, советуя не применять хуки с уклоном на то, что в данной теме локальный хук не подойдет без...
И попутно предложил альтернативный вариант.

Demon666 пишет:
Взять, к примеру, даже такой вариант в секцию кода, где находятся нули дописать свой код и сделать джамп из процедуры обработки сообщений от меню на этот код? (можно даже глубже капнуть.)
ЗЫ: опять мы к секциям возвращаемся ;)

Rascal
Тебе вопрос и задавал (ты, наверное, не заметил)???
Ну, еще добавлю, как я для начала сделал бы, если мне нужно было такое реализовать:
Я взял бы прогу kerberos (здесь на сайте можно скачать) и проанализировал код (так поверхностно видно то, что надо), если все OK, выдернул уже готовый и отлаженный код и пользуй на здоровье чем туторы читать, если не находим то, что нам нужно следующую берем и т. д.
Если вообще нет вариантов, значит, ищем другой способ реализации данной задачи. ;)

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com





Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 07 августа 2006 01:38
· Личное сообщение · #26

Demon666 пишет:
если все OK, выдернул уже готовый и отлаженный код и пользуй на здоровье чем туторы читать, если не находим то, что нам нужно следующую берем и т. д.
Если вообще нет вариантов, значит, ищем другой способ реализации данной задачи. ;)

Плохому учишь Сначала пусть ручками сделает, поймёт, а потом автоматизирует процесс. Хотя мне даже не понятно нах керберос Я вообщ не знаю что он делает, кроме как переххватывает данные апи, типа вход и выход. Здесь рудят ручки. А без библы никак в любом случае, только если байткод не запишешь туда.

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 07 августа 2006 02:53
· Личное сообщение · #27

Rascal
Вот ты любишь неизведанные тайны познать!
Давай пример (как в прошлый раз типа ссылки на wasm) тогда и будем доказывать или опровергать? (от чего такая уверенность, что нужна библа?)

Rascal пишет:
Плохому учишь

Почему плохому? Разве лазить в чужом коде для “самопознания” это плохо?

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com





Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 07 августа 2006 14:47
· Личное сообщение · #28

Demon666 пишет:
Почему плохому? Разве лазить в чужом коде для “самопознания” это плохо?

А чужой программой вытащить код разве чему-то нвучит, кроме как тулзой пользоваться?

Demon666 пишет:
Давай пример (как в прошлый раз типа ссылки на wasm) тогда и будем доказывать или опровергать? (от чего такая уверенность, что нужна библа?)

Как ты представляешь себе загрузить код в чужой процесс? Расскажи, а я послушаю... Мож так дочухает до тя о чём я

-----
Недостаточно только получить знания:надо найти им приложение





Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 07 августа 2006 22:13
· Личное сообщение · #29

Rascal пишет:
Как ты представляешь себе загрузить код в чужой процесс

WriteProcessMemory
CreateRemoteThread

-----
DREAMS CALL US





Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 07 августа 2006 22:51
· Личное сообщение · #30

=TS=
Этот способ я упомянал, он не в счёт. Человек хочет как-то без библы и удалённого потока. WriteProcessMemory & SetThreadContext тоже не прдлагать,ибо один Х

-----
Недостаточно только получить знания:надо найти им приложение



. 1 . 2 . >>
 eXeL@B —› Программирование —› Помогите назначить событие
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати