Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перехват обработчиков событий, методов и т.д.


juiceman ©   (2004-07-03 00:16:00) 

С перехватом апи-функций все вы наверное давно знакомы. А как к быть например с перехватом обработчика событие в компоненте ? Это функция и адрес ее где-то хранится. Вопрос только в том как его узнать?


_?!_   (2004-07-06 10:15:00) [1]

Ну допустим, published мемберов еще можно найти. А события очень часто делают published. Так что если есть указатель на объект (ха), то есть все шансы на успех.


Cobalt   (2004-07-06 00:04:00) [2]

>Игорь Шевченко ©   (05.07.04 18:38) [11]
>SetProcessorInstructionHookEx
:lol:


Polevi   (2004-07-05 18:49:00) [3]

> [11] Игорь Шевченко ©   (05.07.04 18:38)
?


Игорь Шевченко   (2004-07-05 18:38:00) [4]

Polevi ©   (05.07.04 10:37)


> ему надо команды перехода процесосра перехватывать


SetProcessorInstructionHookEx


Polevi   (2004-07-05 10:37:00) [5]

точно, ступил, ему надо команды перехода процесосра перехватывать :)


Digitman   (2004-07-05 09:56:00) [6]


> Polevi ©   (05.07.04 09:38) [8]
> из стека он хочет


не знаю, что он там расчитывает в стеке увидеть в момент когда CALL еще не выполнен


Polevi   (2004-07-05 09:38:00) [7]

из стека он хочет


Digitman   (2004-07-05 09:19:00) [8]


> возьму адрес метода оттуда, откуда на него будет сделан
> переход а не заниматься поиском адреса в памяти где хранится
> поле


откуда "оттуда" ?!

"оттуда" - это, как правило, и есть то самое поле

TMyClass = class(..)
..
FMyEvent: TNotifyEvent;
..
end;

procedure TMyClass.DoEvent;
begin
..
FMyEvent(Self);
end;

вот во что превращает компилятор конструкцию вызова обработчика ( FMyEvent(Self)) :

//в ebx - ссылка на тек.объект, возбуждающий событие

mov edx, ebx //параметр Self
mov eax, [ebx + offset(FMyEvent) + offset(TMethod.Data)]
call dword ptr [ebx + offset(FMyEvent) + offset(TMethod.Code)]

при изменении местоположения поля FMyEvent в декларации класса TMyClass значение offset(FMyEvent) может измениться !


juiceman   (2004-07-04 00:34:00) [9]

[1]
Я возьму адрес метода оттуда, откуда на него будет сделан переход а не заниматься поиском адреса в памяти где хранится поле. Точнее не возьму а взял бы. Это все так, сдоровый интерес. заниматься этим на практике не планирую, хотя если понадобится...


Digitman   (2004-07-03 14:20:00) [10]


> juiceman   (03.07.04 13:47) [4]
> Смещение поля разницы не играет


еще как играет ! спрашивается, откуда ты возьмешь адрес метода, который, если он не nil, будет использован объектом,  возбуждающим событие, для вызова этого метода ? Этот адрес же в классическом случае хранится в одном из приватных или защищенных полей объекта, возбуждающего событие ! Чтобы получть этот адрес (с целью поставить по нему некую "ловушку"), нужно знать где этот адрес объект хранит, в каком из своих полей ... т.е. мало знать адрес объекта, нужно знать еще и смещение поля


juiceman   (2004-07-03 13:47:00) [11]

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


Digitman   (2004-07-03 12:19:00) [12]


> juiceman   (03.07.04 00:16)  


обработчик события "компонента" - это некая процедура
как правило, адрес этой процедуры хранится в некоем приватном поле записи, описывающей объект

сегодня я могу написать так

TMyClass = class(чего-то там)
..
FMyEvent: TSomeMyEvent; // где TSomeMyEvent = procedure(..) of object;
FSomeField: Integer;
..
end;

а завтра мне взбрендит написать иначе

TMyClass = class(чего-то там)
..
FSomeField: Integer;
FMyEvent: TSomeMyEvent; // где TSomeMyEvent = procedure(..) of object;
..
end;

а теперь скажи, каким макаром ты будишь ловить все это, если при каждом моем сиюминутном бзике смещение поля FMyEvent "гуляет" по структуре как мне заблагорассудится ?


juiceman   (2004-07-03 10:24:00) [13]

Да. Чтобы много раз не лазить можно даже байт-код функции запомнить а потом его в памяти находить :) Только будет зависимость от версии компилятора.


Игорь Шевченко   (2004-07-03 00:32:00) [14]

Я вот удивляюсь, что же за задача такая перед тобой стоит - перехватить все и вся ?


> ? Это функция и адрес ее где-то хранится. Вопрос только
> в том как его узнать?


Например, дизассемблером


Наверх

Титульная страница Поиск, карта сайта Написать письмо