Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.15;
Скачать: CL | DM;

Вниз

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

 
juiceman   (2004-07-03 00:16) [0]

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


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

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


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


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


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

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


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


> 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 13:47) [4]

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


 
Digitman ©   (2004-07-03 14:20) [5]


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


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


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

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


 
Digitman ©   (2004-07-05 09:19) [7]


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


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

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

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) может измениться !


 
Polevi ©   (2004-07-05 09:38) [8]

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


 
Digitman ©   (2004-07-05 09:56) [9]


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


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


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

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


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

Polevi ©   (05.07.04 10:37)


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


SetProcessorInstructionHookEx


 
Polevi ©   (2004-07-05 18:49) [12]

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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.08.15;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.021 c
3-1090440083
chirchik
2004-07-22 00:01
2004.08.15
установка курсора на последнюю запись


1-1091159228
Zak3D[@Tm]
2004-07-30 07:47
2004.08.15
Сократить размер приложения


1-1091009955
Slaga
2004-07-28 14:19
2004.08.15
Как передать параметр в CMD


8-1085705549
MicroMozg
2004-05-28 04:52
2004.08.15
Плагины от Winamp а.


4-1088779601
parovoZZ
2004-07-02 18:46
2004.08.15
WM_PAINT?